Animation.setFillAfter and Animation.setFillBefore的作用

本文解析了Android中动画填充方法setFillAfter和setFillBefore的作用原理,指出这些方法仅影响动画状态而非视图位置,并介绍了如何通过修改视图属性来保持动画结束后的效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



转:http://blog.youkuaiyun.com/yangweigbh/article/details/9788531

setFillAfter(boolean fillAfter)  在Android developer上的文档:

If fillAfter is true, the transformation that this animation performed will persist when it is finished.

但是,animation只是操作View 的位图表示(bitmap representation),而不是真正的改变View的位置

动画结束后,View回到了原来的位置,setFillAfter 和 setFillBefore 并不能解决这个问题,要使View保持动画结束时的状态,必须另外改变View的属性(动画并不会帮助你改变View的属性),setFillAfter 和 setFillBefore 只能改变动画的属性

为什么会有setFillAfter 和 setFillBefore这两个方法:

是因为有动画链的原因,假定你有一个移动的动画紧跟一个淡出的动画,如果你不把移动的动画的setFillAfter置为true,那么移动动画结束后,View会回到原来的位置淡出,如果setFillAfter置为true, 就会在移动动画结束的位置淡出

### Animation.RELATIVE_TO_PARENT 的作用和使用方式详解 在 Android 的传统视图动画系统中,`Animation.RELATIVE_TO_PARENT` 是用于指定动画参数相对于父容器的坐标系统的常量。与 `Animation.RELATIVE_TO_SELF` 和绝对坐标不同,`RELATIVE_TO_PARENT` 的参考系是动画所作用的 View 的直接父容器,这意味着动画的偏移量将基于父容器的尺寸进行比例计算。 #### 使用方式与参数说明 以 `TranslateAnimation` 为例,该类的构造函数允许传入多个参数来定义动画的起始与结束位置。其中每个位置参数都需要指定其参考系: ```java TranslateAnimation(int fromXType, float fromXValue, int toXType, float toXValue, int fromYType, float fromYValue, int toYType, float toYValue) ``` 在构造动画时,可以将 `fromXType`、`toXType` 等设置为 `Animation.RELATIVE_TO_PARENT`,表示这些值是相对于父容器的尺寸比例。例如: ```java TranslateAnimation translateAnimation = new TranslateAnimation( Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_SELF, 0, Animation.RELATIVE_TO_PARENT, 0.5f ); ``` 上述代码表示动画从当前自身位置开始(`Animation.RELATIVE_TO_SELF`),Y 轴方向上移动到父容器高度的 50% 位置(`Animation.RELATIVE_TO_PARENT`)[^1]。 #### 动画行为特性 当使用 `Animation.RELATIVE_TO_PARENT` 时,动画的数值通常是一个比例值(0.0 到 1.0 之间),代表相对于父容器的尺寸。例如: - `0.0f` 表示与父容器左上角对齐; - `0.5f` 表示与父容器中心点对齐; - `1.0f` 表示与父容器右下角对齐。 这种特性使得动画能够根据父容器的实际尺寸进行动态适配,适用于不同屏幕或布局尺寸的场景。 #### 与其他参考系的对比 - **`Animation.RELATIVE_TO_SELF`**:动画参数基于 View 自身的尺寸,常用于实现缩放、平移等相对自身的行为; - **`Animation.RELATIVE_TO_PARENT`**:动画参数基于父容器的尺寸,适用于需要基于父级布局进行对齐或移动的场景; - **绝对坐标**:不依赖任何参考系,直接指定像素值,但缺乏灵活性。 #### 示例代码:基于父容器的平移动画 以下是一个完整的示例,展示如何使用 `Animation.RELATIVE_TO_PARENT` 实现一个从当前 View 位置平移到父容器中心的动画: ```java View view = findViewById(R.id.my_view); ViewGroup parent = (ViewGroup) view.getParent(); TranslateAnimation animation = new TranslateAnimation( Animation.RELATIVE_TO_SELF, 0.0f, // 从当前自身位置开始 Animation.RELATIVE_TO_PARENT, 0.5f, // 移动到父容器的水平中心 Animation.RELATIVE_TO_SELF, 0.0f, // 从当前 Y 位置开始 Animation.RELATIVE_TO_PARENT, 0.5f // 移动到父容器的垂直中心 ); animation.setDuration(1000); animation.setFillAfter(true); view.startAnimation(animation); ``` 上述代码中,View 会从当前位置平滑移动到父容器的中心位置,且动画结束后保持在最终位置。 #### 注意事项 - **比例单位的使用**:`Animation.RELATIVE_TO_PARENT` 的值是基于父容器尺寸的比例,因此 0.5f 表示 50%,即父容器的一半; - **性能与兼容性**:该模式适用于传统的 View 动画系统,但在现代开发中,更推荐使用属性动画(如 `ObjectAnimator`),因为其能更灵活地控制 View 的实际属性; - **动画的叠加与组合**:可以与其他动画模式(如 `Animation.RELATIVE_TO_SELF`)结合使用,并通过 `AnimationSet` 实现更复杂的动画效果。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值