给我一个Path,还你一个动画:
最近看到一篇很有意思的文章,只要你能给我一个Path ,我就可以给你一个View。文章地址请移步:【Android】 给我一个Path,还你一个酷炫动画 - zxt0601的博客 - 博客频道 - CSDN.NET
但是当你看到文章后自己就会觉得有点蒙圈,有很多的疑问。
这个Path 怎么来的?
这些字母问路径是怎么获取的呢?
接下来请大家看下如此简单的代码:
没错在自定义View时加上这么一局便可完成这么一个酷炫的路径(未加动画)。
相信如果大家仔细看必然会发现以上的字母并不是原始的字母,它是由很多的直线组成的并不圆滑。
不和大家绕弯子,以下是见证奇迹的时刻:
public classStoreHousePath {
private static finalSparseArraysPointList;
static{
sPointList=newSparseArray();
float[][] LETTERS =new float[][]{
new float[]{
// A
24,0,1,22,
1,22,1,72,
24,0,47,22,
47,22,47,72,
1,48,47,48
},
new float[]{
// B
0,0,0,72,
0,0,37,0,
37,0,47,11,
47,11,47,26,
47,26,38,36,
38,36,0,36,
38,36,47,46,
47,46,47,61,
47,61,38,71,
37,72,0,72,
},
new float[]{
// C
47,0,0,0,
0,0,0,72,
0,72,47,72,
},
new float[]{
// D
0,0,0,72,
0,0,24,0,
24,0,47,22,
47,22,47,48,
47,48,23,72,
23,72,0,72,
},
new float[]{
// E
0,0,0,72,
0,0,47,0,
0,36,37,36,
0,72,47,72,
},
new float[]{
// F
0,0,0,72,
0,0,47,0,
0,36,37,36,
},
new float[]{
// G
47,23,47,0,
47,0,0,0,
0,0,0,72,
0,72,47,72,
47,72,47,48,
47,48,24,48,
},
new float[]{
// H
0,0,0,72,
0,36,47,36,
47,0,47,72,
},
new float[]{
// I
0,0,47,0,
24,0,24,72,
0,72,47,72,
},
new float[]{
// J
47,0,47,72,
47,72,24,72,
24,72,0,48,
},
new float[]{
// K
0,0,0,72,
47,0,3,33,
3,38,47,72,
},
new float[]{
// L
0,0,0,72,
0,72,47,72,
},
new float[]{
// M
0,0,0,72,
0,0,24,23,
24,23,47,0,
47,0,47,72,
},
new float[]{
// N
0,0,0,72,
0,0,47,72,
47,72,47,0,
},
new float[]{
// O
0,0,0,72,
0,72,47,72,
47,72,47,0,
47,0,0,0,
},
new float[]{
// P
0,0,0,72,
0,0,47,0,
47,0,47,36,
47,36,0,36,
},
new float[]{
// Q
0,0,0,72,
0,72,23,72,
23,72,47,48,
47,48,47,0,
47,0,0,0,
24,28,47,71,
},
new float[]{
// R
0,0,0,72,
0,0,47,0,
47,0,47,36,
47,36,0,36,
0,37,47,72,
},
new float[]{
// S
47,0,0,0,
0,0,0,36,
0,36,47,36,
47,36,47,72,
47,72,0,72,
},
new float[]{
// T
0,0,47,0,
24,0,24,72,
},
new float[]{
// U
0,0,0,72,
0,72,47,72,
47,72,47,0,
},
new float[]{
// V
0,0,24,72,
24,72,47,0,
},
new float[]{
// W
0,0,0,72,
0,72,24,49,
24,49,47,72,
47,72,47,0
},
new float[]{
// X
0,0,47,72,
47,0,0,72
},
new float[]{
// Y
0,0,24,23,
47,0,24,23,
24,23,24,72
},
new float[]{
// Z
0,0,47,0,
47,0,0,72,
0,72,47,72
},
};
final float[][] NUMBERS =new float[][]{
new float[]{
// 0
0,0,0,72,
0,72,47,72,
47,72,47,0,
47,0,0,0,
},
new float[]{
// 1
24,0,24,72,
},
new float[]{
// 2
0,0,47,0,
47,0,47,36,
47,36,0,36,
0,36,0,72,
0,72,47,72
},
new float[]{
// 3
0,0,47,0,
47,0,47,36,
47,36,0,36,
47,36,47,72,
47,72,0,72,
},
new float[]{
// 4
0,0,0,36,
0,36,47,36,
47,0,47,72,
},
new float[]{
// 5
0,0,0,36,
0,36,47,36,
47,36,47,72,
47,72,0,72,
0,0,47,0
},
new float[]{
// 6
0,0,0,72,
0,72,47,72,
47,72,47,36,
47,36,0,36
},
new float[]{
// 7
0,0,47,0,
47,0,47,72
},
new float[]{
// 8
0,0,0,72,
0,72,47,72,
47,72,47,0,
47,0,0,0,
0,36,47,36
},
new float[]{
// 9
47,0,0,0,
0,0,0,36,
0,36,47,36,
47,0,47,72,
}
};
// A - Z
for(inti =0;i < LETTERS.length;i++) {
sPointList.append(i +65,LETTERS[i]);
}
// a - z
for(inti =0;i < LETTERS.length;i++) {
sPointList.append(i +65+32,LETTERS[i]);
}
// 0 - 9
for(inti =0;i < NUMBERS.length;i++) {
sPointList.append(i +48,NUMBERS[i]);
}
// blank
addChar(' ', new float[]{});
// -
addChar('-', new float[]{
0,36,47,36
});
// .
addChar('.', new float[]{
24,60,24,72
});
}
public static voidaddChar(charc, float[] points) {
sPointList.append(c,points);
}
public staticArrayListgetPath(String str) {
returngetPath(str,1,14);
}
/**
*@paramstr
*@paramscale
*@paramgapBetweenLetter
*@returnArrayList of float[] {x1, y1, x2, y2}
*/
public staticArrayListgetPath(String str, floatscale, intgapBetweenLetter) {
ArrayList list =newArrayList();
floatoffsetForWidth =0;
for(inti =0;i < str.length();i++) {
intpos = str.charAt(i);
intkey =sPointList.indexOfKey(pos);
if(key == -1) {
continue;
}
float[] points =sPointList.get(pos);
intpointCount = points.length/4;
for(intj =0;j < pointCount;j++) {
float[] line =new float[4];
for(intk =0;k <4;k++) {
floatl = points[j *4+ k];
// x
if(k %2==0) {
line[k] = (l + offsetForWidth) * scale;
}
// y
else{
line[k] = l * scale;
}
}
list.add(line);
}
offsetForWidth +=57+ gapBetweenLetter;
}
returnlist;
}
}
其实最重要的时 实例化好的float[][] LETTERS,这个数组将我们的字母进行了点阵处理。
说白了汉字也是完全可以的,只不过汉字的点整就不止3*3 或者4*4 了(可以使用点阵生成器)。
以上原来就是令我深深折服的地方。