Android中实现ImageView绕固定位置而非自身轴旋转的方法
实现ImageView绕固定位置旋转的方案
你现在遇到的问题是因为当前动画里的pivotX和pivotY用了50%,这是把旋转中心设为ImageView自身的中心点了。要让它绕某个固定位置(比如父容器里的某点、或者另一个View的位置)旋转,我们只需要调整这两个参数的取值方式就行,下面给你具体的实现方法:
一、用XML配置绕父容器固定百分比位置旋转
如果你的固定位置是父容器内的某个百分比点(比如左上角、右下角),可以用%p后缀来指定相对于父容器的比例:
<?xml version="1.0" encoding="utf-8"?> <rotate xmlns:android="http://schemas.android.com/apk/res/android" android:fromDegrees="0" android:toDegrees="90" android:pivotX="0%p" <!-- 父容器X轴起始位置(左上角X) --> android:pivotY="0%p" <!-- 父容器Y轴起始位置(左上角Y) --> android:duration="1000" android:startOffset="0"> </rotate>
比如你想绕父容器的中心旋转,就把pivotX和pivotY改成50%p就行。
二、在代码里设置绝对坐标或动态位置旋转
如果固定位置是具体的像素点,或者需要绕另一个View的位置旋转,推荐在代码里动态设置动画的pivot参数,这样还能适配不同屏幕:
1. 绕固定像素点旋转
Animation rotation = AnimationUtils.loadAnimation(this, R.anim.rotate); // 假设固定旋转中心是父容器内的(500px, 500px),可以根据需求改成自己的数值 rotation.setPivotX(500); rotation.setPivotY(500); a.startAnimation(rotation);
2. 绕另一个View的位置旋转
如果要绕界面上某个View的位置旋转,先获取该View的坐标再设置:
View targetView = findViewById(R.id.your_target_view); int[] viewLocation = new int[2]; // 获取目标View在屏幕中的坐标(如果是同一父布局内,也可以用getLocationInWindow) targetView.getLocationOnScreen(viewLocation); Animation rotation = AnimationUtils.loadAnimation(this, R.anim.rotate); // 把旋转中心设为目标View的左上角坐标 rotation.setPivotX(viewLocation[0]); rotation.setPivotY(viewLocation[1]); a.startAnimation(rotation);
关键原理说明
Android的RotateAnimation中,pivotX和pivotY的取值有三种规则:
- 纯数值:表示绝对像素值,相对于父容器的左上角
%后缀:相对于当前ImageView自身的宽高百分比(比如50%就是自身中心)%p后缀:相对于父容器的宽高百分比
所以只要避开%后缀(自身比例),改用%p或者绝对数值,就能实现绕固定位置旋转啦。
内容的提问来源于stack exchange,提问作者Chralt
相关产品推荐
相关产品推荐

