Leanback自定义动画:如何修改项/行缩放动画的速度、延迟及配置文件?
嘿,我来帮你搞定Leanback里项/行的缩放动画速度和延迟问题!分两种方案给你讲,优先推荐用样式实现(这应该是你想要的更优雅的方式),之后再讲直接修改动画文件的方式~
方法一:通过样式(Theme)调整动画参数
Leanback的列表项、行的缩放动画,其实可以通过主题属性来覆盖默认配置,不用动源码,这也符合Android的样式规范。
- 第一步,在
res/values/styles.xml里创建自定义主题,继承Leanback的官方主题:
<style name="CustomLeanbackTheme" parent="Theme.Leanback"> <!-- 覆盖项的缩放进入动画 --> <item name="lbItemZoomInAnimator">@anim/custom_item_zoom_in</item> <!-- 覆盖项的缩放退出动画 --> <item name="lbItemZoomOutAnimator">@anim/custom_item_zoom_out</item> <!-- 如果要调整整行的动画,用这两个属性 --> <item name="lbRowZoomInAnimator">@anim/custom_row_zoom_in</item> <item name="lbRowZoomOutAnimator">@anim/custom_row_zoom_out</item> </style>
- 第二步,创建自定义动画文件。比如先复制Leanback默认的
item_zoom_in.xml内容,粘贴到你项目的res/anim/custom_item_zoom_in.xml里,然后修改duration(控制速度,数值越小动画越快)和startOffset(控制延迟):
<set xmlns:android="http://schemas.android.com/apk/res/android"> <objectAnimator android:propertyName="scaleX" android:valueFrom="0.8" android:valueTo="1.0" android:duration="250" <!-- 默认是400ms,改小就变快 --> android:startOffset="50" <!-- 延迟50ms执行 --> android:interpolator="@android:interpolator/decelerate_cubic" /> <objectAnimator android:propertyName="scaleY" android:valueFrom="0.8" android:valueTo="1.0" android:duration="250" android:startOffset="50" android:interpolator="@android:interpolator/decelerate_cubic" /> <objectAnimator android:propertyName="alpha" android:valueFrom="0.0" android:valueTo="1.0" android:duration="250" android:startOffset="50" android:interpolator="@android:interpolator/decelerate_cubic" /> </set>
注意:默认动画是同时缩放X/Y和调整透明度的组合动画,所以要保持这个结构,只修改每个objectAnimator的参数就行。
- 最后,把这个自定义主题应用到你的Leanback Activity上,在
AndroidManifest.xml里修改:
<activity android:name=".YourLeanbackActivity" android:theme="@style/CustomLeanbackTheme" />
方法二:直接修改ObjectAnimator/anim.xml文件
如果你需要更直接的修改(比如不想通过主题覆盖),可以复制Leanback默认的动画文件到自己项目,然后调整参数:
先找到Leanback库中的默认动画文件,比如:
- 项缩放进入:
item_zoom_in.xml - 项缩放退出:
item_zoom_out.xml - 行缩放进入:
row_zoom_in.xml - 行缩放退出:
row_zoom_out.xml
你可以通过Android Studio的依赖库查看(比如在External Libraries里找到Leanback的aar,展开就能看到这些文件)。
- 项缩放进入:
把这些文件复制到你项目的
res/anim目录下,然后修改里面的android:duration和android:startOffset属性。比如调整行的缩放动画custom_row_zoom_in.xml:
<set xmlns:android="http://schemas.android.com/apk/res/android"> <objectAnimator android:propertyName="scaleX" android:valueFrom="0.95" android:valueTo="1.0" android:duration="300" android:interpolator="@android:interpolator/decelerate_cubic" /> <objectAnimator android:propertyName="scaleY" android:valueFrom="0.95" android:valueTo="1.0" android:duration="300" android:interpolator="@android:interpolator/decelerate_cubic" /> </set>
- 修改完后,你可以在代码里直接引用这些动画,或者通过主题属性关联(和方法一一样)。
额外小提示
- 插值器(
interpolator)也会影响动画的快慢感受,比如decelerate_cubic是先快后慢,accelerate_cubic是先慢后快,你可以根据需求替换。 - 如果需要动态调整动画参数(比如根据用户设置变化),可以在代码里手动创建
ObjectAnimator和AnimatorSet,比如:
// 给某个列表项设置自定义缩放动画 AnimatorSet zoomInSet = new AnimatorSet(); ObjectAnimator scaleX = ObjectAnimator.ofFloat(itemView, "scaleX", 0.8f, 1.0f); scaleX.setDuration(300); scaleX.setStartOffset(100); ObjectAnimator scaleY = ObjectAnimator.ofFloat(itemView, "scaleY", 0.8f, 1.0f); scaleY.setDuration(300); scaleY.setStartOffset(100); zoomInSet.playTogether(scaleX, scaleY); zoomInSet.start();
内容的提问来源于stack exchange,提问作者sergii.gudym
相关产品推荐
相关产品推荐

