介绍了Android 带有弹出收缩动画的扇形菜单实例,具有一定的参考价值,有兴趣的可以了解一下 

最近试着做了个Android 带有弹出收缩动画的扇形菜单,留个笔记记录一下。

效果如下

Android 带有弹出收缩动画的扇形菜单实例_第1张图片

public class MainActivity extends AppCompatActivity implements View.OnClickListener {  private ImageView imgPublish;  private TextView textView1;  private TextView textView2;  private boolean isMenuOpen = false;  private List textViews = new ArrayList<>();  @Override  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);    imgPublish = (ImageView) findViewById(R.id.img_publish);    textView1 = (TextView) findViewById(R.id.tv_1);    textView2 = (TextView) findViewById(R.id.tv_2);    textViews.add(textView1);    textViews.add(textView2);    imgPublish.setOnClickListener(this);  }  @Override  public void onClick(View v) {    switch (v.getId()) {      case R.id.img_publish:        if (!isMenuOpen) {          showOpenAnim(80);          imgPublish.setImageResource(R.mipmap.publish_select);        }else {          showCloseAnim(80);          imgPublish.setImageResource(R.mipmap.fabu);        }        break;    }  }  //打开扇形菜单的属性动画, dp为半径长度  private void showOpenAnim(int dp) {    textView1.setVisibility(View.VISIBLE);    textView2.setVisibility(View.VISIBLE);    //for循环来开始小图标的出现动画    for (int i = 0; i < textViews.size(); i++) {      AnimatorSet set = new AnimatorSet();      //标题1与x轴负方向角度为20°,标题2为100°,转换为弧度      double a = -Math.cos(20 * Math.PI / 180 * (i * 2 + 1));      double b = -Math.sin(20 * Math.PI / 180 * (i * 2 + 1));      double x = a * dip2px(dp);      double y = b * dip2px(dp);      set.playTogether(          ObjectAnimator.ofFloat(textViews.get(i), "translationX", (float) (x * 0.25), (float) x),          ObjectAnimator.ofFloat(textViews.get(i), "translationY", (float) (y * 0.25), (float) y)          , ObjectAnimator.ofFloat(textViews.get(i), "alpha", 0, 1).setDuration(2000)      );      set.setInterpolator(new BounceInterpolator());      set.setDuration(500).setStartDelay(100);      set.start();      set.addListener(new Animator.AnimatorListener() {        @Override        public void onAnimationStart(Animator animation) {        }        @Override        public void onAnimationEnd(Animator animation) {          //菜单状态置打开          isMenuOpen = true;        }        @Override        public void onAnimationCancel(Animator animation) {        }        @Override        public void onAnimationRepeat(Animator animation) {        }      });    }    //转动加号大图标本身45°    ObjectAnimator rotate = ObjectAnimator.ofFloat(imgPublish, "rotation", 0, 90).setDuration(300);    rotate.setInterpolator(new BounceInterpolator());    rotate.start();  }  //关闭扇形菜单的属性动画,参数与打开时相反  private void showCloseAnim(int dp) {    //for循环来开始小图标的出现动画    for (int i = 0; i < textViews.size(); i++) {      AnimatorSet set = new AnimatorSet();      double a = -Math.cos(20 * Math.PI / 180 * (i * 2 + 1));      double b = -Math.sin(20 * Math.PI / 180 * (i * 2 + 1));      double x = a * dip2px(dp);      double y = b * dip2px(dp);      set.playTogether(          ObjectAnimator.ofFloat(textViews.get(i), "translationX", (float) x, (float) (x * 0.25)),          ObjectAnimator.ofFloat(textViews.get(i), "translationY", (float) y, (float) (y * 0.25)),          ObjectAnimator.ofFloat(textViews.get(i), "alpha", 1, 0).setDuration(2000)      );//      set.setInterpolator(new AccelerateInterpolator());      set.setDuration(500);      set.start();      set.addListener(new Animator.AnimatorListener() {        @Override        public void onAnimationStart(Animator animation) {        }        @Override        public void onAnimationEnd(Animator animation) {          textView1.setVisibility(View.GONE);          textView2.setVisibility(View.GONE);          //菜单状态置关闭          isMenuOpen = false;        }        @Override        public void onAnimationCancel(Animator animation) {        }        @Override        public void onAnimationRepeat(Animator animation) {        }      });    }    //转动加号大图标本身45°    ObjectAnimator rotate = ObjectAnimator.ofFloat(imgPublish, "rotation", 0, 90).setDuration(300);    rotate.setInterpolator(new BounceInterpolator());    rotate.start();  }  private int dip2px(int value) {    float density = getResources()        .getDisplayMetrics().density;    return (int) (density * value + 0.5f);  }}

布局文件

<?xml version="1.0" encoding="utf-8"?>          

circle_purple.xml

<?xml version="1.0" encoding="utf-8"?>  


更多相关文章

  1. [Android] View动画特效(三)
  2. Android之Menu菜单 onCreateOptionsMenu使用Menu按键显示不了问
  3. 选项菜单、子菜单、上下文菜单的使用
  4. android中的一个属性动画,可以显示更多的一个案例
  5. Android 创建菜单
  6. Android 自定义系统菜单的背景源码
  7. android实现左右滑动菜单
  8. android 多张图片动画方式轮播(转载)
  9. Android 属性动画中心点无限循环

随机推荐

  1. android圆形图片显示效果,带边框
  2. Android(安卓)ListView 局部刷新
  3. android弹钢琴的一个简单程序
  4. Android(安卓)Animation(四)AnimationListe
  5. Android之Loader理解
  6. Android隐藏软件盘
  7. android之将图片转化为圆形图片
  8. Android的计量单位px,in,mm,pt,dp,dip,sp
  9. Android(安卓)模拟返回键功能
  10. Android(安卓)Google 地图学习