Android Studio XML动画编程疑问:pivotX属性50%含义及写法推荐
关于Android动画中pivotX/Y的含义与适配性,以及程序化编写动画的方法
嘿,我来帮你把这些问题理清楚:
1. android:pivotX="50%"到底是什么意思?
你理解的“支点”概念没错,这里的50%是相对于动画目标控件自身宽度的比例——也就是说,这个支点的水平位置是控件宽度的50%处,也就是控件的水平中心。同理,android:pivotY="50%"是相对于控件自身高度的50%,也就是垂直中心。
举个例子:如果你的控件宽度是200dp,那50%对应的就是100dp的位置,刚好是控件的正中间,所以旋转动画会围绕控件中心进行,这也是最常见的旋转需求。
另外补充一下,Android里pivotX/Y还有两种写法:
50%p:这里的p代表parent,是相对于父控件的宽度/高度的比例- 绝对数值(比如
100dp):直接指定支点的绝对位置,单位可以是dp、px等
2. 百分比和dpi单位哪种写法适配性更好?
毫无疑问,百分比(不带p的50%这种)的适配性更强。原因很简单:
- 百分比是基于控件自身尺寸计算的,不管你的控件在什么分辨率、什么屏幕尺寸的设备上,支点始终会保持在你期望的相对位置(比如中心)
- 如果用dp等绝对单位,比如你设
pivotX="100dp",当控件在小屏幕设备上宽度只有150dp时,支点就会偏离中心,动画效果就会不符合预期
所以如果你的动画支点是基于控件自身的相对位置,优先用百分比写法;只有当支点需要参考父控件或者固定位置时,再考虑%p或者绝对单位。
3. 程序化编写动画的方法示例
如果你不想用XML写动画,直接在代码里实现的话,有两种常用方式:
方式一:用ObjectAnimator(推荐,Android 3.0+支持)
这是属性动画框架,功能更强大,代码也更简洁:
// 给你的目标View创建旋转动画 ObjectAnimator rotateAnimator = ObjectAnimator.ofFloat(yourTargetView, "rotation", 0f, 360f); rotateAnimator.setDuration(1000); // 设置动画时长,单位毫秒 rotateAnimator.setRepeatCount(ValueAnimator.INFINITE); // 无限重复旋转 rotateAnimator.setInterpolator(new LinearInterpolator()); // 设置匀速插值器,避免快慢变化 rotateAnimator.start(); // 启动动画
如果需要自定义支点位置,可以通过View.setPivotX()和View.setPivotY()提前设置,比如yourTargetView.setPivotX(yourTargetView.getWidth() * 0.5f)就对应XML里的50%。
方式二:用RotateAnimation(旧版视图动画API)
如果你需要兼容更低版本的系统,可以用这个:
RotateAnimation rotateAnim = new RotateAnimation( 0, 360, // 从0度转到360度 Animation.RELATIVE_TO_SELF, 0.5f, // 水平支点相对于自身的50%位置 Animation.RELATIVE_TO_SELF, 0.5f // 垂直支点相对于自身的50%位置 ); rotateAnim.setDuration(1000); rotateAnim.setRepeatCount(Animation.INFINITE); rotateAnim.setInterpolator(new LinearInterpolator()); yourTargetView.startAnimation(rotateAnim);
这里的Animation.RELATIVE_TO_SELF就对应XML里的百分比,0.5f就是50%;如果用Animation.RELATIVE_TO_PARENT,就对应XML里的%p写法。
内容的提问来源于stack exchange,提问作者Jani
相关产品推荐
相关产品推荐

