menu展开动画(属性动画)

好伤心啊,webm转化成的pdf在简书上居然无法正常播放,我要怎么给宝宝们展示动态效果呢,蓝瘦香菇...上截图~~


Screenshot_1561041389.png
Screenshot_1561041395.png
Screenshot_1561041444.png

嗯啦嗯啦,安啦,那个🍵在冒烟儿,是均匀分布的啦!
怎么实现的呢?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,再点一下关闭menu。
一言不合上代码....
先说垂直展开菜单这个,设置Y轴偏移量根据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;
    }

关上!把这个菜单关上就是把所有的偏移量从现在的偏移量恢复成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里面的几个参数,第一个参数是target,就是需要进行动画操作的目标,没错,就是这些imageView啦,第二个参数,需要改变的属性,没错,就是我们的Y轴偏移量TranslationY啦,后面的属性就是values,就是我们的属性值从哪个值变化到哪个值,可以清楚地看到展开菜单和关闭菜单的不同就是属性值的变化不同,展开是从0→i300,关闭时从i300→0。

setDuration就是动画从开始到结束这个时间长短。
setInterpolator就是动画的插值器,设置动画变化的规律,有9个默认的插值器,这里用的是默认的加速插值器AccelerateInterpolator,还有减速啊,回弹啊等等之类的,好的插值器链接参照:https://www.jianshu.com/p/88740cba25e6
一般插值器是为了让动画效果更接近现实,so,根据自身需要决定是否使用。

好,下一个,扇形展开菜单!

扇形的怎么展开呢?简单一看就是不仅有Y轴的偏移量还有X轴的偏移量!要让他呈扇形均匀展开,就是把扇形平均分成imageViews.size() - 1份,回顾一下数学:

弧度的定义:弧长等于圆半径长的弧所对的圆心角为1弧度,弧度没有单位。
即弧度=弧长/半径=l/r,因此,若弧度=π,弧长=πr=圆周的一半,此时恰好为一个半圆,圆心角180,也就是说π=180,1°=π/180

所以我们的角度计算公式为:

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

三角函数计算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之后执行

好,到此结束。
有不对的地方请指正,O(∩_∩)O谢谢。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,393评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,790评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,391评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,703评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,613评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,003评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,507评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,158评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,300评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,256评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,274评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,984评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,569评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,662评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,899评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,268评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,840评论 2 339

推荐阅读更多精彩内容

  • 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让全面说说Android的动画,所以今...
    未聞椛洺阅读 2,673评论 0 10
  • 1 CALayer IOS SDK详解之CALayer(一) http://doc.okbase.net/Hell...
    Kevin_Junbaozi阅读 5,109评论 3 23
  • 1 背景 不能只分析源码呀,分析的同时也要整理归纳基础知识,刚好有人微博私信让全面说说Android的动画,所以今...
    lisx_阅读 954评论 0 0
  • 转载一篇高质量博文,原地址请戳这里转载下来方便今后查看。1 背景不能只分析源码呀,分析的同时也要整理归纳基础知识,...
    Elder阅读 1,934评论 0 24
  • 在iOS中随处都可以看到绚丽的动画效果,实现这些动画的过程并不复杂,今天将带大家一窥iOS动画全貌。在这里你可以看...
    F麦子阅读 5,082评论 5 13