android 利用属性动画实现酷炫的圆形菜单

2024-05-13 17:38

本文主要是介绍android 利用属性动画实现酷炫的圆形菜单,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

废话不哆嗦,直接上代码,反正也差不多没人看,就自己记录下咯




package com.example.testroundmenu;import android.animation.ObjectAnimator;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.Toast;public class Main extends Activity {//下标分别是从下到上,从左到右private RelativeLayout rl_1, rl_2, rl_3;private ImageView iv_rl1_home, iv_rl2_1, iv_rl2_2, iv_rl2_3, iv_rl3_1,iv_rl3_2, iv_rl3_3, iv_rl3_4, iv_rl3_5, iv_rl3_6, iv_rl3_7;private boolean isMidleMenuShow = true;private boolean isOutMenuShow = true;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.main);initView();}private void initView() {MyListener listener = new MyListener();// 初始化控件,简单起见,并没有直接在xml中声明点击函数rl_1 = (RelativeLayout) findViewById(R.id.rl_1);rl_2 = (RelativeLayout) findViewById(R.id.rl_2);rl_3 = (RelativeLayout) findViewById(R.id.rl_3);iv_rl1_home = (ImageView) findViewById(R.id.iv_home);iv_rl2_1 = (ImageView) findViewById(R.id.iv_search);iv_rl2_2 = (ImageView) findViewById(R.id.iv_menu);iv_rl2_3 = (ImageView) findViewById(R.id.iv_myyouku);iv_rl3_1 = (ImageView) findViewById(R.id.iv_out_1);iv_rl3_2 = (ImageView) findViewById(R.id.iv_out_2);iv_rl3_3 = (ImageView) findViewById(R.id.iv_out_3);iv_rl3_4 = (ImageView) findViewById(R.id.iv_out_4);iv_rl3_5 = (ImageView) findViewById(R.id.iv_out_5);iv_rl3_6 = (ImageView) findViewById(R.id.iv_out_6);iv_rl3_7 = (ImageView) findViewById(R.id.iv_out_7);// 添加点击监听iv_rl1_home.setOnClickListener(listener);iv_rl2_1.setOnClickListener(listener);iv_rl2_2.setOnClickListener(listener);iv_rl2_3.setOnClickListener(listener);iv_rl3_1.setOnClickListener(listener);iv_rl3_2.setOnClickListener(listener);iv_rl3_3.setOnClickListener(listener);iv_rl3_4.setOnClickListener(listener);iv_rl3_5.setOnClickListener(listener);iv_rl3_6.setOnClickListener(listener);iv_rl3_7.setOnClickListener(listener);}/*** @author kk_imgod imageview 的监听函数*/public class MyListener implements OnClickListener {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch (v.getId()) {case R.id.iv_home:if (isMidleMenuShow) {isMidleMenuShow = false;animatrHiden(rl_2, 500);//如果最外层的菜单还在显示的话,那就一起隐藏if(isOutMenuShow) {animatrHiden(rl_3, 1000);isOutMenuShow = false;} } else {isMidleMenuShow = true;animatrShow(rl_2, 500);}showToast("HOME");break;case R.id.iv_menu:showToast("我的菜单");if(isOutMenuShow) {animatrHiden(rl_3, 1000);isOutMenuShow = false;} else {animatrShow(rl_3, 1000);isOutMenuShow = true;}break;case R.id.iv_search:showToast("我的搜索");break;case R.id.iv_myyouku:showToast("我的优酷");break;case R.id.iv_out_1:showToast("第一个");break;case R.id.iv_out_2:showToast("第二个");break;case R.id.iv_out_3:showToast("第三个");break;case R.id.iv_out_4:showToast("第四个");break;case R.id.iv_out_5:showToast("第五个");break;case R.id.iv_out_6:showToast("第六个");break;case R.id.iv_out_7:showToast("第七个");break;default:break;}}}/*** @param text*            显示吐司的文本*/public void showToast(String text) {Toast.makeText(Main.this, text, Toast.LENGTH_SHORT).show();}/*** 让视图动画显示出来,180-360度*/public void animatrShow(View view, long durction) {ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view,"rotation", 180f, 360f );//设置旋转点view.setPivotX(view.getWidth() / 2);view.setPivotY(view.getHeight());objectAnimator.setDuration(durction).start();}/*** 让视图动画隐藏起来 0-180度*/public void animatrHiden(View view, long durction) {ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(view,"rotation", 0f, 180f);//设置动画的旋转点view.setPivotX(view.getWidth() / 2);view.setPivotY(view.getHeight());objectAnimator.setDuration(durction).start();}//下面的这种隐藏和显示动画的效果是传统动画,没有交互效果/*** @param view 0-180让视图隐藏*/public static void startAnimout(RelativeLayout view) {// TODO Auto-generated method stubRotateAnimation rotateAnimation = new RotateAnimation(0, 180,view.getWidth() / 2, view.getHeight());rotateAnimation.setDuration(500);rotateAnimation.setFillAfter(true);view.startAnimation(rotateAnimation);}/*** @param view 180-360让视图出现*/public static void startAnimin(RelativeLayout view) {// TODO Auto-generated method stubRotateAnimation rotateAnimation = new RotateAnimation(180, 360,view.getWidth() / 2, view.getHeight());rotateAnimation.setDuration(500);rotateAnimation.setFillAfter(true);view.startAnimation(rotateAnimation);}
}
关键性代码:设置旋转点

//设置旋转点view.setPivotX(view.getWidth() / 2);view.setPivotY(view.getHeight());

资源以及demo的地址: DEMO

这篇关于android 利用属性动画实现酷炫的圆形菜单的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/986374

相关文章

Python使用python-can实现合并BLF文件

《Python使用python-can实现合并BLF文件》python-can库是Python生态中专注于CAN总线通信与数据处理的强大工具,本文将使用python-can为BLF文件合并提供高效灵活... 目录一、python-can 库:CAN 数据处理的利器二、BLF 文件合并核心代码解析1. 基础合

Python使用OpenCV实现获取视频时长的小工具

《Python使用OpenCV实现获取视频时长的小工具》在处理视频数据时,获取视频的时长是一项常见且基础的需求,本文将详细介绍如何使用Python和OpenCV获取视频时长,并对每一行代码进行深入解析... 目录一、代码实现二、代码解析1. 导入 OpenCV 库2. 定义获取视频时长的函数3. 打开视频文

golang版本升级如何实现

《golang版本升级如何实现》:本文主要介绍golang版本升级如何实现问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录golanwww.chinasem.cng版本升级linux上golang版本升级删除golang旧版本安装golang最新版本总结gola

SpringBoot中SM2公钥加密、私钥解密的实现示例详解

《SpringBoot中SM2公钥加密、私钥解密的实现示例详解》本文介绍了如何在SpringBoot项目中实现SM2公钥加密和私钥解密的功能,通过使用Hutool库和BouncyCastle依赖,简化... 目录一、前言1、加密信息(示例)2、加密结果(示例)二、实现代码1、yml文件配置2、创建SM2工具

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分

MySQL 定时新增分区的实现示例

《MySQL定时新增分区的实现示例》本文主要介绍了通过存储过程和定时任务实现MySQL分区的自动创建,解决大数据量下手动维护的繁琐问题,具有一定的参考价值,感兴趣的可以了解一下... mysql创建好分区之后,有时候会需要自动创建分区。比如,一些表数据量非常大,有些数据是热点数据,按照日期分区MululbU

MySQL中查找重复值的实现

《MySQL中查找重复值的实现》查找重复值是一项常见需求,比如在数据清理、数据分析、数据质量检查等场景下,我们常常需要找出表中某列或多列的重复值,具有一定的参考价值,感兴趣的可以了解一下... 目录技术背景实现步骤方法一:使用GROUP BY和HAVING子句方法二:仅返回重复值方法三:返回完整记录方法四:

IDEA中新建/切换Git分支的实现步骤

《IDEA中新建/切换Git分支的实现步骤》本文主要介绍了IDEA中新建/切换Git分支的实现步骤,通过菜单创建新分支并选择是否切换,创建后在Git详情或右键Checkout中切换分支,感兴趣的可以了... 前提:项目已被Git托管1、点击上方栏Git->NewBrancjsh...2、输入新的分支的

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方