Android的學(xué)習(xí)與實踐7(旋轉(zhuǎn)和移動動畫的實現(xiàn))

1.收獲

今天我們寫了兩個demo,這兩個demo雖然不難修陡,但是也是需要我們理解的硫麻,并不是簡單我們就能夠?qū)懙膩淼芏希苍S并不是這樣的洒敏,當(dāng)我下來自己背著寫的時候才知道有的地方?jīng)]有理解龄恋,是寫不下去的。盡管自己在學(xué)的時候思路清晰桐玻,但是這并不代表你自己單獨寫的時候也是思路清晰的篙挽。所以自己還要多理解,多去寫幾遍镊靴,也許只有這樣才能在碰到相同的東西的時候铣卡,才有自己的思路和想法。

2.技術(shù)

(1)xml文件通用部分代碼的優(yōu)化
(2)平移和旋轉(zhuǎn)動畫和屬性動畫
(3)AnimationSet集合
(4)延長在容器中的控件執(zhí)行時間

3.技術(shù)的實踐和應(yīng)用

(1)xml文件通用部分代碼的優(yōu)化
當(dāng)我們在xml中配置一些圖片的時候偏竟,有時候會出現(xiàn)在配置的許多圖片的代碼中很多的屬性是一樣的煮落,那么我們?yōu)榱藘?yōu)化代碼,就可以將這些相同部分用一個xml文件裝起來踊谋。

例如:

 <ImageButton
        android:id="@+id/ib_b"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@null"
        android:layout_centerInParent="true"
        android:src="@drawable/b" />
    <ImageButton
        android:id="@+id/ib_c"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@null"
        android:layout_centerInParent="true"
        android:src="@drawable/c" />
    <ImageButton
        android:id="@+id/ib_d"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@null"
        android:layout_centerInParent="true"
        android:src="@drawable/d" />
    <ImageButton
        android:id="@+id/ib_e"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@null"
        android:layout_centerInParent="true"
        android:src="@drawable/e" />
    <ImageButton
        android:id="@+id/ib_f"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@null"
        android:layout_centerInParent="true"
        android:src="@drawable/f" />
    <ImageButton
        android:id="@+id/ib_g"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@null"
        android:layout_centerInParent="true"
        android:src="@drawable/g" />
    <ImageButton
        android:id="@+id/ib_a"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@null"
        android:layout_centerInParent="true"
        android:src="@drawable/a" />

在此段代碼中明顯有7個控件蝉仇,在這7個空鍵的代碼中,有一部分代碼是相通的

 android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@null"
        android:layout_centerInParent="true"

于是我們就要優(yōu)化一下代碼
首先我們新建一個文件來裝這相同的屬性的代碼,當(dāng)遇到是我們直接調(diào)用這個文件就可以了


image.png

然后在這個文件中進行添加形同屬性的代碼


image.png

優(yōu)化后的代碼量:

 <ImageButton
        android:id="@+id/ib_b"
        style="@style/ManuBottonStyle"
        android:src="@drawable/b" />
    <ImageButton
        android:id="@+id/ib_c"
        style="@style/ManuBottonStyle"
        android:src="@drawable/c" />
    <ImageButton
        android:id="@+id/ib_d"
        style="@style/ManuBottonStyle"
        android:src="@drawable/d" />
    <ImageButton
        android:id="@+id/ib_e"
        style="@style/ManuBottonStyle"
        android:src="@drawable/e" />
    <ImageButton
        android:id="@+id/ib_f"
        style="@style/ManuBottonStyle"
        android:src="@drawable/f" />
    <ImageButton
        android:id="@+id/ib_g"
        style="@style/ManuBottonStyle"
        android:src="@drawable/g" />
    <ImageButton
        android:id="@+id/ib_a"
        style="@style/ManuBottonStyle"
        android:src="@drawable/a" />

(2)平移和旋轉(zhuǎn)動畫和屬性動畫

 //移動的動畫
        TranslateAnimation tAnim=new TranslateAnimation(0,x,0,y);
        tAnim.setDuration(500);
        tAnim.setFillAfter(true);
        tAnim.setInterpolator(new BounceInterpolator());
  //旋轉(zhuǎn)動畫
        RotateAnimation rotateAnimation=new RotateAnimation(0,3*360,ib.getPivotX(),ib.getPivotY());
        rotateAnimation.setDuration(500);
        rotateAnimation.setFillAfter(true);

上面的旋轉(zhuǎn)和移動動畫是補間動畫轿衔,他的性質(zhì)并沒有改變沉迹,只是在我們的視覺上發(fā)生了改變。

//移動
    public void test4(){
        ObjectAnimator transAni=ObjectAnimator.ofFloat(v,"translationX",v.getTranslationX()+100);
        transAni.setDuration(1000);
        transAni.start();
    }
//旋轉(zhuǎn)
    public void test2(){
        ObjectAnimator rotatetion=ObjectAnimator.ofFloat(v,"rotation",0,360);
        rotatetion.setDuration(2000);
        rotatetion.start();
    }

上面的旋轉(zhuǎn)和移動動畫是補間動畫害驹,他的性質(zhì)并沒有改變鞭呕,只是在我們的視覺上發(fā)生了改變。
補間動畫(Animation):只是視覺上的效果宛官,并沒改變他的屬性葫松,意思就是在表面上是改變了,但是他還是在原來的位置上底洗,只是在我們的視覺上發(fā)生了改變腋么。
屬性動畫(Animator):剛好與補間動畫不同,發(fā)生改變后亥揖,就是改變后屬性珊擂,真正從屬性上發(fā)生了改變。
在我們的應(yīng)用中很少用補間動畫徐块。


image.png

屬性動畫的使用


image.png

(3)AnimationSet集合
有時候想要兩個動畫一起執(zhí)行未玻,那麼我們就可以用一個東西將這兩個動畫裝起來,而這個東西就像是一個容器胡控。

image.png

image.png

(4)延長在容器中的控件執(zhí)行時間
在動畫中扳剿,我想要有的動畫有時間差的動畫,我們我們需要將動畫延時執(zhí)行昼激。那麼我們利用者個控件在某個容器中的性質(zhì)來進行延時
image.png

4.今日demo

1.菜單動畫
效果:

錄制_2019_09_23_23_21_37_506.gif

1.添加圖片控件

<ImageButton
        android:id="@+id/ib_b"
        style="@style/ManuBottonStyle"
        android:src="@drawable/b" />
    <ImageButton
        android:id="@+id/ib_c"
        style="@style/ManuBottonStyle"
        android:src="@drawable/c" />
    <ImageButton
        android:id="@+id/ib_d"
        style="@style/ManuBottonStyle"
        android:src="@drawable/d" />
    <ImageButton
        android:id="@+id/ib_e"
        style="@style/ManuBottonStyle"
        android:src="@drawable/e" />
    <ImageButton
        android:id="@+id/ib_f"
        style="@style/ManuBottonStyle"
        android:src="@drawable/f" />
    <ImageButton
        android:id="@+id/ib_g"
        style="@style/ManuBottonStyle"
        android:src="@drawable/g" />
    <ImageButton
        android:id="@+id/ib_a"
        style="@style/ManuBottonStyle"
        android:src="@drawable/a" />

2.將圖片添加到一個數(shù)組中庇绽,以便于進行動畫的添加

private int[] resID={R.id.ib_b,R.id.ib_c,R.id.ib_d,R.id.ib_e,R.id.ib_f,R.id.ib_g};

3.判斷當(dāng)前是打開還是關(guān)閉,進行相應(yīng)動畫的添加

private boolean isopen=false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
    }

    private void initView() {
       ImageButton menu=findViewById(R.id.ib_a);

       menu.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View view) {
               for(int i=0;i<resID.length;i++ ){
                   //判斷是打開還是關(guān)閉
                   if(isopen==true){
                       close(i);
                   }else{
                       open(i);
                   }
               }
               isopen=!isopen;
           }
       });
    }
    public void open(int i){
        //計算平分之后兩個之間的角度
        double angle=(2*Math.PI/(resID.length));
        //獲取id相應(yīng)的控件
        ImageButton ib=findViewById(resID[i]);

        //計算當(dāng)前空間的角度
        double mangle=(i+1)*angle;
        //計算x的距離
        float x=(float)Math.cos(-mangle)*400;
        //計算y的距離
        float y=(float)Math.sin(-mangle)*400;
        //移動的動畫
        TranslateAnimation tAnim=new TranslateAnimation(0,x,0,y);
        tAnim.setDuration(500);
        tAnim.setFillAfter(true);
        tAnim.setInterpolator(new BounceInterpolator());
        //旋轉(zhuǎn)動畫
        RotateAnimation rotateAnimation=new RotateAnimation(0,3*360,ib.getPivotX(),ib.getPivotY());
        rotateAnimation.setDuration(500);
        rotateAnimation.setFillAfter(true);

        //創(chuàng)建一個AnimationSet集合 包裹多個動畫
        AnimationSet set=new AnimationSet(false);
        set.addAnimation(rotateAnimation);
        set.addAnimation(tAnim);
        set.setFillAfter(true);

        //開始動畫
        ib.startAnimation(set);
    }
    public void close(int i){
        //計算平分之后兩個之間的角度
        double angle=(2*Math.PI/(resID.length));
        //獲取id相應(yīng)的控件
        ImageButton ib=findViewById(resID[i]);

        //計算當(dāng)前空間的角度
        double mangle=(i+1)*angle;
        //計算x的距離
        float x=(float)Math.cos(-mangle)*400;
        //計算y的距離
        float y=(float)Math.sin(-mangle)*400;
        //移動的動畫
        TranslateAnimation tAnim=new TranslateAnimation(x,0,y,0);
        //tAnim.setDuration(500);
        //tAnim.setFillAfter(true);
        //tAnim.setInterpolator(new BounceInterpolator());
        //旋轉(zhuǎn)動畫
        RotateAnimation rotateAnimation=new RotateAnimation(0,3*360,
                ib.getPivotX(),ib.getPivotY());
        //rotateAnimation.setDuration(500);
        //rotateAnimation.setInterpolator(new BounceInterpolator());
        //rotateAnimation.setFillAfter(true);

        //創(chuàng)建一個AnimationSet集合 包裹多個動畫
        AnimationSet set=new AnimationSet(false);
        set.addAnimation(rotateAnimation);
        set.addAnimation(tAnim);
        set.setInterpolator(new BounceInterpolator());
        set.setFillAfter(true);

        //開始動畫
        ib.startAnimation(set);
    }
    public void animate(int i,boolean state){

    }

2.半旋轉(zhuǎn)動畫
效果:

錄制_2019_09_24_00_11_51_635.gif

1.添加圖片控件

<RelativeLayout
        android:layout_width="100dp"
        android:layout_height="50dp"
        android:background="@drawable/level1"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        >

        <ImageButton
            android:id="@+id/ib_home"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/icon_home"
            android:background="@null"
            android:layout_centerInParent="true"
            />

    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/ib_level2"
        android:layout_width="200dp"
        android:layout_height="100dp"
        android:background="@drawable/level2"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true">

        <ImageButton
            android:id="@+id/ib_menu"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/icon_menu"
            android:background="@null"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="5dp"/>

        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/icon_search"
            android:background="@null"
            android:layout_alignParentLeft="true"
            android:layout_alignParentBottom="true"
            android:layout_marginLeft="5dp"/>

        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/icon_myyouku"
            android:background="@null"
            android:layout_alignParentRight="true"
            android:layout_alignParentBottom="true"
            android:layout_marginRight="5dp"/>
    </RelativeLayout>

    <RelativeLayout
        android:id="@+id/ib_level3"
        android:layout_width="300dp"
        android:layout_height="150dp"
        android:background="@drawable/level3"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true">

        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/channel1"
            android:background="@null"
            android:layout_alignParentLeft="true"
            android:layout_alignParentBottom="true"
            android:layout_marginLeft="5dp"/>
        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/channel2"
            android:background="@null"
            android:layout_marginLeft="25dp"
            android:layout_marginTop="60dp"
            />
        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/channel3"
            android:background="@null"
            android:layout_marginLeft="60dp"
            android:layout_marginTop="20dp"
            />
        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/channel4"
            android:background="@null"
            android:layout_centerHorizontal="true"
            android:layout_marginTop="2dp"
            />
        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/channel5"
            android:background="@null"
            android:layout_alignParentRight="true"
            android:layout_marginRight="60dp"
            android:layout_marginTop="20dp"
            />
        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/channel6"
            android:background="@null"
            android:layout_alignParentRight="true"
            android:layout_marginRight="25dp"
            android:layout_marginTop="60dp"
            />
        <ImageButton
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/channel7"
            android:background="@null"
            android:layout_alignParentRight="true"
            android:layout_alignParentBottom="true"
            android:layout_marginRight="5dp"/>
    </RelativeLayout>

2.在此動畫中有兩種動畫橙困,一個是旋轉(zhuǎn)入瞧掺,一個是旋轉(zhuǎn)出,那么我們用兩個xml文件配置
旋轉(zhuǎn)入

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true"
    android:duration="1000">
    <rotate android:fromDegrees="180" android:toDegrees="0" android:pivotX="50%" android:pivotY="100%"/>

</set>

旋轉(zhuǎn)出

<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true"
    android:duration="1000">
    <rotate android:fromDegrees="0" android:toDegrees="-180" android:pivotX="50%" android:pivotY="100%"/>

</set>

3.加載榮容器凡傅,因為我們再旋轉(zhuǎn)的是后是旋轉(zhuǎn)的是容器辟狈,而不是單個的控件,找到需要被點擊的控件

 //加載容器
        level3=findViewById(R.id.ib_level3);
        level2=findViewById(R.id.ib_level2);

        //menu按鈕
        ImageButton menu=findViewById(R.id.ib_menu);
        ImageButton home=findViewById(R.id.ib_home);
        //添加點擊事件
        menu.setOnClickListener(this);
        home.setOnClickListener(this);

4.判斷當(dāng)前控件的狀態(tài)夏跷,是需要轉(zhuǎn)出還是轉(zhuǎn)入

@Override
    public void onClick(View view){
        switch (view.getId()){
            case R.id.ib_menu:
                if(islevel3open){
                    //關(guān)閉
                    closelevel(level3,0);
                }else{
                    //打開
                    openlevel(level3);
                }
                //改變狀態(tài)
                islevel3open=!islevel3open;
                break;
            case R.id.ib_home:
                if(islevel3open){
                    //關(guān)閉第三層
                    closelevel(level3,0);
                    islevel3open=!islevel3open;
                }
                if(islevel2open){
                    //關(guān)閉第二層
                    closelevel(level2,200);
                }else{
                    openlevel(level2);
                }
                islevel2open=!islevel2open;
                break;
            default:
                break;
        }
    }

    public void openlevel(RelativeLayout rl){
        Animation in=AnimationUtils.loadAnimation(this,R.anim.rotate_in);
        rl.startAnimation(in);
        //子控件可點擊
        changeState(rl,true);
    }
    public void closelevel(RelativeLayout rl,long delay){
        Animation out=AnimationUtils.loadAnimation(this,R.anim.rotate_out);
        out.setStartOffset(delay);
        rl.startAnimation(out);
        //子控件不可點擊
        changeState(rl,false);
    }
    public void changeState(RelativeLayout rl,boolean enable){
        //遍歷容器的子控件

        //1.獲取子控件的個數(shù)
        int count=rl.getChildCount();
        //2.遍歷子控件
        for(int i=0;i<count;i++){
             View view=rl.getChildAt(i);
             //設(shè)置子控件的狀態(tài)
            view.setEnabled(enable);
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末哼转,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子槽华,更是在濱河造成了極大的恐慌壹蔓,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件猫态,死亡現(xiàn)場離奇詭異佣蓉,居然都是意外死亡披摄,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門勇凭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來疚膊,“玉大人,你說我怎么就攤上這事套像∧鹆” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵夺巩,是天一觀的道長。 經(jīng)常有香客問我周崭,道長柳譬,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任续镇,我火速辦了婚禮美澳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘摸航。我一直安慰自己制跟,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布酱虎。 她就那樣靜靜地躺著雨膨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪读串。 梳的紋絲不亂的頭發(fā)上聊记,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音恢暖,去河邊找鬼排监。 笑死,一個胖子當(dāng)著我的面吹牛杰捂,可吹牛的內(nèi)容都是我干的舆床。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼嫁佳,長吁一口氣:“原來是場噩夢啊……” “哼挨队!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起脱拼,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤瞒瘸,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后熄浓,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體情臭,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡省撑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了俯在。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片竟秫。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖跷乐,靈堂內(nèi)的尸體忽然破棺而出肥败,到底是詐尸還是另有隱情,我是刑警寧澤愕提,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布馒稍,位于F島的核電站,受9級特大地震影響浅侨,放射性物質(zhì)發(fā)生泄漏纽谒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一如输、第九天 我趴在偏房一處隱蔽的房頂上張望鼓黔。 院中可真熱鬧,春花似錦不见、人聲如沸澳化。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缎谷。三九已至,卻和暖如春盖高,著一層夾襖步出監(jiān)牢的瞬間慎陵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工喻奥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留席纽,地道東北人。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓撞蚕,卻偏偏與公主長得像润梯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子甥厦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

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

  • 【Android 動畫】 動畫分類補間動畫(Tween動畫)幀動畫(Frame 動畫)屬性動畫(Property ...
    Rtia閱讀 6,119評論 1 38
  • 1 背景 不能只分析源碼呀纺铭,分析的同時也要整理歸納基礎(chǔ)知識,剛好有人微博私信讓全面說說Android的動畫刀疙,所以今...
    未聞椛洺閱讀 2,699評論 0 10
  • 概述 在Android開發(fā)的過程中舶赔,View的變化是很常見的,如果View變化的過程沒有動畫來過渡而是瞬間完成谦秧,會...
    小蕓論閱讀 38,952評論 18 134
  • 轉(zhuǎn)載一篇高質(zhì)量博文竟纳,原地址請戳這里轉(zhuǎn)載下來方便今后查看撵溃。1 背景不能只分析源碼呀,分析的同時也要整理歸納基礎(chǔ)知識锥累,...
    Elder閱讀 1,938評論 0 24
  • 1 背景 不能只分析源碼呀缘挑,分析的同時也要整理歸納基礎(chǔ)知識,剛好有人微博私信讓全面說說Android的動畫桶略,所以今...
    lisx_閱讀 961評論 0 0