1.效果图

这也是产品要求达到的效果,于是才有了这个实现。

Android 布局渐出动画 android动画按钮_android 位移动画

2.实现思路

总共就是7个按钮,中间的按钮然后被遮住的3个周报、日报、月报按钮,点击笔图标的按钮时,将被遮住的三个按钮移出,分别做左移、上移、右移100%的位置。给三个按钮添加动画监听事件,在onAnimationEnd方法里将按钮展开时,三个目标地点的按钮显示出来。

如图:

Android 布局渐出动画 android动画按钮_ide_02


1)初始状态就是step1中那样,这里包含显示在最上层的按钮和被遮住的3个按钮。点击这个圆形按钮后,被遮住的按钮将启动定义好的动画开始移动,像step2那样。动画监听事件里有个表示动画结束的方法onAnimationEnd,在onAnimationEnd方法里将step3里面外围3个按钮setVisibility(View.VISIBLE)。这就是展开动画。

2)同理收拢的动画,是先隐藏外围三个按钮,然后启动动画。

3.核心代码

1)Activity

public class MainActivity extends Activity {
    private ImageView imgWrite;
    private TextView txtDaily, txtDailyShow, txtWeekly, txtWeeklyShow, txtMonthly, txtMonthlyShow;
    private boolean isFold = true; // 卫星按钮展开状态

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity);

        initUI(); // 初始化界面
        initAnimation(); // 初始化动画
    }

    /**
     * 初始化界面
     */
    private void initUI() {
        imgWrite = (ImageView) this.findViewById(R.id.daily_write_imageview);
        txtDaily = (TextView) this.findViewById(R.id.daily_dialy_textview);
        txtDailyShow = (TextView) this.findViewById(R.id.daily_dialy_show_textview);
        txtWeekly = (TextView) this.findViewById(R.id.daily_weekly_textview);
        txtWeeklyShow = (TextView) this.findViewById(R.id.daily_weekly_show_textview);
        txtMonthly = (TextView) this.findViewById(R.id.daily_monthly_textview);
        txtMonthlyShow = (TextView) this.findViewById(R.id.daily_monthly_show_textview);
        // 绑定事件
        this.imgWrite.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                if (isFold) {
                    txtDaily.startAnimation(dailyUnfoldAnimation);
                    txtWeekly.startAnimation(weeklyUnfoldAnimation);
                    txtMonthly.startAnimation(monthlyUnfoldAnimation);
                } else {
                    txtDaily.startAnimation(dailyFoldAnimation);
                    txtWeekly.startAnimation(weeklyFoldAnimation);
                    txtMonthly.startAnimation(monthlyFoldAnimation);
                }
                isFold = !isFold;
                if (isFold) {
                    imgWrite.setBackgroundResource(R.drawable.write_daily_fold_icon);
                } else {
                    imgWrite.setBackgroundResource(R.drawable.write_daily_unfold_icon);
                }
            }
        });
    }

    private Animation dailyUnfoldAnimation, dailyFoldAnimation, weeklyUnfoldAnimation,
        weeklyFoldAnimation, monthlyUnfoldAnimation, monthlyFoldAnimation;
    /**
     * 初始化动画
     */
    private void initAnimation() {
        // 展开日报,展开结束时,在停留点显示控件
        dailyUnfoldAnimation = new TranslateAnimation( Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, -1.05f);
        dailyUnfoldAnimation.setDuration(500);
        dailyUnfoldAnimation.setAnimationListener(new AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
            }
            @Override
            public void onAnimationRepeat(Animation animation) {
            }
            @Override
            public void onAnimationEnd(Animation animation) {
                txtDailyShow.setVisibility(View.VISIBLE);
            }
        });
        // 收起日报,开始动画时,隐藏起始点控件
        dailyFoldAnimation = new TranslateAnimation( Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, -1.05f, Animation.RELATIVE_TO_SELF, 0f);
        dailyFoldAnimation.setDuration(500);
        dailyFoldAnimation.setAnimationListener(new AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                txtDailyShow.setVisibility(View.GONE);
            }
            @Override
            public void onAnimationRepeat(Animation animation) {
            }
            @Override
            public void onAnimationEnd(Animation animation) {
            }
        });
        // 展开周报
        weeklyUnfoldAnimation = new TranslateAnimation( Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, -1.05f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f);
        weeklyUnfoldAnimation.setDuration(500);
        weeklyUnfoldAnimation.setAnimationListener(new AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
            }
            @Override
            public void onAnimationRepeat(Animation animation) {
            }
            @Override
            public void onAnimationEnd(Animation animation) {
                txtWeeklyShow.setVisibility(View.VISIBLE);
            }
        });
        // 收起周报
        weeklyFoldAnimation = new TranslateAnimation( Animation.RELATIVE_TO_SELF, -1.05f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f);
        weeklyFoldAnimation.setDuration(500);
        weeklyFoldAnimation.setAnimationListener(new AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                txtWeeklyShow.setVisibility(View.GONE);
            }
            @Override
            public void onAnimationRepeat(Animation animation) {
            }
            @Override
            public void onAnimationEnd(Animation animation) {
            }
        });
        // 展开月报
        monthlyUnfoldAnimation = new TranslateAnimation( Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 1.05f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f);
        monthlyUnfoldAnimation.setDuration(500);
        monthlyUnfoldAnimation.setAnimationListener(new AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
            }
            @Override
            public void onAnimationRepeat(Animation animation) {
            }
            @Override
            public void onAnimationEnd(Animation animation) {
                txtMonthlyShow.setVisibility(View.VISIBLE);
            }
        });
        // 收起月报
        monthlyFoldAnimation = new TranslateAnimation( Animation.RELATIVE_TO_SELF, 1.05f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f, Animation.RELATIVE_TO_SELF, 0f);
        monthlyFoldAnimation.setDuration(500);
        monthlyFoldAnimation.setAnimationListener(new AnimationListener() {
            @Override
            public void onAnimationStart(Animation animation) {
                txtMonthlyShow.setVisibility(View.GONE);
            }
            @Override
            public void onAnimationRepeat(Animation animation) {
            }
            @Override
            public void onAnimationEnd(Animation animation) {
            }
        });
    }
}

2)layout代码

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

    <TextView 
        android:id="@+id/daily_weekly_textview"
        android:layout_width="48dip"
        android:layout_height="48dip"
        style="@style/normal_text_style_white"
        android:layout_centerInParent="true"
        android:gravity="center"
        android:text="周报"
        android:background="@drawable/main_color_oval_bg"/>

    <TextView 
        android:id="@+id/daily_dialy_textview"
        android:layout_width="48dip"
        android:layout_height="48dip"
        style="@style/normal_text_style_white"
        android:layout_centerInParent="true"
        android:gravity="center"
        android:text="日报"
        android:background="@drawable/main_color_oval_bg"/>

    <TextView 
        android:id="@+id/daily_monthly_textview"
        android:layout_width="48dip"
        android:layout_height="48dip"
        style="@style/normal_text_style_white"
        android:layout_centerInParent="true"
        android:gravity="center"
        android:text="月报"
        android:background="@drawable/main_color_oval_bg"/>

    <ImageView
        android:id="@+id/daily_write_imageview"
        android:layout_width="50dip"
        android:layout_height="50dip"
        android:layout_centerInParent="true"
        android:background="@drawable/write_daily_fold_icon" />

    <TextView 
        android:id="@+id/daily_weekly_show_textview"
        android:layout_width="48dip"
        android:layout_height="48dip"
        style="@style/normal_text_style_white"
        android:layout_centerVertical="true"
        android:layout_toLeftOf="@+id/daily_write_imageview"
        android:layout_marginRight="1dip"
        android:gravity="center"
        android:text="周报"
        android:visibility="gone"
        android:background="@drawable/main_color_oval_bg"/>

    <TextView 
        android:id="@+id/daily_dialy_show_textview"
        android:layout_width="48dip"
        android:layout_height="48dip"
        style="@style/normal_text_style_white"
        android:layout_centerHorizontal="true"
        android:layout_above="@+id/daily_write_imageview"
        android:layout_marginBottom="1dip"
        android:gravity="center"
        android:text="日报"
        android:visibility="gone"
        android:background="@drawable/main_color_oval_bg"/>

    <TextView 
        android:id="@+id/daily_monthly_show_textview"
        android:layout_width="48dip"
        android:layout_height="48dip"
        style="@style/normal_text_style_white"
        android:layout_centerVertical="true"
        android:layout_toRightOf="@+id/daily_write_imageview"
        android:layout_marginLeft="1dip"
        android:gravity="center"
        android:text="月报"
        android:visibility="gone"
        android:background="@drawable/main_color_oval_bg"/>

</RelativeLayout>

至于样式背景和资源就不一一给出,有需要的可以去我的github下载源码
https://github.com/Acoee/aoce_anim_demo.git