• FloatActionButton弹出菜单


    浮动按钮的弹出菜单动画

    floatActionButton

    将几个按钮重叠摆放,使用ValueAnimator更新按钮的坐标实现。

    布局

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <android.support.design.widget.FloatingActionButton
            android:id="@+id/float_btn1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|end"
            android:layout_marginBottom="20dp"
            android:layout_marginEnd="10dp"
            android:src="@mipmap/fav_2"
            app:elevation="5dp"
            app:fabSize="normal" />
    
        <android.support.design.widget.FloatingActionButton
            android:id="@+id/float_btn2"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|end"
            android:layout_marginBottom="20dp"
            android:layout_marginEnd="10dp"
            android:src="@mipmap/idea"
            app:elevation="5dp"
            app:fabSize="normal" />
    
        <android.support.design.widget.FloatingActionButton
            android:id="@+id/float_btn3"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|end"
            android:layout_marginBottom="20dp"
            android:layout_marginEnd="10dp"
            android:src="@mipmap/faxian"
            app:elevation="5dp"
            app:fabSize="normal" />
    
        <android.support.design.widget.FloatingActionButton
            android:id="@+id/float_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom|end"
            android:layout_marginBottom="20dp"
            android:layout_marginEnd="10dp"
            android:src="@mipmap/menu"
            app:elevation="5dp"
            app:fabSize="normal" />
    
    </FrameLayout>
    

    控制

    private FloatingActionButton actionButton, actionButton1, actionButton2, actionButton3;
    private boolean menuOpen = false;
    private void showMenu() {
            menuOpen = true;
            int x = (int) actionButton.getX();
            int y = (int) actionButton.getY();
            ValueAnimator v1 = ValueAnimator.ofInt(x, x - DISTANCE);
            v1.setDuration(500);
            v1.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    int l = (int) animation.getAnimatedValue();
                    int t = (int) actionButton1.getY();
                    int r = actionButton1.getWidth() + l;
                    int b = actionButton1.getHeight() + t;
                    actionButton1.layout(l, t, r, b);
                }
            });
            ValueAnimator v2x = ValueAnimator.ofInt(x, x - DISTANCE2);
            ValueAnimator v2y = ValueAnimator.ofInt(y, y - DISTANCE2);
            v2x.setDuration(500).addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    int l = (int) animation.getAnimatedValue();
                    int t = (int) actionButton2.getY();
                    int r = actionButton2.getWidth() + l;
                    int b = actionButton2.getHeight() + t;
                    actionButton2.layout(l, t, r, b);
                }
            });
            v2y.setDuration(500).addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    int t = (int) animation.getAnimatedValue();
                    int l = (int) actionButton2.getX();
                    int r = actionButton2.getWidth() + l;
                    int b = actionButton2.getHeight() + t;
                    actionButton2.layout(l, t, r, b);
                }
            });
            ValueAnimator v3 = ValueAnimator.ofInt(y, y - DISTANCE);
            v3.setDuration(500).addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    int t = (int) animation.getAnimatedValue();
                    int l = (int) actionButton3.getX();
                    int r = actionButton3.getWidth() + l;
                    int b = actionButton3.getHeight() + t;
                    actionButton3.layout(l, t, r, b);
                }
            });
            v1.start();
            v2x.start();
            v2y.start();
            v3.start();
        }
    
        private void hideMenu() {
            menuOpen = false;
            int x = (int) actionButton1.getX();
            ValueAnimator v1 = ValueAnimator.ofInt(x, (int) actionButton.getX());
            v1.setDuration(500);
            v1.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    int l = (int) animation.getAnimatedValue();
                    int t = (int) actionButton1.getY();
                    int r = actionButton1.getWidth() + l;
                    int b = actionButton1.getHeight() + t;
                    actionButton1.layout(l, t, r, b);
                }
            });
            x = (int) actionButton2.getX();
            int y = (int) actionButton2.getY();
            ValueAnimator v2x = ValueAnimator.ofInt(x, (int) actionButton.getX());
            ValueAnimator v2y = ValueAnimator.ofInt(y, (int) actionButton.getY());
            v2x.setDuration(500).addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    int l = (int) animation.getAnimatedValue();
                    int t = (int) actionButton2.getY();
                    int r = actionButton2.getWidth() + l;
                    int b = actionButton2.getHeight() + t;
                    actionButton2.layout(l, t, r, b);
                }
            });
            v2y.setDuration(500).addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    int t = (int) animation.getAnimatedValue();
                    int l = (int) actionButton2.getX();
                    int r = actionButton2.getWidth() + l;
                    int b = actionButton2.getHeight() + t;
                    actionButton2.layout(l, t, r, b);
                }
            });
            y = (int) actionButton3.getY();
            ValueAnimator v3 = ValueAnimator.ofInt(y, (int) actionButton.getY());
            v3.setDuration(500).addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    int t = (int) animation.getAnimatedValue();
                    int l = (int) actionButton3.getX();
                    int r = actionButton3.getWidth() + l;
                    int b = actionButton3.getHeight() + t;
                    actionButton3.layout(l, t, r, b);
                }
            });
            v1.start();
            v2x.start();
            v2y.start();
            v3.start();
        }
    
  • 相关阅读:
    面向对象:范式与思想
    每个人都应该懂点函数式编程
    Lambda 表达式-即匿名函数----Lambda演算-即匿名函数的等价推演过程-- => define as
    Side effect (computer science)
    系统理论
    参量与变量、指针、函数、对象
    面向对象和结构化程序设计的区别X
    面向对象编程与面向过程编程的区别(翻译版)
    2015 Objective-C 新特性
    Comparison of programming paradigms
  • 原文地址:https://www.cnblogs.com/jiy-for-you/p/6898477.html
Copyright © 2020-2023  润新知