解析:給我一個Path,還你一個動畫

給我一個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 了(可以使用點陣生成器)。

以上原來就是令我深深折服的地方。

下面是GitDemo:GitHub - VampireCarrot/CustomView: 自定義View由菜鳥到大神

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • **2014真題Directions:Read the following text. Choose the be...
    又是夜半驚坐起閱讀 9,828評論 0 23
  • 睜開雙眼 眸子里透出的永遠是無法捉摸的訊息 走了好久都沒有追上黑夜的影子 等待著黎明的曙光驅趕走黑色的夢魘 奈何橋...
    灰色朦朧閱讀 194評論 0 0
  • 在Manncoffee 隔著一排座位的沙發上 坐著一個女孩 好像你 短的發 像你 白的面龐 像你 走過像輕盈的風 ...
    nxxs閱讀 419評論 0 2
  • 我看著表上的時間 十二個鐘頭代表十二件該做的事 第一件事是找到筆墨 第二件事是準備信紙 第三件事要書寫情書 第四件...
    墨名莫笑閱讀 224評論 0 0