Transitions框架学习(三)—— 自定义转场

自定义转场可以用来创建一个使用内置转场无法提供的转场效果。例如,可以定义一个自定义转场效果将文字的前景色和输入框置灰来表明这个输入框是不可用的。这种方式能帮助用户发现不可用的输入框。

一个自定义转场同内置转场一样,同时对开始场景和结束场景的view添加动画效果。与内置转场类型不同的是,必须提供捕捉属性值并产生动画效果的代码。可能同时也要设置执行动画效果的目标对象集。

本节讲解如何捕捉属性值产生动画来实现一个自定义的转场效果。

扩展Transition类

要创建一个自定义的战场,继承Transition类并且重写以下代码中的方法即可:

public class CustomTransition extends Transition {

    @Override
    public void captureStartValues(TransitionValues values) {}

    @Override
    public void captureEndValues(TransitionValues values) {}

    @Override
    public Animator createAnimator(ViewGroup sceneRoot,
                                   TransitionValues startValues,
                                   TransitionValues endValues) {}
}

接下来介绍如何重写这些代码。

捕捉View属性值

转场动画使用的是属性动画系统。属性动画系统在给定的时间内,按照设定的开始值和结束值不断改变View的状态来产生动画效果。,所以框架需要初始值和结束值来创建动画。

但是一个属性动画通常只需要view的所有属性中的一小部分。例如,一个颜色动画需要颜色属性,一个位移动画需要一个为指数型。由于每个转场效果所需要的属性值可能都不同,因此框架没有将所有属性都提供给转场使用。框架将调用回调方法使得转场可以仅捕捉所需要的那些属性,然后保存到框架中。

捕捉初始值

要向框架传递初始值,实现captureStartValues(transitionValues)方法。框架在开始场景对每个View调用该方法。其中的TransitionValues参数中包含view对象和一个用于存储所需属性值的Map实例。在自定义实现中,可以获取这些属性值并把它们存回map中。

为了保证属性键值不会与其他TransitionValues的键值冲突,请使用如下格式的名称:

package_name:transition_name:property_name

以下代码展示了如何时间captureStartValues方法:

public class CustomTransition extends Transition {
    // 定义了用于在TransitionValues中保存属性值的键值,使用了
    // 刚才提到的命名方式
    private static final String PROPNAME_BACKGROUND =         "com.example.android.customtransition:CustomTransition:background";

    @Override
    public void captureStartValues(TransitionValues transitionValues) {
        // Call the convenience method captureValues
        captureValues(transitionValues);
    }

    // 对transitionValues.view,获取所需的属性,然后存放
    // 到transitionValues.values中
    private void captureValues(TransitionValues transitionValues) {
        // 获取View对象
        View view = transitionValues.view;
        // 将北京属性存入Map中
        transitionValues.values.put(PROPNAME_BACKGROUND, view.getBackground());
    }
    ...
}

捕捉结束值

框架会对结束场景中的每个view调用captureEndValues(TransitionVlalues)方法。在所有方面,该方法都与captureStartValues()类似,具体代码如下:

@Override
public void captureEndValues(TransitionValues transitionValues) {
    captureValues(transitionValues);
}

本例中captureStartValues和captrueEndValues都调用了captureValues()方法来获取和保存属性值。captureValues()获取到的View属性是相同的,但是开始场景和结束场景的数值是不同的。框架会为开始状态和结束状态分别创建map,用于保存属性值。

创建自定义动画

为了给开始场景和结束场景中的View添加动画效果,还需要重写createAnimator()方法提供一个animator对象。当框架调用该方法时,将传递两个参数:场景根视图和包含了开始场景和结束场景中捕捉到的熟知的TransitionValues对象。

框架调用createAnimator()方法的次数取决于开始场景和结束场景发生变化的次数。例如,考虑一个渐隐/渐显动画是作为一个自定义动画存在的,如果开始场景中有5个View,在结束场景中将移除其中2个,同时添加一个新的View,那么框架将调用createAnimator()方法6 次:

  • 同时存在于开始场景和结束场景内的View调用渐隐j/渐显效果,共3次。
  • 结束场景中被移除的View添加渐隐效果(共2次)
  • 结束场景中新加入的View添加渐显效果(共1次)

对于同时存在于开始场景和结束场景中的View来说。框架为初始值和结束值各自提供了一个TransitionValues对象参数。对于只在开始场景或者结束场景中存在的的View,框架提供一个TransitionValues对象,其中只有先关的TransitionValues会被添加合适的参数,另一个将被设置为null。例如对于只在开始场景中存在的View,重写createAnimator时获取到的TransitionValues对象中只有初始值列表被记录了相关数据,而结束值列表为空,因为该View已经不会显示在结束场景中。

当创建自定义转场的时候,实现createAnimator(ViewGroup, TransitionValues, TransitionValues) 方法,使用捕捉到的属性值来创建一个Animator对象并返回给狂框架。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值