自定義View動畫


最近看到幾篇自定義View和動畫效果的文章,于是想自己抽幾個練練手放吩,主要是鞏固和分析一下智听,加深自定義view和viewgroup流程。

58同城頁面加載動畫:



一.分析

需求如上圖渡紫。先觀察一下到推,這個動畫可以分為三部分:第一部分是三角形,圓形和矩形在做同樣一個平移動畫惕澎,第二部分是做縮放動畫的陰影莉测,第三是不動的文字部分。

這個效果有很多種實現(xiàn)方式集灌,今天主要研究自定義VIEW怎么去實現(xiàn)主體部分的動畫悔雹。

動畫的主體部分是這個一直在變形狀并上下平移的部分复哆,先不管陰影和文字。仔細觀察腌零,這部分一直在做同一組動畫梯找,那么我們只需要在動畫的某個臨界點改變它的形狀即可,再深入一點益涧,如果用自定view 锈锤,只需要在這個臨界點重新draw一個形狀即可,即調用invalidate()闲询,在onDraw()里面判斷畫圓形久免,三角形還是矩形。

在這里扭弧,我們將三角形阎姥,圓形和矩形看成同一個view,這個view平移到底部后然后彈回去時改變了形狀然后重復這一過程。作者在這兒采用的是屬性動畫ObjectAnimation去實現(xiàn)的平移鸽捻,只需要作出向下平移的這段動畫即可呼巴,彈回去這段可以調用setRepeatMode(ObjectAnimator.REVERSE)讓其重復時反向即可,臨界點的操作可以到AnimatorListener里面去做御蒲。

二.主要代碼部分

1.自定義一個View,先畫出圖形衣赶,設置枚舉狀態(tài)

private Paint paint=newPaint(Paint.ANTI_ALIAS_FLAG);//到構造方法初始化,此處省略

private int width;

private float height;

private boolean isFirst=true;//第一次invalidate()

private int radius;//圓半徑

private int mcount=1;//累加動畫重復次數

privateViewShapemshape=ViewShape.CIRCLE厚满;//默認圓形

@Override

protected voidonSizeChanged(intw, inth, intoldw, intoldh) {

super.onSizeChanged(w,h,oldw,oldh);

width=(float)w;//

height=(float) h;

radius=width/20;

doAnimation();//動畫

}

//繪制

@Override

protected voidonDraw(Canvas canvas) {

super.onDraw(canvas);

if(mshape==ViewShape.CIRCLE) {//圓形

paint.setColor(Color.BLUE);

canvas.drawCircle(width/2,height/4,radius,paint);

}else if(mshape==ViewShape.TRIANGLE){//三角形府瞄,用Path繪制,需要計算坐標

paint.setColor(Color.GREEN);

Path path=newPath();

path.moveTo(width/2,height/4-radius);

path.lineTo(width/2-radius,height/4+radius);

path.lineTo(width/2+radius,height/4+radius);

canvas.drawPath(path,paint);

}else{//矩形

paint.setColor(Color.RED);

canvas.drawRect(width/2-radius,height/4-radius,width/2+radius,height/4+radius,paint);

}}

//列出枚舉

public enum ViewShape{

CIRCLE,RANGE,TRIANGLE

}

2.動畫效果碘箍,以及設置監(jiān)聽去改變枚舉狀態(tài)

private void doAnimation(){

ObjectAnimator anim=ObjectAnimator.ofFloat(this,"translationY",0f,height-height/3);

anim.setInterpolator(newAccelerateInterpolator());

anim.setDuration(800);

anim.setRepeatMode(ObjectAnimator.REVERSE);

anim.setRepeatCount(ObjectAnimator.INFINITE);

anim.start();

anim.addListener(newAnimator.AnimatorListener() {

@Override

public voidonAnimationRepeat(Animator animation) {//只需要在重復監(jiān)聽里操作即可

if(isFirst){

isFirst=false;

}else{

if(mcount%2==0){//判斷彈上去的時候遵馆,圖形并沒有發(fā)生變化

if(mshape==ViewShape.CIRCLE){//改變枚舉狀態(tài)

mshape=ViewShape.TRIANGLE;

}else if(mshape==ViewShape.TRIANGLE){

mshape=ViewShape.RANGE;

}else{

mshape=ViewShape.CIRCLE;

}

}

}

mcount++;//累加用于判斷

invalidate();

}

});

}

這里我調用控件時設置的控件寬高均為matchParent,效果如下



The end

ok敲街,今天實現(xiàn)的效果就到這里团搞,關于陰影部分:可以看到它在view下落的時候縮小,彈回去變大多艇,實現(xiàn)思路基本差不多。這樣寫完還不能用像吻,需要進一步的去做屏幕適配和性能優(yōu)化峻黍,但是大概的流程我們已經清楚了。

關于一些思考問題:1.onDraw()的canvas在調用invalidate()之后和原來相比并不是同一個拨匆,原因在哪?

2.view的繪制流程姆涩,onSizeChanged()

哈哈,發(fā)現(xiàn)問題請多反饋惭每。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末骨饿,一起剝皮案震驚了整個濱河市亏栈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌宏赘,老刑警劉巖绒北,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異察署,居然都是意外死亡闷游,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門贴汪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來脐往,“玉大人,你說我怎么就攤上這事扳埂∫挡荆” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵阳懂,是天一觀的道長辖源。 經常有香客問我,道長希太,這世上最難降的妖魔是什么克饶? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮誊辉,結果婚禮上嗦嗡,老公的妹妹穿的比我還像新娘棒呛。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布膛壹。 她就那樣靜靜地躺著,像睡著了一般皂股。 火紅的嫁衣襯著肌膚如雪荷辕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天坑傅,我揣著相機與錄音僵驰,去河邊找鬼。 笑死唁毒,一個胖子當著我的面吹牛蒜茴,可吹牛的內容都是我干的。 我是一名探鬼主播浆西,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼粉私,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了近零?” 一聲冷哼從身側響起诺核,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤抄肖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后窖杀,有當地人在樹林里發(fā)現(xiàn)了一具尸體漓摩,經...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年陈瘦,在試婚紗的時候發(fā)現(xiàn)自己被綠了幌甘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡痊项,死狀恐怖锅风,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情鞍泉,我是刑警寧澤皱埠,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站咖驮,受9級特大地震影響边器,放射性物質發(fā)生泄漏。R本人自食惡果不足惜托修,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一忘巧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧睦刃,春花似錦砚嘴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至兴泥,卻和暖如春工育,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背搓彻。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工如绸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人好唯。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓竭沫,卻偏偏與公主長得像,于是被迫代替她去往敵國和親骑篙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內容