menu展開動畫(屬性動畫)

好傷心啊凡壤,webm轉(zhuǎn)化成的pdf在簡書上居然無法正常播放终抽,我要怎么給寶寶們展示動態(tài)效果呢,藍瘦香菇...上截圖~~


Screenshot_1561041389.png
Screenshot_1561041395.png
Screenshot_1561041444.png

嗯啦嗯啦,安啦材义,那個??在冒煙兒,是均勻分布的啦昵慌!
怎么實現(xiàn)的呢?so easy袭蝗!
布局首先是個FrameLayout,里面有包含8個imageview,一起堆在左上角般婆,布局文件如下:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/iv_b"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_margin="10dp"
        android:contentDescription="@null"
        android:src="@drawable/b" />

    <ImageView
        android:id="@+id/iv_c"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_margin="10dp"
        android:contentDescription="@null"
        android:src="@drawable/c" />

    <ImageView
        android:id="@+id/iv_d"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_margin="10dp"
        android:contentDescription="@null"
        android:src="@drawable/d" />

    <ImageView
        android:id="@+id/iv_e"
        android:layout_width="50dp"
        android:layout_margin="10dp"
        android:layout_height="50dp"
        android:contentDescription="@null"
        android:src="@drawable/e" />

    <ImageView
        android:id="@+id/iv_f"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_margin="10dp"
        android:contentDescription="@null"
        android:src="@drawable/f" />

    <ImageView
        android:id="@+id/iv_g"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_margin="10dp"
        android:contentDescription="@null"
        android:src="@drawable/g" />

    <ImageView
        android:id="@+id/iv_h"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_margin="10dp"
        android:contentDescription="@null"
        android:src="@drawable/h" />

    <ImageView
        android:id="@+id/iv_a"
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:contentDescription="@null"
        android:src="@drawable/a" />
</FrameLayout>

然后在我們的頁面里面把這些imageView放到一個集合里面:

 private int[] resIds = {R.id.iv_a, R.id.iv_b, R.id.iv_c, R.id.iv_d, R.id.iv_e,
            R.id.iv_f, R.id.iv_g, R.id.iv_h};
    private List<ImageView> imageViews = new ArrayList<>();
  for (int resId : resIds) {
            ImageView imageView = findViewById(resId);
            imageView.setOnClickListener(this);
            imageViews.add(imageView);
        }

然后對iv_a這個設置一個點擊事件到腥,點一下展開menu,再點一下關(guān)閉menu蔚袍。
一言不合上代碼....
先說垂直展開菜單這個乡范,設置Y軸偏移量根據(jù)i值變化,就可以程序上圖那種萌萌噠的狀態(tài)啦:

 private void openMenu() {
        for (int i = 1; i < resIds.length; i++) {
            ObjectAnimator animator = ObjectAnimator.ofFloat(imageViews.get(i), "translationY",
                    0F, i * 300F);
            animator.setDuration(500);
            animator.setInterpolator(new AccelerateInterpolator());
//            animator.setStartDelay(i*300);
            animator.start();
        }
        expand = true;
    }

關(guān)上啤咽!把這個菜單關(guān)上就是把所有的偏移量從現(xiàn)在的偏移量恢復成0:

   private void closeMenu() {
        for (int i = 1; i < resIds.length; i++) {
            ObjectAnimator animator = ObjectAnimator.ofFloat(imageViews.get(i), "translationY",
                    i * 300F, 0F);
            animator.setDuration(500);
            animator.setInterpolator(new AccelerateInterpolator());
//            animator.setStartDelay(i*300);
            animator.start();
        }
        expand = false;
    }

這里我解釋一下 ObjectAnimator.ofFloat里面的幾個參數(shù)晋辆,第一個參數(shù)是target,就是需要進行動畫操作的目標宇整,沒錯瓶佳,就是這些imageView啦,第二個參數(shù)鳞青,需要改變的屬性霸饲,沒錯,就是我們的Y軸偏移量TranslationY啦盼玄,后面的屬性就是values贴彼,就是我們的屬性值從哪個值變化到哪個值,可以清楚地看到展開菜單和關(guān)閉菜單的不同就是屬性值的變化不同埃儿,展開是從0→i300器仗,關(guān)閉時從i300→0。

setDuration就是動畫從開始到結(jié)束這個時間長短童番。
setInterpolator就是動畫的插值器精钮,設置動畫變化的規(guī)律,有9個默認的插值器剃斧,這里用的是默認的加速插值器AccelerateInterpolator轨香,還有減速啊,回彈啊等等之類的幼东,好的插值器鏈接參照:http://www.reibang.com/p/88740cba25e6
一般插值器是為了讓動畫效果更接近現(xiàn)實臂容,so,根據(jù)自身需要決定是否使用根蟹。

好脓杉,下一個,扇形展開菜單简逮!

扇形的怎么展開呢球散?簡單一看就是不僅有Y軸的偏移量還有X軸的偏移量!要讓他呈扇形均勻展開散庶,就是把扇形平均分成imageViews.size() - 1份蕉堰,回顧一下數(shù)學:

弧度的定義:弧長等于圓半徑長的弧所對的圓心角為1弧度凌净,弧度沒有單位。
即弧度=弧長/半徑=l/r,因此屋讶,若弧度=π冰寻,弧長=πr=圓周的一半,此時恰好為一個半圓皿渗,圓心角180性雄,也就是說π=180,1°=π/180

所以我們的角度計算公式為:

angle = (float) Math.PI / (2 * (imageViews.size() - 1));//(π/2)/(imageViews.size() - 1)

三角函數(shù)計算x軸y軸的偏移量:

 float x = (float) (r * Math.sin(i * angle));
 float y = (float) (r * Math.cos(i * angle));

不懂得同學請自己摸出草稿本畫三角形
三角形的展開和收起動畫:


    private void angleOpenMenu(float angle, float r) {
        for (int i = 1; i < resIds.length; i++) {
            float x = (float) (r * Math.sin(i * angle));
            float y = (float) (r * Math.cos(i * angle));
            PropertyValuesHolder translationX = PropertyValuesHolder.ofFloat("translationX", 0F, x);
            PropertyValuesHolder translationY = PropertyValuesHolder.ofFloat("translationY", 0F, y);
            ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(imageViews.get(i),
                    translationX, translationY);
            animator.setInterpolator(new AccelerateInterpolator());
            animator.setDuration(500).start();
        }
        expand = true;
    }

    private void closeOpenMenu(float angle, float r) {
        for (int i = 1; i < resIds.length; i++) {
            float x = (float) (r * Math.sin(i * angle));
            float y = (float) (r * Math.cos(i * angle));
            PropertyValuesHolder translationX = PropertyValuesHolder.ofFloat("translationX", x, 0F);
            PropertyValuesHolder translationY = PropertyValuesHolder.ofFloat("translationY", y, 0F);
            ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(imageViews.get(i),
                    translationX, translationY);
            animator.setInterpolator(new AccelerateInterpolator());
            animator.setDuration(500).start();
        }
        expand = false;
    }

細心的同學可以看到里面多了個PropertyValuesHolder羹奉,這個是用于組合多個動畫,也可以像垂直展開動畫一樣單獨寫约计,如果需要定義動畫順序诀拭,比如先Y軸便宜再X軸偏移,或者Z軸和Y軸一起偏移煤蚌,就需要使用AnimatorSet耕挨。

簡單說一下AnimatorSet:

AnimatorSet.playTogether//動畫一起播放;
AnimatorSet.playSequentially//動畫按照順序播放尉桩;
AnimatorSet.play(translationX).with(translationY)//動畫X和Y一起播放筒占;
AnimatorSet.play(translationY).after(translationX)//動畫Y在動畫X之后執(zhí)行

好,到此結(jié)束蜘犁。
有不對的地方請指正翰苫,O(∩_∩)O謝謝。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末这橙,一起剝皮案震驚了整個濱河市奏窑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌屈扎,老刑警劉巖埃唯,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鹰晨,居然都是意外死亡墨叛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門模蜡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來漠趁,“玉大人,你說我怎么就攤上這事哩牍∨锪剩” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵膝昆,是天一觀的道長丸边。 經(jīng)常有香客問我叠必,道長,這世上最難降的妖魔是什么妹窖? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任纬朝,我火速辦了婚禮,結(jié)果婚禮上骄呼,老公的妹妹穿的比我還像新娘共苛。我一直安慰自己,他們只是感情好蜓萄,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布隅茎。 她就那樣靜靜地躺著,像睡著了一般嫉沽。 火紅的嫁衣襯著肌膚如雪辟犀。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天绸硕,我揣著相機與錄音堂竟,去河邊找鬼。 笑死玻佩,一個胖子當著我的面吹牛出嘹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播咬崔,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼税稼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了垮斯?” 一聲冷哼從身側(cè)響起娶聘,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎甚脉,沒想到半個月后丸升,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡牺氨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年狡耻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猴凹。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡夷狰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出郊霎,到底是詐尸還是另有隱情沼头,我是刑警寧澤,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站进倍,受9級特大地震影響土至,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜猾昆,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一陶因、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧垂蜗,春花似錦楷扬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至片部,卻和暖如春螟加,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背吞琐。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留然爆,地道東北人站粟。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像曾雕,于是被迫代替她去往敵國和親奴烙。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

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

  • 1 背景 不能只分析源碼呀剖张,分析的同時也要整理歸納基礎(chǔ)知識切诀,剛好有人微博私信讓全面說說Android的動畫,所以今...
    未聞椛洺閱讀 2,711評論 0 10
  • 1 CALayer IOS SDK詳解之CALayer(一) http://doc.okbase.net/Hell...
    Kevin_Junbaozi閱讀 5,152評論 3 23
  • 1 背景 不能只分析源碼呀搔弄,分析的同時也要整理歸納基礎(chǔ)知識幅虑,剛好有人微博私信讓全面說說Android的動畫,所以今...
    lisx_閱讀 964評論 0 0
  • 轉(zhuǎn)載一篇高質(zhì)量博文顾犹,原地址請戳這里轉(zhuǎn)載下來方便今后查看倒庵。1 背景不能只分析源碼呀,分析的同時也要整理歸納基礎(chǔ)知識炫刷,...
    Elder閱讀 1,942評論 0 24
  • 在iOS中隨處都可以看到絢麗的動畫效果擎宝,實現(xiàn)這些動畫的過程并不復雜,今天將帶大家一窺iOS動畫全貌浑玛。在這里你可以看...
    F麥子閱讀 5,113評論 5 13