自定義View+Animation仿真實(shí)現(xiàn)小球自由落體+彈跳效果

昨天在郭神的公眾號(hào)推送里看到了一篇關(guān)于小球自由落體動(dòng)畫加載控件的文章推送,就琢磨著班門弄斧做一個(gè)小球自由落體動(dòng)畫丰嘉,適合剛接觸自定義View和動(dòng)畫的童鞋學(xué)習(xí)夯到。


1.知識(shí)儲(chǔ)備

1.1自定義View

我們知道自定義View主要涉及兩個(gè)過(guò)程,測(cè)量和繪制饮亏,也就是簡(jiǎn)單地重寫onMeasure()(不過(guò)只需要在寬高設(shè)定為wrap-content時(shí)重寫)和onDraw()方法耍贾,接下來(lái)就自由發(fā)揮畫出自己想要的效果,詳細(xì)的方法可以參照我的初探自定義View(一)初探自定義View(二)路幸。

1.2自定義動(dòng)畫

自定義動(dòng)畫涉及的方法也是主要就兩個(gè):

1.2.1applyTransformation(float interpolatedTime, Transformation t)

這個(gè)方法是自定義動(dòng)畫的核心方法荐开,定義了動(dòng)畫進(jìn)行的整個(gè)過(guò)程。第一個(gè)參數(shù)interpolatedTime是插值器的時(shí)間因子(可以理解成物理中的加速度)简肴,決定了這個(gè)動(dòng)畫從開(kāi)始到結(jié)束完成過(guò)程中的加速度晃听,第二個(gè)參數(shù)Transformation是矩陣的封裝類,一般使用這個(gè)類來(lái)獲得當(dāng)前的矩陣對(duì)象(當(dāng)前操作的View),然后對(duì)該對(duì)象進(jìn)行操作就能實(shí)現(xiàn)各種動(dòng)畫效果。

1.2.2initialize(int width, int height, int parentWidth, int parentHeight)

這個(gè)方法主要是通過(guò)覆寫父類的initialize()來(lái)進(jìn)行一些初始化工作。

2.實(shí)現(xiàn)過(guò)程

2.1小球的繪制

public void init(){
        //初始化
        mCirclePaint=new Paint();
        mCirclePaint.setColor(Color.RED);
        mCirclePaint.setStyle(Paint.Style.FILL);
    }
    //繪制
    public void onDraw(Canvas canvas){
        super.onDraw(canvas);
        canvas.drawCircle(x,y,r,mCirclePaint);
    }

    @Override
    protected void onSizeChanged(int w,int h,int oldW,int oldH){
        super.onSizeChanged(w,h,oldW,oldH);
        length = w;  //這里的w指的是在xml文件中設(shè)定的寬度width的值
        //確定圓心坐標(biāo)和半徑
        x = length/2;
        y = length/8;
        r = (float) (length*0.5/8);
    }

添加到布局文件中:

    <com.example.animation.Ball
        android:id="@+id/ball"
        android:layout_width="400dp"
        android:layout_height="400dp" />

經(jīng)過(guò)上述過(guò)程小球就畫好了能扒,如圖:

小球

2.2動(dòng)畫效果的實(shí)現(xiàn)

public class OpenGL extends Animation {

    @Override
    public void initialize(int width, int height, int parentWidth, int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
        setDuration(2000);// 設(shè)置默認(rèn)時(shí)長(zhǎng)
        setFillAfter(true);// 動(dòng)畫結(jié)束后保留狀態(tài)
        setInterpolator(new BounceInterpolator());// 設(shè)置插值器
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        final Matrix matrix = t.getMatrix();
        matrix.preTranslate(0,700 * interpolatedTime);
    }
}

首先覆寫父類的initialize()方法進(jìn)行初始化setInterpolator(new BounceInterpolator());這個(gè)方法是這個(gè)實(shí)現(xiàn)自由落體效果的關(guān)鍵佣渴,BounceInterpolator這個(gè)插值器的取值為0-1,而且從0變到1的速度越來(lái)越快赫粥,可以理解成物理場(chǎng)景中的勻加速運(yùn)動(dòng),而且在結(jié)束后還有一個(gè)彈跳的效果予借。
更多插值器效果
matrix.preTranslate(0,1000 * interpolatedTime);這個(gè)可以理解成View的實(shí)時(shí)坐標(biāo)(x,y)越平,注意這里的x其實(shí)是Δx,表示View在移動(dòng)前的坐標(biāo)和移動(dòng)過(guò)程中的差值,0就代表這是一個(gè)豎直方向上的運(yùn)動(dòng)灵迫。

final OpenGL open=new OpenGL();
        ball.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ball.startAnimation(open);
            }
        });

最后調(diào)用這個(gè)動(dòng)畫類的實(shí)例就能實(shí)現(xiàn)這一效果:

動(dòng)畫效果

源碼

Github

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末秦叛,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子瀑粥,更是在濱河造成了極大的恐慌挣跋,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,348評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狞换,死亡現(xiàn)場(chǎng)離奇詭異避咆,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)修噪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門查库,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人黄琼,你說(shuō)我怎么就攤上這事樊销。” “怎么了脏款?”我有些...
    開(kāi)封第一講書人閱讀 156,936評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵围苫,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我撤师,道長(zhǎng)剂府,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,427評(píng)論 1 283
  • 正文 為了忘掉前任剃盾,我火速辦了婚禮周循,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘万俗。我一直安慰自己湾笛,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,467評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布闰歪。 她就那樣靜靜地躺著嚎研,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上临扮,一...
    開(kāi)封第一講書人閱讀 49,785評(píng)論 1 290
  • 那天论矾,我揣著相機(jī)與錄音,去河邊找鬼杆勇。 笑死贪壳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的蚜退。 我是一名探鬼主播闰靴,決...
    沈念sama閱讀 38,931評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼钻注!你這毒婦竟也來(lái)了蚂且?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,696評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤幅恋,失蹤者是張志新(化名)和其女友劉穎杏死,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體捆交,經(jīng)...
    沈念sama閱讀 44,141評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡淑翼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,483評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了品追。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窒舟。...
    茶點(diǎn)故事閱讀 38,625評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖诵盼,靈堂內(nèi)的尸體忽然破棺而出惠豺,到底是詐尸還是另有隱情,我是刑警寧澤风宁,帶...
    沈念sama閱讀 34,291評(píng)論 4 329
  • 正文 年R本政府宣布洁墙,位于F島的核電站,受9級(jí)特大地震影響戒财,放射性物質(zhì)發(fā)生泄漏热监。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,892評(píng)論 3 312
  • 文/蒙蒙 一饮寞、第九天 我趴在偏房一處隱蔽的房頂上張望孝扛。 院中可真熱鬧,春花似錦幽崩、人聲如沸苦始。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)陌选。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間咨油,已是汗流浹背您炉。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留役电,地道東北人赚爵。 一個(gè)月前我還...
    沈念sama閱讀 46,324評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像法瑟,于是被迫代替她去往敵國(guó)和親冀膝。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,492評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容