Android动画2

安卓在5.0以后有一些新的动画:

  • · Touch feedback(触摸反馈)
  • · Reveal effect(揭露效果)
  • · Activity transitions(Activity转换效果)
  • · Curved motion(曲线运动)
  • · View state changes(视图状态改变)

下面一个一个的来说

1.触摸反馈

顾名思义,触摸的时候给你一个反馈,最典型的就是Button默认的水波纹了,当使用了Material主题之后,波纹动画会自动安装到所有的控件上面。当然,我们也可以设置了,上面的第一种是设置波纹有边界,第二种是设置波纹超出边界。第二种需要5.0以上才行。
这里注意:除了Button外,如果像TextView这些控件,需要给予点击事件才能够有效果。

1
2
android:background="?android:attr/selectableItemBackground"
android:background="?android:attr/selectableItemBackgroundBorderless"




如果你觉得默认的颜色丑,那么你还可以自己区设置颜色,在drawable创建一个ripple的xml文件,android:background=”在这里引用就行”;
1
2
3
<ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="#ffff00" android:radius="200dp">
<item android:drawable="@android:color/background_light"></item> <!--把这个删除掉就是第二种无边框状态-->
</ripple>

2.视图状态改变

除了这种水波纹之外,我们还可以定义自己的动画,使用android:stateListAnimator,这个东西,我们先看看效果:



像这个翻转动画就是我们自己定义的,使用这个也很简单,在animator下创建一个XML文件,看下面的代码你可会发现是一个objectAnimator,这个跟属性动画的xml编写是一样的,android:state_pressed=”true” 按下false为抬起。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
	<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true">
<set>
<objectAnimator android:duration="500" android:propertyName="rotationX" android:valueTo="360" android:valueType="floatType" />
</set>
</item>

<item android:state_pressed="false">
<set>
<objectAnimator android:duration="500" android:propertyName="rotationX" android:valueTo="0" android:valueType="floatType" />
</set>
</item>
</selector>

我们怎么使用这个动画呢?两种方法第一代码实现,第种二配置android:stateListAnimator=”@nimator/XXX.xml“

1
2
StateListAnimator stateListAnimator= AnimatorInflater.loadStateListAnimator(getApplicationContext(),R.animator.asd);
textView.setStateListAnimator(stateListAnimator);

3.揭露效果




1
2
3
4
5
6
7
Animator animator = ViewAnimationUtils.createCircularReveal(textView,
textView.getWidth()/2,
textView.getHeight()/2,
textView.getWidth(),0);
animator.setInterpolator(new AccelerateDecelerateInterpolator());
animator.setDuration(5000);
animator.start();

方法的第一个参数是你要操作的view,第二个是原中心的X方向中点,第三个是圆Y方向的中点,第四个是原开始的半径,第五个是结束时候的半径。

4.曲线运动




曲线运动很容易,就是画一个贝塞尔曲线出来,然后沿着轨迹运动,他的使用方法跟属性动画一样。
1
2
3
4
5
6
7
8
9
Path path = new Path();
path.moveTo(0, 0);
path.quadTo(200, 200,400,0);
ObjectAnimator mAnimator=ObjectAnimator.ofFloat(textView, View.X, View.Y, path);
mAnimator.setDuration(2000);
mAnimator.setEvaluator(new FloatEvaluator());
mAnimator.setRepeatCount(-1);
mAnimator.setRepeatMode(ObjectAnimator.REVERSE);
mAnimator.start();

5.Activity转换效果

在Android L之前,我们可以在startActivity之后调用overridePendingTransition来指定Activity的转场动画。现在Android L给我们带来了更绚丽的转场动画。
新的转场动画分为两大类,一种是普通的过渡动画,另一种是共享元素的过渡动画。 要想使用新的转场动画,可以继承Material Design主题后在style风格中指定:

1
2
3
4
5
6
7
8
9
10
11
12
13
<style name="DefaultTheme" parent="android:Theme.Material">
<!-- 允许使用transitions -->
<item name="android:windowContentTransitions">true</item>
<!-- 指定进入、退出、返回、重新进入时的transitions -->
<item name="android:windowEnterTransition">@transition/explode</item>
<item name="android:windowExitTransition">@transition/explode</item>
<item name="android:windowReturnTransition">@transition/explode</item>
<item name="android:windowReenterTransition">@transition/explode</item>
<!-- 指定进入、退出、返回、重新进入时的共享transitions -->
<item name="android:windowSharedElementEnterTransition">@transition/change</item>
<item name="android:windowSharedElementExitTransition">@transition/change</item>
<item name="android:windowSharedElementReturnTransition">@transition/change</item>
<item name="android:windowSharedElementReenterTransition">@transition/change</item>

也可以在activity的oncreate方法中进行代码设置:

1
2
3
4
5
6
7
8
9
10
11
12
// 允许使用transitions
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
// 指定进入、退出、返回、重新进入时的transitions
getWindow().setEnterTransition(new Explode());
getWindow().setExitTransition(new Explode());
getWindow().setEnterTransition(new Explode());
getWindow().setExitTransition(new Explode());
// 指定进入、退出、返回、重新进入时的共享transitions
getWindow().setSharedElementEnterTransition(new ChangeTransform());
getWindow().setSharedElementExitTransition(new ChangeTransform());
getWindow().setSharedElementReturnTransition(new ChangeTransform());
getWindow().setSharedElementReenterTransition(new ChangeTransform());

普通转场动画
所有继承自visibility类都可以作为进入、退出的过度动画。如果我们想自定义进入和退出时的动画效果,只需要继承Visibility,重载onAppear和onDisappear方法来定义进入喝退出的动画。系统提供了三种默认方式:

  • explode 从屏幕中心移入或移出视图
  • slide 从屏幕边缘移入或移出视图
  • fade 改变视图的透明度
    想在xml中指定自定义的进入、退出的过度动画需要先对动画进行定义:
    1
    <transition class="my.app.transition.CustomTransition"/>

注意:其中CustomTransition是你自定义的动画,它必须继承自Visibility。
想以普通转场动画的方式启动一个Activity,必须在startActivity函数中传递一个ActivityOptions的Bundle对象:

1
2
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(activity);  
startActivity(intent, options.toBundle());

如果想让返回也具备转场效果,那么在返回的Activity中不要再调用finish函数,而是应该使用finishAfterTransition来结束一个Activity,该函数会等待动画执行完毕才结束该Activity。

共享转场动画
当两个Activity具备某些相遇的元素时,共享转场动画将是一个非常好的选择。使用转场动画需要将相同的元素通过android:transitionName或者view.setTransitionName设置为相同的名称,这样系统才能区分出相同的元素。

共享转场动画支持以下共享元素:

changeBounds 对目标视图的大小进行动画
changeClipBounds 对目标视图的剪裁大小进行动画
changeTransform 对目标视图进行缩放、旋转、位移动画
changeImageTransform 对目标图片进行缩放
通过下面的函数启动一个共享元素动画:

1
2
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(activity, view, "name");  
startActivity(intent, options.toBundle());

如果有多个共享元素,则可以通过Pair进行包装处理:

1
2
ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(activity,Pair.create(view1, "name1"),Pair.create(view2, "name2"));      
startActivity(intent,.toBundle());

返回时如果需要具备转场动画,那么也需要用finish函数替代finishAfterTransition来结束一个Activity。

共享转场动画通常可以根据指定的元素判断出合适的转场动画效果,不需要我们做额外的处理,也可以通过之前学习的方法进行指定共享元素转场动画效果。

组合转场动画
我们可以把多个转场动画进行组合,作出更具个性的转场效果,在资源文件中通过以下方式:

1
2
3
4
5
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<explode/>
<transition class="my.app.transition.CustomTransition"/>
<<changeImageTransform/>
</transitionSet>

代码中我们可以通过TransitionSet类组合多个转场动画:

1
2
3
TransitionSet transitionSet = new TransitionSet();
transitionSet.addTransition(new Fade());
transitionSet.addTransition(new ChangeBounds());

组合可以同时针对普通转场动画和共享元素转场动画。

转场动画也可以像普通动画一样设置持续时间,延期执行时间,速率插入器,以及动画的监听等。

转场动画通常是对整个布局起作用,如果我们想对某个特定的view实施转场动画,可以把该view设置为转场动画的target,这样转场动画将只对特定的view起作用。共享元素的动画的target需要指定为transitionName