全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android 动态菜单实现实例代码

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();


  }
}

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


# Android  # 动态菜单  # 动态菜单实例代码  # 菜单  # Android左右滑出菜单实例分析  # android底部菜单栏实现原理与代码  # android popwindow实现左侧弹出菜单层及PopupWindow主要方法介绍  # Android ListView长按弹出菜单二种实现方式示例  # Android开发技巧之我的菜单我做主(自定义菜单)  # Android仿QQ空间底部菜单示例代码  # Android界面设计(APP设计趋势 左侧隐藏菜单右边显示content)  # 基于Android实现点击某个按钮让菜单选项从按钮周围指定位置弹出  # Android之用PopupWindow实现弹出菜单的方法详解  # Android仿UC底部菜单栏实现原理与代码  # 要注意  # 希望能  # 可以使用  # 谢谢大家  # 体现在  # ObjectAnimator  # playTogether  # ofFloat  # scaleX  # scaleY  # set  # sin  # translationX  # translationY  # AnimatorSet  # cos  # alpha  # INVISIBLE  # PI  # item 


相关文章: 如何用虚拟主机快速搭建网站?详细步骤解析  ,柠檬视频怎样兑换vip?  制作农业网站的软件,比较好的农业网站推荐一下?  清除minerd进程的简单方法  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  Swift中循环语句中的转移语句 break 和 continue  深圳网站制作的公司有哪些,dido官方网站?  如何在新浪SAE免费搭建个人博客?  如何在Golang中引入测试模块_Golang测试包导入与使用实践  ,网站推广常用方法?  无锡制作网站公司有哪些,无锡优八网络科技有限公司介绍?  如何获取免费开源的自助建站系统源码?  长沙做网站要多少钱,长沙国安网络怎么样?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  南平网站制作公司,2025年南平市事业单位报名时间?  购物网站制作公司有哪些,哪个购物网站比较好?  如何在企业微信快速生成手机电脑官网?  如何快速搭建高效服务器建站系统?  西安大型网站制作公司,西安招聘网站最好的是哪个?  油猴 教程,油猴搜脚本为什么会网页无法显示?  如何在阿里云域名上完成建站全流程?  Android自定义listview布局实现上拉加载下拉刷新功能  武清网站制作公司,天津武清个人营业执照注销查询系统网站?  如何用已有域名快速搭建网站?  如何获取PHP WAP自助建站系统源码?  Python lxml的etree和ElementTree有什么区别  免费网站制作appp,免费制作app哪个平台好?  专业公司网站制作公司,用什么语言做企业网站比较好?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  如何快速搭建高效香港服务器网站?  建站之星后台搭建步骤解析:模板选择与产品管理实操指南  建站之星在线客服如何快速接入解答?  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  如何选择高效稳定的ISP建站解决方案?  如何在西部数码注册域名并快速搭建网站?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  如何选择美橙互联多站合一建站方案?  如何通过VPS搭建网站快速盈利?  建站之星后台管理:高效配置与模板优化提升用户体验  建站之星logo尺寸如何设置最合适?  建站之星上传入口如何快速找到?  如何快速搭建二级域名独立网站?  如何通过虚拟机搭建网站?详细步骤解析  云南网站制作公司有哪些,云南最好的招聘网站是哪个?  专业网站建设制作报价,网页设计制作要考什么证?  制作网站软件推荐手机版,如何制作属于自己的手机网站app应用?  如何有效防御Web建站篡改攻击?  临沂网站制作公司有哪些,临沂第四中学官网? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。