尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Android实现爆炸式菜单按钮弹出效果

Android实现爆炸式菜单按钮弹出效果 最近项目要使用到点击一个按钮弹出多个按钮的效果在试了几个类库后感觉不是很理想所以自己代码实现了一个下图所示实现原理很简单就是利用android原声动画效果当点击中心按钮时弹出其余按钮。闲话少叙代码如下。第一步activity_main.xml 很简单也就是五个相同位置的按钮?xml version1.0 encodingutf-8? RelativeLayout xmlns:androidhttp://schemas.android.com/apk/res/android android:layout_widthmatch_parent android:layout_heightmatch_parent ImageButton android:idid/button android:layout_widthwrap_content android:layout_heightwrap_content android:layout_centerInParenttrue android:layout_margin10dp android:srcdrawable/im android:backgroundandroid:color/transparent/ ImageButton android:idid/button1 android:layout_widthwrap_content android:layout_heightwrap_content android:layout_centerInParenttrue android:layout_margin10dp android:visibilityinvisible android:srcdrawable/i android:backgroundandroid:color/transparent/ ImageButton android:idid/button2 android:layout_widthwrap_content android:layout_heightwrap_content android:layout_centerInParenttrue android:layout_margin10dp android:srcdrawable/ii android:visibilityinvisible android:backgroundandroid:color/transparent/ ImageButton android:idid/button3 android:layout_widthwrap_content android:layout_heightwrap_content android:layout_centerInParenttrue android:layout_margin10dp android:srcdrawable/iii android:visibilityinvisible android:backgroundandroid:color/transparent/ ImageButton android:idid/button4 android:layout_widthwrap_content android:layout_heightwrap_content android:layout_centerInParenttrue android:layout_margin10dp android:srcdrawable/iiii android:visibilityinvisible android:backgroundandroid:color/transparent / /RelativeLayout第二步MainActivitypackage com.example.boombuttons; import java.util.ArrayList; public class MainActivity extends Activity implements OnClickListener{ // 中心按钮 private ImageButton button; // 四个子按钮 private ImageButton button1; private ImageButton button2; private ImageButton button3; private ImageButton button4; // 子按钮列表 private ListImageButton buttonItems new ArrayListImageButton (3); // 标识当前按钮弹出与否1代表已经未弹出-1代表已弹出 private int flag 1; Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 实例化按钮并设立监听 button (ImageButton)findViewById(R.id.button); button.setOnClickListener(this); button1 (ImageButton)findViewById(R.id.button1); button2 (ImageButton)findViewById(R.id.button2); button3 (ImageButton)findViewById(R.id.button3); button4 (ImageButton)findViewById(R.id.button4); // 将子按钮们加入列表中 buttonItems.add(button1); buttonItems.add(button2); buttonItems.add(button3); buttonItems.add(button4); } /** * 按钮移动动画 * params 子按钮列表 * params 弹出时圆形半径radius */ public void buttonAnimation(ListImageButton buttonList,int radius){ for(int i0;ibuttonList.size();i){ ObjectAnimator objAnimatorX; ObjectAnimator objAnimatorY; ObjectAnimator objAnimatorRotate; // 将按钮设为可见 buttonList.get(i).setVisibility(View.VISIBLE); // 按钮在X、Y方向的移动距离 float distanceX (float) (flag*radius*(Math.cos(Util.getAngle(buttonList.size(),i)))); float distanceY -(float) (flag*radius*(Math.sin(Util.getAngle(buttonList.size(),i)))); // X方向移动 objAnimatorX ObjectAnimator.ofFloat(buttonList.get(i), x, buttonList.get(i).getX(),buttonList.get(i).getX()distanceX); objAnimatorX.setDuration(200); objAnimatorX.setStartDelay(100); objAnimatorX.start(); // Y方向移动 objAnimatorY ObjectAnimator.ofFloat(buttonList.get(i), y, buttonList.get(i).getY(),buttonList.get(i).getY()distanceY); objAnimatorY.setDuration(200); objAnimatorY.setStartDelay(100); objAnimatorY.start(); // 按钮旋转 objAnimatorRotate ObjectAnimator.ofFloat(buttonList.get(i), rotation, 0, 360); objAnimatorRotate.setDuration(200); objAnimatorY.setStartDelay(100); objAnimatorRotate.start(); if(flag-1){ objAnimatorX.addListener(new AnimatorListener() { Override public void onAnimationStart(Animator animation) { // TODO Auto-generated method stub } Override public void onAnimationRepeat(Animator animation) { // TODO Auto-generated method stub } Override public void onAnimationEnd(Animator animation) { // TODO Auto-generated method stub // 将按钮设为可见 for (int i 0; i buttonItems.size(); i) { buttonItems.get(i).setVisibility(View.INVISIBLE); } } Override public void onAnimationCancel(Animator animation) { // TODO Auto-generated method stub } }); } } } }第三步Util.java 工具类写了一个静态方法用于通过按钮个数和按钮在列表中的索引计算其弹出角度。public class Util { /** * 返回每个按钮应该出现的角度(弧度单位) * param index * return double 角度(弧度单位) */ public static double getAngle(int total,int index){ return Math.toRadians(90/(total-1)*index90); } }更多Android进阶指南 可以扫码 解锁《Android十大板块文档》1.Android车载应用开发系统学习指南附项目实战2.Android Framework学习指南助力成为系统级开发高手3.2023最新Android中高级面试题汇总解析告别零offer4.企业级Android音视频开发学习路线项目实战附源码5.Android Jetpack从入门到精通构建高质量UI界面6.Flutter技术解析与实战跨平台首要之选7.Kotlin从入门到实战全方面提升架构基础8.高级Android插件化与组件化含实战教程和源码9.Android 性能优化实战360°全方面性能调优10.Android零基础入门到精通高手进阶之路敲代码不易关注一下吧。ღ( ´ᴗ )
返回列表