屬性動(dòng)畫 - 58同城數(shù)據(jù)加載動(dòng)畫

1.概述


其實(shí)越是形勢不好的時(shí)候越是要練習(xí)內(nèi)功,我們學(xué)會(huì)思考很重要,技術(shù)也只是技術(shù)而已钾虐。話不多說看看今天的效果:

58同城數(shù)據(jù)加載

2.效果實(shí)現(xiàn)


2.1 布局分析

可以看到上圖可分為三部分,最上面是彈跳的幾何形狀圖形妆艘,中間是陰影指示器,最下面是文字看幼,所以布局用LinearLayout批旺,最上面暫且放ImageView,中間陰影放ImageView , 最下面放玩命加載文字诵姜。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:orientation="vertical">

    <ImageView
        android:id="@+id/shapeLoadingView"
        android:layout_width="24dp"
        android:layout_height="24dp"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="4dp" />

    <ImageView
        android:id="@+id/indication"
        android:layout_width="23dp"
        android:layout_height="3dp"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="82dp"
        android:src="@drawable/shadow" />

    <TextView
        android:id="@+id/promptTV"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/indication"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="18dp"
        android:text="玩命加載中..."
        android:textColor="#757575"
        android:textSize="14sp" />
</LinearLayout>

2.2 組合控件 LoadingView 繼承自 LinearLayout

public class LoadingView extends LinearLayout{
    private ImageView mShapeLodingView,mIndicationView;
    private Context mContext;
    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);
        this.mContext = context;
        initLayout();
    }

    private void initLayout() {
        View.inflate(mContext, R.layout.load_view,this);
        mShapeLodingView = (ShapeLoadingView) findViewById(R.id.shapeLoadingView);
        mIndicationView = (ImageView) findViewById(R.id.indication);
    }
}

2.3 動(dòng)畫分析

這里可以看做兩個(gè)部分的動(dòng)畫汽煮,一個(gè)是上面幾何圖形的下落上拋動(dòng)畫,一個(gè)是中間陰影指示器放大縮小的動(dòng)畫棚唆,如果能這樣組合就算實(shí)現(xiàn)了: 當(dāng)幾何圖形下落時(shí)配合陰影放大暇赤,當(dāng)幾何圖形上拋時(shí)配合中間陰影縮小。需要用到 ObjectAnimator 屬性動(dòng)畫

 //初始化下落動(dòng)畫
 private void initFreeFallAnimation() {
        // 下落動(dòng)畫集合
        mFreeFallAnimatiorSet  = new AnimatorSet();
        // 幾何圖形的垂直位移動(dòng)畫
        ObjectAnimator freeFallTranslationAnimator = ObjectAnimator.ofFloat(
                mShapeLodingView, "translationY", 0, mTranslationYDistance);
        // 定義動(dòng)畫的變化率宵凌。
        freeFallTranslationAnimator.setInterpolator(new AccelerateInterpolator(factor));
        // 中間陰影縮小動(dòng)畫
        ObjectAnimator scaleIndication = ObjectAnimator.ofFloat(mIndicationView,
                "scaleX", 1, 0.2f);

        mFreeFallAnimatiorSet.setDuration(ANIMATION_DURATION);
        mFreeFallAnimatiorSet.playTogether(freeFallTranslationAnimator, scaleIndication);

        mFreeFallAnimatiorSet.addListener(new AnimatorListenerAdapter() {
            //設(shè)置動(dòng)畫監(jiān)聽器鞋囊,監(jiān)聽該動(dòng)畫的開始、停止瞎惫、取消溜腐、結(jié)束等狀態(tài),我們往往會(huì)用AnimtorListener適配器類來只實(shí)現(xiàn)我們需要的方法
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                // 下落動(dòng)畫結(jié)束微饥,改變形狀逗扒,然后執(zhí)行上拋動(dòng)畫
                upThrow();
                mShapeLodingView.changeShape();
            }
        });
    }

上拋動(dòng)畫其實(shí)和下落動(dòng)畫差不多,只要在下落動(dòng)畫執(zhí)行完之后啟動(dòng)上拋動(dòng)畫即可欠橘,但是我們需要在下落動(dòng)畫結(jié)束完后改變形狀,最直接的方式便是改變幾何圖像 ImageView 的背景資源即可现恼,但是個(gè)人認(rèn)為這樣不是太好肃续,所以需要自定義幾何形狀 ShapeLoadingView,然后提供一個(gè) changeShape() 的方法叉袍,里面調(diào)用 invalidate()始锚,在 onDraw(Canvas canvas) 中畫對應(yīng)的幾何形狀,具體請看這里 自定義View - 仿 QQ 運(yùn)動(dòng)步數(shù)進(jìn)度效果

最后就剩兩個(gè)旋轉(zhuǎn)的動(dòng)畫了喳逛,我們旋轉(zhuǎn)的動(dòng)畫以及角度問題我們直接從自定義 ShapeLoadingView 中獲取瞧捌,提供一個(gè) getUpThrowRoteAnimation() 方法

/**
* 在ShapeLoadingView的構(gòu)造方法中初始化旋轉(zhuǎn)動(dòng)畫即可
*/
private void initRoteAnimation() {
    mRectRoteAnimation = ObjectAnimator.ofFloat(this,
        "rotation", 0, -120);
    mDefaultRoteAnimation = ObjectAnimator.ofFloat(this,
        "rotation", 0, 180);
}

/**
* 得到當(dāng)前正在上拋時(shí)應(yīng)該旋轉(zhuǎn)的動(dòng)畫
*/
public ObjectAnimator getUpThrowRoteAnimation() {
    switch (mCureentShape){
        case SHAPE_RECT:
            return  mRectRoteAnimation;
        default:
            return mDefaultRoteAnimation;
    }
}

給上拋動(dòng)畫設(shè)置動(dòng)畫監(jiān)聽,在其 onAnimationStart() 中執(zhí)行旋轉(zhuǎn)動(dòng)畫


mUpThrowAnimatiorSet.addListener(new AnimatorListenerAdapter() {
    @Override
    public void onAnimationEnd(Animator animation) {
        super.onAnimationEnd(animation);
        //動(dòng)畫結(jié)束,下落
        freeFall();
    }

    @Override
    public void onAnimationStart(Animator animation) {
        super.onAnimationStart(animation);
        // 動(dòng)畫開始,和旋轉(zhuǎn)動(dòng)畫一起執(zhí)行
        startShapeRoteAnimator();
    }

    /**
    * 執(zhí)行旋轉(zhuǎn)動(dòng)畫
    */
    private void startShapeRoteAnimator() {
        ObjectAnimator roteAnimation  = mShapeLodingView.getUpThrowRoteAnimation();
        roteAnimation.setDuration(ANIMATION_DURATION);
        roteAnimation.setInterpolator(new DecelerateInterpolator(factor));
        roteAnimation.start();
    }
});

2.3 優(yōu)化性能

網(wǎng)上有太多太多的 Demo 感覺都還很不錯(cuò)姐呐,但是后期檢測性能的時(shí)候其實(shí)面臨很多問題殿怜,如果某些效果不是你寫的但是性能比較差的話其實(shí)很難改,要么你特別熟悉別人的代碼要么你需要自己重新寫要么得過且過曙砂。

    /**
     * 采用代碼的方式添加
     *
     * @param parent
     * @return
     */
    public static LoadingView attach(ViewGroup parent) {
        LoadingView loadingView = new LoadingView(parent.getContext());
        loadingView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        parent.addView(loadingView);
        return loadingView;
    }

    /**
     * 優(yōu)化性能
     * @param visibility
     */
    @Override
    public void setVisibility(int visibility) {
        super.setVisibility(View.INVISIBLE);
        ViewGroup parent = (ViewGroup) this.getParent();
        if(parent != null){
            parent.removeView(this);
            mShapeView.clearAnimation();
            mShadowView.clearAnimation();
            this.removeAllViews();
            mStopAnimator = true;
        }
    }

所有分享大綱:Android進(jìn)階之旅 - 自定義View篇

視頻講解地址:http://pan.baidu.com/s/1slFJDOp

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末头谜,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子鸠澈,更是在濱河造成了極大的恐慌柱告,老刑警劉巖,帶你破解...
    沈念sama閱讀 223,126評(píng)論 6 520
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笑陈,死亡現(xiàn)場離奇詭異际度,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)涵妥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,421評(píng)論 3 400
  • 文/潘曉璐 我一進(jìn)店門乖菱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人妹笆,你說我怎么就攤上這事块请。” “怎么了拳缠?”我有些...
    開封第一講書人閱讀 169,941評(píng)論 0 366
  • 文/不壞的土叔 我叫張陵墩新,是天一觀的道長。 經(jīng)常有香客問我窟坐,道長海渊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,294評(píng)論 1 300
  • 正文 為了忘掉前任哲鸳,我火速辦了婚禮臣疑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘徙菠。我一直安慰自己讯沈,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,295評(píng)論 6 398
  • 文/花漫 我一把揭開白布婿奔。 她就那樣靜靜地躺著缺狠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪萍摊。 梳的紋絲不亂的頭發(fā)上挤茄,一...
    開封第一講書人閱讀 52,874評(píng)論 1 314
  • 那天,我揣著相機(jī)與錄音冰木,去河邊找鬼穷劈。 笑死笼恰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的歇终。 我是一名探鬼主播社证,決...
    沈念sama閱讀 41,285評(píng)論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼练湿!你這毒婦竟也來了猴仑?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,249評(píng)論 0 277
  • 序言:老撾萬榮一對情侶失蹤肥哎,失蹤者是張志新(化名)和其女友劉穎辽俗,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體篡诽,經(jīng)...
    沈念sama閱讀 46,760評(píng)論 1 321
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡崖飘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,840評(píng)論 3 343
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了杈女。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片朱浴。...
    茶點(diǎn)故事閱讀 40,973評(píng)論 1 354
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖达椰,靈堂內(nèi)的尸體忽然破棺而出翰蠢,到底是詐尸還是另有隱情,我是刑警寧澤啰劲,帶...
    沈念sama閱讀 36,631評(píng)論 5 351
  • 正文 年R本政府宣布梁沧,位于F島的核電站,受9級(jí)特大地震影響蝇裤,放射性物質(zhì)發(fā)生泄漏廷支。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,315評(píng)論 3 336
  • 文/蒙蒙 一栓辜、第九天 我趴在偏房一處隱蔽的房頂上張望恋拍。 院中可真熱鬧,春花似錦藕甩、人聲如沸施敢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,797評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悯姊。三九已至,卻和暖如春贩毕,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仆嗦。 一陣腳步聲響...
    開封第一講書人閱讀 33,926評(píng)論 1 275
  • 我被黑心中介騙來泰國打工辉阶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,431評(píng)論 3 379
  • 正文 我出身青樓谆甜,卻偏偏與公主長得像垃僚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子规辱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,982評(píng)論 2 361

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

  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果谆棺,實(shí)現(xiàn)這些動(dòng)畫的過程并不復(fù)雜,今天將帶大家一窺ios動(dòng)畫全貌罕袋。在這里你可以看...
    每天刷兩次牙閱讀 8,517評(píng)論 6 30
  • 在iOS中隨處都可以看到絢麗的動(dòng)畫效果改淑,實(shí)現(xiàn)這些動(dòng)畫的過程并不復(fù)雜,今天將帶大家一窺iOS動(dòng)畫全貌浴讯。在這里你可以看...
    F麥子閱讀 5,119評(píng)論 5 13
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,351評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫朵夏、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,131評(píng)論 4 61
  • 文/楓丹白露 電視劇《我的前半生》中的唐晶是職場白骨精的代表饥侵,人們看到了她的干練、堅(jiān)強(qiáng)衣屏。然而躏升,在這個(gè)堅(jiān)強(qiáng)的人設(shè)背后...
    楓丹白露_閱讀 1,969評(píng)論 11 15