【Animations】创建一个自定义过渡动画(11)

原文

概要


自定义转换使您能够创建任何内置转换类都无法提供的动画。例如,您可以定义自定义转场,将文本和输入字段的前景色变为灰色,以指示在新屏幕中禁用字段。这种更改有助于用户查看您禁用的字段。

自定义转换,就像其中一种内置转换类型一样,将动画应用于开始和结束场景的子视图。但是,与内置的转换类型不同,您必须提供捕获属性值并生成动画的代码。您可能还想为动画定义目标视图的子集。

此页面将教您捕获属性值并生成动画以创建自定义转场

扩展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) {}
}

以下各节介绍如何覆盖这些方法。

捕获视图属性值


过渡动画使用中所描述的属性动画系统 属性动画。属性动画更改指定时间段内开始和结束值之间的视图属性,因此框架需要同时具有属性的开始和结束值以构建动画。

但是,属性动画通常只需要视图属性值的一小部分。例如,彩色动画需要颜色属性值,而移动动画需要位置属性值。由于动画所需的属性值是特定于转换的,因此转换框架不会为转换提供每个属性值。相反,框架调用回调方法,允许转换只捕获它需要的属性值并将它们存储在框架中。

捕获起始值

要将起始视图值传递给框架,请实施该 captureStartValues(transitionValues) 方法。框架为起始场景中的每个视图调用此方法。方法参数是一个TransitionValues对象,它包含对视图的引用以及Map可以存储所需视图值的实例。在您的实现中,检索这些属性值并将它们存储在地图中,将它们传回框架。

要确保属性值的密钥不与其他TransitionValues密钥冲突,请使用以下命名方案:

package_name:transition_name:property_name

以下代码片段显示了该captureStartValues()方法的实现:

扫描二维码关注公众号,回复: 1064093 查看本文章
public class CustomTransition extends Transition {

    // Define a key for storing a property value in
    // TransitionValues.values with the syntax
    // package_name:transition_class:property_name to avoid collisions
    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);
    }

    // For the view in transitionValues.view, get the values you
    // want and put them in transitionValues.values
    private void captureValues(TransitionValues transitionValues) {
        // Get a reference to the view
        View view = transitionValues.view;
        // Store its background property in the values map
        transitionValues.values.put(PROPNAME_BACKGROUND, view.getBackground());
    }
    ...
}

捕获结束值

框架captureEndValues(TransitionValues)为结束场景中的每个目标视图调用一次该方法。在所有其他方面,captureEndValues()作品与之相同captureStartValues()。

以下代码片段显示了该captureEndValues()方法的实现:

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

在这个例子中,captureStartValues()和captureEndValues() 方法都会调用captureValues()来检索和存储值。captureValues()检索的视图属性是相同的,但它在起始和结束场景中具有不同的值。该框架为视图的开始和结束状态维护单独的映射

创建一个自定义动画师


要在视图的起始场景中的状态和结束场景中的状态之间对视图的更改进行动画制作,请通过覆盖该createAnimator()方法来提供动画制作工具。当框架调用此方法时,它将传入场景根视图以及TransitionValues包含您捕获的开始值和结束值的对象。

框架调用createAnimator()方法的次数取决于开始和结束场景之间发生的变化。例如,考虑将淡入/淡入动画实现为自定义转换。如果起始场景有五个目标,其中两个从结束场景中移除,并且结束场景有来自起始场景的三个目标加上一个新目标,则该框架将调用createAnimator()六次:三次调用使淡出和淡入停留在两个景物中的目标; 另外两个调用动画化从结束场景中移除的目标的淡出; 并且一个呼叫为结束场景中新目标的淡入提供动画。

对于开始和结束场景中都存在的目标视图,框架为参数和 参数提供了一个TransitionValues对象。对于只存在于开始或结束场景中的目标视图,框架为相应的参数和另一个参数提供一个对象。startValuesendValuesTransitionValuesnull

要createAnimator(ViewGroup, TransitionValues, TransitionValues)在创建自定义转场时实施该方法,请使用捕获的视图属性值来创建Animator对象并将其返回给框架。有关示例实现,请参阅 CustomTransition示例中的类。有关属性动画师的更多信息,请参阅 属性动画【原】ChangeColor【原】

应用自定义转场


自定义转换与内置转换相同。您可以使用转场管理器应用自定义转场,如应用转场中所述

Lastest Update:2018.04.25

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

【Animations】创建一个自定义过渡动画(11)

猜你喜欢

转载自blog.51cto.com/4789781/2120988