属性动画实现扇形圆形展开图效果
来源:互联网 发布:法律硕士有奖学金知乎 编辑:程序博客网 时间:2024/06/09 19:49
在布局文件中,我们把图片叠罗汉一样叠起来,把点击的那个图片放在布局最后,那样就可以实现展示的是哪张
public class MainActivity extends AppCompatActivity { private final String TAG = "CircleMenu"; private FrameLayout content_main; private ImageView iv8; private ImageView iv7; private ImageView iv6; private ImageView iv5; private ImageView iv4; private ImageView iv3; private ImageView iv2; private ImageView iv1; private ImageView iv18; private ImageView iv17; private ImageView iv16; private ImageView iv15; private ImageView iv14; private ImageView iv13; private ImageView iv12; private ImageView iv11;
//创建两个集合,把初始化后要实现圆形或者扇形的imageview分别存放到两个集合中
//扇形 private List<ImageView> imageViews = new ArrayList<>(); //圆形
private List<ImageView> imageViews2 = new ArrayList<>(); //扇形半径
private final int radius1 = 500;
//圆形半径 private final int radius2 = 300; private void assignViews() { //content_main = (FrameLayout) findViewById(R.id.content_main);
//初始化id并且存放到集合 iv8 = (ImageView) findViewById(R.id.iv8); imageViews.add(iv8); iv7 = (ImageView) findViewById(R.id.iv7); imageViews.add(iv7); iv6 = (ImageView) findViewById(R.id.iv6); imageViews.add(iv6); iv5 = (ImageView) findViewById(R.id.iv5); imageViews.add(iv5); iv4 = (ImageView) findViewById(R.id.iv4); imageViews.add(iv4); iv3 = (ImageView) findViewById(R.id.iv3); imageViews.add(iv3); iv2 = (ImageView) findViewById(R.id.iv2); imageViews.add(iv2); iv1 = (ImageView) findViewById(R.id.iv1); iv18 = (ImageView) findViewById(R.id.iv18); imageViews2.add(iv18); iv17 = (ImageView) findViewById(R.id.iv17); imageViews2.add(iv17); iv16 = (ImageView) findViewById(R.id.iv16); imageViews2.add(iv16); iv15 = (ImageView) findViewById(R.id.iv15); imageViews2.add(iv15); iv14 = (ImageView) findViewById(R.id.iv14); imageViews2.add(iv14); iv13 = (ImageView) findViewById(R.id.iv13); imageViews2.add(iv13); iv12 = (ImageView) findViewById(R.id.iv12); imageViews2.add(iv12); iv11 = (ImageView) findViewById(R.id.iv11); } @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); assignViews(); } @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) public void onClick(View v) { if (v.getId() == iv1.getId()) { Boolean isShowing = (Boolean) iv1.getTag(); if (null == isShowing || isShowing == false) { ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv1, "rotation", 0, 45); objectAnimator.setDuration(500); objectAnimator.start(); iv1.setTag(true); showSectorMenu(); } else { iv1.setTag(false); ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv1, "rotation", 45, 0); objectAnimator.setDuration(500); objectAnimator.start(); closeSectorMenu(); } } else if (v.getId() == iv11.getId()) { Boolean isShowing = (Boolean) iv11.getTag(); if (null == isShowing || isShowing == false) { ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv11, "rotation", 0, 45); objectAnimator.setDuration(500); objectAnimator.start(); iv11.setTag(true); showCircleMenu(); } else { iv11.setTag(false); ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(iv11, "rotation", 45, 0); objectAnimator.setDuration(500); objectAnimator.start(); closeCircleMenu(); } } else { Toast.makeText(this, "点击了第" + (imageViews.indexOf(v) == -1 ? imageViews2.indexOf(v) : imageViews.indexOf(v)) + "个", Toast.LENGTH_SHORT).show(); } } /** * 显示扇形菜单 */ @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) private void showSectorMenu() { /***第一步,遍历所要展示的菜单ImageView*/ for (int i = 0; i < imageViews.size(); i++) { PointF point = new PointF(); /***第二步,根据菜单个数计算每个菜单之间的间隔角度*/ int avgAngle = (90 / (imageViews.size() - 1)); /**第三步,根据间隔角度计算出每个菜单相对于水平线起始位置的真实角度**/ int angle = avgAngle * i; Log.d(TAG, "angle=" + angle); /** * * 圆点坐标:(x0,y0) * 半径:r * 角度:a0 * 则圆上任一点为:(x1,y1) * x1 = x0 + r * cos(ao * 3.14 /180 ) * y1 = y0 + r * sin(ao * 3.14 /180 ) */ /**第四步,根据每个菜单真实角度计算其坐标值**/ point.x = (float) Math.cos(angle * (Math.PI / 180)) * radius1; point.y = (float) -Math.sin(angle * (Math.PI / 180)) * radius1; Log.d(TAG, point.toString()); /**第五步,根据坐标执行位移动画**/ /** * 第一个参数代表要操作的对象 * 第二个参数代表要操作的对象的属性 * 第三个参数代表要操作的对象的属性的起始值 * 第四个参数代表要操作的对象的属性的终止值 */ ObjectAnimator objectAnimatorX = ObjectAnimator.ofFloat(imageViews.get(i), "translationX", 0, point.x); ObjectAnimator objectAnimatorY = ObjectAnimator.ofFloat(imageViews.get(i), "translationY", 0, point.y); /**动画集合,用来编排动画**/ AnimatorSet animatorSet = new AnimatorSet(); /**设置动画时长**/ animatorSet.setDuration(500); /**设置同时播放x方向的位移动画和y方向的位移动画**/ animatorSet.play(objectAnimatorX).with(objectAnimatorY); /**开始播放动画**/ animatorSet.start(); } } /** * 关闭扇形菜单 */ @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) private void closeSectorMenu() { for (int i = 0; i < imageViews.size(); i++) { PointF point = new PointF(); int avgAngle = (90 / (imageViews.size() - 1)); int angle = avgAngle * i; Log.d(TAG, "angle=" + angle); point.x = (float) Math.cos(angle * (Math.PI / 180)) * radius1; point.y = (float) -Math.sin(angle * (Math.PI / 180)) * radius1; Log.d(TAG, point.toString()); ObjectAnimator objectAnimatorX = ObjectAnimator.ofFloat(imageViews.get(i), "translationX", point.x, 0); ObjectAnimator objectAnimatorY = ObjectAnimator.ofFloat(imageViews.get(i), "translationY", point.y, 0); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.setDuration(500); animatorSet.play(objectAnimatorX).with(objectAnimatorY); animatorSet.start(); } } /** * 显示圆形菜单 */ @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) private void showCircleMenu() { for (int i = 0; i < imageViews2.size(); i++) { PointF point = new PointF(); int avgAngle = (360 / (imageViews2.size() - 1)); int angle = avgAngle * i; Log.d(TAG, "angle=" + angle); point.x = (float) Math.cos(angle * (Math.PI / 180)) * radius2; point.y = (float) Math.sin(angle * (Math.PI / 180)) * radius2; Log.d(TAG, point.toString()); ObjectAnimator objectAnimatorX = ObjectAnimator.ofFloat(imageViews2.get(i), "translationX", 0, point.x); ObjectAnimator objectAnimatorY = ObjectAnimator.ofFloat(imageViews2.get(i), "translationY", 0, point.y); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.setDuration(500); animatorSet.play(objectAnimatorX).with(objectAnimatorY); animatorSet.start(); } } /** * 关闭圆形菜单 */ @RequiresApi(api = Build.VERSION_CODES.HONEYCOMB) private void closeCircleMenu() { for (int i = 0; i < imageViews2.size(); i++) { PointF point = new PointF(); int avgAngle = (360 / (imageViews2.size() - 1)); int angle = avgAngle * i; Log.d(TAG, "angle=" + angle); point.x = (float) Math.cos(angle * (Math.PI / 180)) * radius2; point.y = (float) Math.sin(angle * (Math.PI / 180)) * radius2; Log.d(TAG, point.toString()); ObjectAnimator objectAnimatorX = ObjectAnimator.ofFloat(imageViews2.get(i), "translationX", point.x, 0); ObjectAnimator objectAnimatorY = ObjectAnimator.ofFloat(imageViews2.get(i), "translationY", point.y, 0); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.setDuration(500); animatorSet.play(objectAnimatorX).with(objectAnimatorY); animatorSet.start(); } }
关于扇形图的算法,有点小复杂所以我给大家做了一个思维图,相信大家应该都可以看懂
阅读全文
0 0
- 属性动画实现扇形圆形展开图效果
- Android 属性动画实现的扇形菜单效果
- 实现底部扇形展开菜单效果
- 实现底部扇形展开菜单效果
- Circular Reveal圆形展开缩放属性动画
- 【Android界面实现】实现底部扇形展开菜单效果
- 【Android界面实现】实现底部扇形展开菜单效果
- Swift-贝赛尔曲线画扇形、弧线、圆形、多边形——UIBezierPath实现App下载时的动画效果
- 圆形进度条动画效果实现
- Android 圆形展开动画
- 圆形展开/关闭动画
- 每日一学(十二)Android动画---属性动画(圆形菜单、扇形菜单)
- Android属性动画应用超简单代码打造酷炫扇形(卫星),圆形菜单
- Android属性动画应用超简单代码打造酷炫扇形(卫星),圆形菜单
- Android TextView实现点击展开动画效果
- TextView展开加动画效果实现
- 仿扇形菜单动画效果
- 仿扇形菜单动画效果
- 最小的k个数
- 对象方法的小例子
- 转鸟哥建议:让PHP7达到最高性能的几个建议
- maven初学:用maven将工程打包,maven项目引用jar包
- eclipse左边导航(菜单栏)package explorer自动定位(跟随打开的代码变化位置)、导航栏消失找不到解决
- 属性动画实现扇形圆形展开图效果
- text和blob
- Windows下通过VMware虚拟机安装Ubuntu(Linux)及常见问题解决
- Fresco实践总结-高斯模糊、圆形圆角、URL、File、Assets、Resource
- Ubuntu系统下的第一个django项目
- 泛型
- 什么是Java虚拟机?为什么Java被称为平台无关的编程语言
- android 获取手机运行的进程
- JS常用的时间方法总结