自定義 View 實現(xiàn)小球撞擊數(shù)據(jù)加載效果

前言:剛開始是假裝堅強帆赢,后來就真的堅強了∨樽螅——楊絳匿醒。

承接上一篇自定義 View 屬性動畫,本篇實現(xiàn)一個類似“小球”撞擊效果缠导,可以作為數(shù)據(jù)加載頁面來使用廉羔。其實這個效果在某些 App 里面看到過,只不過忘記在哪看到的了僻造。
好了憋他,先看一下實現(xiàn)效果圖:

image

看到這種效果,就像是真空中的小球一直在發(fā)生碰撞一樣髓削,這種方式該如何去做呢竹挡?其實有很多種方式去實現(xiàn),但是最簡單的方式還是使用屬性動畫來實現(xiàn):
使用屬性動畫實現(xiàn)應(yīng)該有最基本的四步:

  • 1)立膛、繪制圓形小球
  • 2)揪罕、讓圓形小球動起來
  • 3)、根據(jù)三個圓形的變化規(guī)律宝泵,改變小球顏色
  • 4)好啰、優(yōu)化

1、繪制圓球

對于小球儿奶,也有不同的方式去繪制框往。可以直接畫一個 shape 圖形闯捎,也可以自定義 View 進行繪制椰弊,這里選用后者,因為后者相對靈活一點瓤鼻。
自定義 View 進行繪制圓形:

public class CircularView extends View {

    private int Color;
    private Paint mPaint;

    public void setColor(int color) {
        this.Color = color;
        mPaint.setColor(Color);
        invalidate();
    }

    public int getColor() {
        return Color;
    }

    public CircularView(Context context) {
        this(context,null);
    }

    public CircularView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public CircularView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mPaint = new Paint();
        mPaint.setAntiAlias(true);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        float cx = getWidth()/2;
        canvas.drawCircle(cx,cx,cx,mPaint);
    }

}

在 OnDraw 中秉版,直接使用 canvas 畫了一個圓,然后提供 setColor 方法娱仔,并重繪沐飘。這樣就能實現(xiàn)創(chuàng)建任意顏色的小圓了。

public class LoadingView extends RelativeLayout {

    private CircularView mLeftCircularView;
    private CircularView mCenterCircularView;
    private CircularView mRightCircularView;

    public LoadingView(Context context) {
        this(context,null);
    }

    public LoadingView(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }

    public LoadingView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }

    private void init(Context context) {
        mLeftCircularView = createCircularView(context);
        mLeftCircularView.setColor(Color.RED);

        mRightCircularView = createCircularView(context);
        mRightCircularView.setColor(Color.BLUE);

        mCenterCircularView = createCircularView(context);
        mCenterCircularView.setColor(Color.GREEN);

        addView(mLeftCircularView);
        addView(mRightCircularView);
        //后添加在上面,表示中間的小圓
        addView(mCenterCircularView);

        /**---------  開啟動畫  ---------**/
        post(new Runnable() {
            @Override
            public void run() {
                startOutAnimation();
            }
        });
    }

    /**
     * 開啟往外移動的動畫
     */
    private void startOutAnimation() {
        //左邊小圓左移動畫
        ObjectAnimator outObjectAnimator = ObjectAnimator.ofFloat();
        //右邊小圓右移動畫

    }

    /**
     * 開啟往內(nèi)移動的動畫
     */
    private void startInnerAnimation() {

    }

    /**
     * 統(tǒng)一創(chuàng)建小圓
     * @param context
     * @return
     */
    private CircularView createCircularView(Context context) {
        CircularView circularView = new CircularView(context);
        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(dip2px(10),dip2px(10));
        params.addRule(CENTER_IN_PARENT);
        circularView.setLayoutParams(params);
        return circularView;
    }

    private int dip2px(int dip) {
        return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dip,getResources().getDisplayMetrics());
    }
}

這里創(chuàng)建一個 LoadingView 繼承自 RelativeLayout耐朴,當(dāng)然繼承自 FrameLayout 也是可以的借卧。
在初識化的時候,創(chuàng)建了三個 CircularView 設(shè)置其顏色并添加到 LoadingView 中筛峭,注意由于繼承了 RelativeLayout铐刘,所以添加順序是有講究的,中間的小圓讓它在最上面影晓,左右小圓在下面镰吵。此時運行程序:

image

注意上面三個小球是重疊起來的。


2挂签、讓圓形小球動起來

該節(jié)內(nèi)容就是使用屬性動畫讓小圓球進行移動了疤祭。
還是先看代碼:

/**
 * 開啟往外移動的動畫
 */
private void startOutAnimation() {
    //左邊小圓左移動畫
    ObjectAnimator outLeftObjectAnimator = ObjectAnimator.ofFloat(mLeftCircularView,"TranslationX",0f,-translationDis);
    //右邊小圓右移動畫
    ObjectAnimator outRightObjectAnimator = ObjectAnimator.ofFloat(mRightCircularView,"TranslationX",0f,translationDis);

    AnimatorSet animatorSet = new AnimatorSet();
    animatorSet.setDuration(DURATION);
    animatorSet.setInterpolator(new DecelerateInterpolator(2f));
    animatorSet.playTogether(outLeftObjectAnimator,outRightObjectAnimator);

    animatorSet.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
            //動畫結(jié)束,開啟往內(nèi)移動的動畫
            startInnerAnimation();
        }
    });
    animatorSet.start();
}

/**
 * 開啟往內(nèi)移動的動畫
 */
private void startInnerAnimation() {

    //左邊小圓右移動畫
    ObjectAnimator innerLeftObjectAnimator = ObjectAnimator.ofFloat(mLeftCircularView,"TranslationX",-translationDis,0f);
    //右邊小圓左移動畫
    ObjectAnimator innerRightObjectAnimator = ObjectAnimator.ofFloat(mRightCircularView,"TranslationX",translationDis,0f);

    AnimatorSet animatorSet = new AnimatorSet();
    animatorSet.setDuration(DURATION);
    animatorSet.setInterpolator(new AccelerateInterpolator());
    animatorSet.playTogether(innerLeftObjectAnimator,innerRightObjectAnimator);

    animatorSet.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
            //動畫結(jié)束饵婆,開啟往內(nèi)移動的動畫
            startOutAnimation();
        }
    });
    animatorSet.start();
}

發(fā)現(xiàn)是左邊小圓往左側(cè)移動勺馆,中間小圓不變化,右邊小圓往右移動侨核。都是屬性動畫最基本的用法草穆,而且上一篇也做了很詳細的解釋,這里應(yīng)該沒問任何問題搓译。運行程序:


image

此時已經(jīng)完成了小球動態(tài)改變效果悲柱,但是在回彈的時候是需要改變小球顏色的。


3些己、4豌鸡、改變小球的顏色,最后的優(yōu)化

1段标、改變小球顏色

看一下文章開頭直颅,改變規(guī)律如下:
左邊小球顏色—>中間小球顏色—>右邊小球顏色—>左邊小球顏色
按照上面這個規(guī)律代碼如下:

    animatorSet.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
            //動畫結(jié)束,開啟往外移動的動畫
            startOutAnimation();

            //改變小球顏色
            //左邊小球顏色—>中間小球顏色—>右邊小球顏色—>左邊小球顏色
            int mLeftCircularViewColor = mLeftCircularView.getColor();
            int mCenterCircularViewColor = mCenterCircularView.getColor();
            int mRightCircularViewColor = mRightCircularView.getColor();

            mCenterCircularView.setColor(mLeftCircularViewColor);
            mRightCircularView.setColor(mCenterCircularViewColor);
            mLeftCircularView.setColor(mRightCircularViewColor);
        }
    });

監(jiān)聽在 startInnerAnimation怀樟,也即動畫內(nèi)移結(jié)束的時候開始改變球的顏色。

2盆佣、一點點優(yōu)化

這里內(nèi)容跟上文是一樣的往堡,直接把代碼貼在下面了:

image

運行程序:

image

最后呈現(xiàn)一張動圖送給你們


image
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市共耍,隨后出現(xiàn)的幾起案子虑灰,更是在濱河造成了極大的恐慌,老刑警劉巖痹兜,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件穆咐,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機对湃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進店門崖叫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拍柒,你說我怎么就攤上這事心傀。” “怎么了拆讯?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵脂男,是天一觀的道長。 經(jīng)常有香客問我种呐,道長宰翅,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任爽室,我火速辦了婚禮汁讼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肮之。我一直安慰自己掉缺,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布戈擒。 她就那樣靜靜地躺著眶明,像睡著了一般。 火紅的嫁衣襯著肌膚如雪筐高。 梳的紋絲不亂的頭發(fā)上搜囱,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機與錄音柑土,去河邊找鬼蜀肘。 笑死,一個胖子當(dāng)著我的面吹牛稽屏,可吹牛的內(nèi)容都是我干的扮宠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼狐榔,長吁一口氣:“原來是場噩夢啊……” “哼坛增!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起薄腻,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤收捣,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后庵楷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體罢艾,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡楣颠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了咐蚯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片童漩。...
    茶點故事閱讀 39,703評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖仓蛆,靈堂內(nèi)的尸體忽然破棺而出睁冬,到底是詐尸還是另有隱情,我是刑警寧澤看疙,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布豆拨,位于F島的核電站,受9級特大地震影響能庆,放射性物質(zhì)發(fā)生泄漏施禾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一搁胆、第九天 我趴在偏房一處隱蔽的房頂上張望弥搞。 院中可真熱鬧,春花似錦渠旁、人聲如沸攀例。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽粤铭。三九已至,卻和暖如春杂靶,著一層夾襖步出監(jiān)牢的瞬間梆惯,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工吗垮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留垛吗,地道東北人。 一個月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓烁登,卻偏偏與公主長得像怯屉,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子饵沧,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,601評論 2 353