Android 动态菜单

先上效果图

比较简单,主要就是属性动画的使用和坐标角度的小细节。

实现

实现效果:
图标按照路径一路缩放渐变过来即可。

核心代码

 /**   * Item开启动画   *   * @param btnItem   * @param index   * @param total   * @param radius   */  private void btnItemStartAnimator(View btnItem, int index, int total, int radius) {    if (btnItem.getVisibility() != View.VISIBLE) {      btnItem.setVisibility(View.VISIBLE);    }    double degree = Math.toRadians(90) / (total - 1) * index;//Math中根据度数得到弧度值的函数    int translationX = -(int) (radius * Math.sin(degree));    int translationY = -(int) (radius * Math.cos(degree));    AnimatorSet set = new AnimatorSet();    //实现平移缩放和透明动画    set.playTogether(        ObjectAnimator.ofFloat(btnItem, "translationX", 0, translationX),        ObjectAnimator.ofFloat(btnItem, "translationY", 0, translationY),        ObjectAnimator.ofFloat(btnItem, "scaleX", 0, 1),        ObjectAnimator.ofFloat(btnItem, "scaleY", 0, 1),        ObjectAnimator.ofFloat(btnItem, "alpha", 0, 1)    );    set.setInterpolator(new BounceInterpolator());    set.setDuration(500).start();  }  /**   * Item关闭动画   *   * @param btnItem   * @param index   * @param total   * @param radius   */  private void btnItemCloseAnimator(View btnItem, int index, int total, int radius) {    double degree = Math.PI * index / ((total - 1) * 2);    int translationX = -(int) (radius * Math.sin(degree));    int translationY = -(int) (radius * Math.cos(degree));    AnimatorSet set = new AnimatorSet();    //包含平移、缩放和透明度动画    set.playTogether(        ObjectAnimator.ofFloat(btnItem, "translationX", translationX, 0),        ObjectAnimator.ofFloat(btnItem, "translationY", translationY, 0),        ObjectAnimator.ofFloat(btnItem, "scaleX", 1f, 0f),        ObjectAnimator.ofFloat(btnItem, "scaleY", 1f, 0f),        ObjectAnimator.ofFloat(btnItem, "alpha", 1f, 0f));    set.setDuration(500).start();    if (btnItem.getVisibility() == View.VISIBLE) {      btnItem.setVisibility(View.INVISIBLE);    }  }

item开启动画和关闭动画为一个逆过程,体现在x,y距离变化上。

x,y的距离开启时距离逐渐增长

ObjectAnimator.ofFloat(btnItem, "translationX", 0, translationX),    ObjectAnimator.ofFloat(btnItem, "translationY", 0, translationY),

这里要注意下sin这些弧度的计算,可以使用Math.toRadins(数字)

 double degree = Math.toRadians(90) / (total - 1) * index;//Math中根据度数得到弧度值的函数    int translationX = -(int) (radius * Math.sin(degree));

或者使用PI=180°来折算

 double degree = Math.PI * index / ((total - 1) * 2);     int translationX = -(int) (radius * Math.sin(degree));

实例代码:

package xsf.customView;import android.animation.AnimatorSet;import android.animation.ObjectAnimator;import android.view.View;import android.view.animation.BounceInterpolator;import android.widget.Button;import android.widget.Toast;import xsf.customView.base.BaseActvity;public class StatelliteActivity extends BaseActvity {  private Button btnMenu, btnItem1, btnItem2, btnItem3, btnItem4, btnItem5;  private boolean isMenuOpen = false;  @Override  protected int setLayoutResourceId() {    return R.layout.activity_statellite;  }  @Override  protected void initView() {    btnMenu = (Button) findViewById(R.id.btnMenu);    btnMenu.setOnClickListener(this);    btnItem1 = (Button) findViewById(R.id.btnItem1);    btnItem1.setOnClickListener(this);    btnItem2 = (Button) findViewById(R.id.btnItem2);    btnItem2.setOnClickListener(this);    btnItem3 = (Button) findViewById(R.id.btnItem3);    btnItem3.setOnClickListener(this);    btnItem4 = (Button) findViewById(R.id.btnItem4);    btnItem4.setOnClickListener(this);    btnItem5 = (Button) findViewById(R.id.btnItem5);    btnItem5.setOnClickListener(this);  }    @Override  public void onClick(View v) {    btnMenu.requestFocus();    switch (v.getId()) {      case R.id.btnMenu:        showItemAnimator();        break;      case R.id.btnItem1:        Toast.makeText(StatelliteActivity.this, "点击了Item1", Toast.LENGTH_SHORT).show();        break;      case R.id.btnItem2:        Toast.makeText(StatelliteActivity.this, "点击了Item2", Toast.LENGTH_SHORT).show();        break;      case R.id.btnItem3:        Toast.makeText(StatelliteActivity.this, "点击了Item3", Toast.LENGTH_SHORT).show();        break;      case R.id.btnItem4:        Toast.makeText(StatelliteActivity.this, "点击了Item4", Toast.LENGTH_SHORT).show();        break;      case R.id.btnItem5:        Toast.makeText(StatelliteActivity.this, "点击了Item5", Toast.LENGTH_SHORT).show();        break;    }  }  private void showItemAnimator() {    if (!isMenuOpen) {      //此时menu是关闭的      isMenuOpen = true;      btnItemStartAnimator(btnItem1, 0, 5, 300);      btnItemStartAnimator(btnItem2, 1, 5, 300);      btnItemStartAnimator(btnItem3, 2, 5, 300);      btnItemStartAnimator(btnItem4, 3, 5, 300);      btnItemStartAnimator(btnItem5, 4, 5, 300);    } else {      //此时menu是打开的      isMenuOpen = false;      btnItemCloseAnimator(btnItem1, 0, 5, 300);      btnItemCloseAnimator(btnItem2, 1, 5, 300);      btnItemCloseAnimator(btnItem3, 2, 5, 300);      btnItemCloseAnimator(btnItem4, 3, 5, 300);      btnItemCloseAnimator(btnItem5, 4, 5, 300);    }  }  /**   * 关闭动画   *   * @param btnItem   * @param index   * @param total   * @param radius   */  private void btnItemCloseAnimator(View btnItem, int index, int total, int radius) {    double degree = Math.PI * index / ((total - 1) * 2);    int translationX = -(int) (radius * Math.sin(degree));    int translationY = -(int) (radius * Math.cos(degree));    AnimatorSet set = new AnimatorSet();    //包含平移、缩放和透明度动画    set.playTogether(        ObjectAnimator.ofFloat(btnItem, "translationX", translationX, 0),        ObjectAnimator.ofFloat(btnItem, "translationY", translationY, 0),        ObjectAnimator.ofFloat(btnItem, "scaleX", 1f, 0f),        ObjectAnimator.ofFloat(btnItem, "scaleY", 1f, 0f),        ObjectAnimator.ofFloat(btnItem, "alpha", 1f, 0f));    set.setDuration(500).start();    if (btnItem.getVisibility() == View.VISIBLE) {      btnItem.setVisibility(View.INVISIBLE);    }  }  /**   * 开启动画   *   * @param btnItem   * @param index   * @param total   * @param radius   */  private void btnItemStartAnimator(View btnItem, int index, int total, int radius) {    if (btnItem.getVisibility() != View.VISIBLE) {      btnItem.setVisibility(View.VISIBLE);    }    double degree = Math.toRadians(90) / (total - 1) * index;//Math中根据度数得到弧度值的函数    int translationX = -(int) (radius * Math.sin(degree));    int translationY = -(int) (radius * Math.cos(degree));    AnimatorSet set = new AnimatorSet();    //实现平移缩放和透明动画    set.playTogether(        ObjectAnimator.ofFloat(btnItem, "translationX", 0, translationX),        ObjectAnimator.ofFloat(btnItem, "translationY", 0, translationY),        ObjectAnimator.ofFloat(btnItem, "scaleX", 0, 1),        ObjectAnimator.ofFloat(btnItem, "scaleY", 0, 1),        ObjectAnimator.ofFloat(btnItem, "alpha", 0, 1)    );    set.setInterpolator(new BounceInterpolator());    set.setDuration(500).start();  }}

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

更多相关文章

  1. android 自定义动画2
  2. Android中图片的处理(放大缩小,去色,转换格式,增加水印等)函数
  3. Android实现圆形圆角图片
  4. android之图像处理、缩放、修改图片、绘图
  5. Android中TextView滚动显示信息的效果
  6. 图片加载和处理的又一个神器 Fresco 的使用摘要记录
  7. Android实现下拉放大图片松手自动反弹效果
  8. 贴一个定义android animation的应用实例
  9. Animation(2、帧动画)

随机推荐

  1. Android 版本兼容适配
  2. Android Studio中获取sha1证书指纹数据的
  3. [置顶] Android原生(Native)C(JNI/NDK)开
  4. Android中ViewPager+Fragment懒加载问题
  5. Android Studio如何设置代码自动提示
  6. android 笔记3
  7. 个人对学习Android应用与Android系统的心
  8. Android(安卓)弹性布局 FlexboxLayout(一)
  9. Android(五):Android 数字签名
  10. RecyclerView机制解析: ChildHelper