Android自定控件之动画总结(一)
前言
Android的动画实现主要有三种,帧动画、补间动画、属性动画。帧动画和补间动画很早之前就有了,但是它们两存在局限性,很多功能都是实现不了,于是就有了属性动画,属性动画相比较于前两者,能够很方便地实现我们想要的动画效果。
帧动画
帧动画顾名思义就是将预先设置的一组图片逐帧的播放出来,我们需要在drawable文件夹里面自己添加xml资源文件,然后是由animation-list标签以及他的的子标签item。
然后子啊activity文件里面使用AnimationDrawable类,通过(animationDrawable = (AnimationDrawable)imageView.getbackground())得到animationDrawable对象,使用start()和stop()就可以对帧动画进行控制了。
补间动画
补间动画主要有一下四种操作,alpha、scale、translate、rotate,我们通过在res资源文件里面创建anim文件夹,然后根据需要创建对应的xml动画资源文件。每一个文件可以单独对应一种动画类型,同时也可以对应多个动画类型。对应多个动画类型需要用到set标签,使用方式如下;
<?xml version="1.0" encoding="utf-8" ?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:shareInterpolator="true">
<scale
android:pivotY="50%"
android:pivotX="50%"
android:fromXScale="0"
android:fromYScale="0"
android:toYScale="1"
android:toXScale="1"
android:duration="1000"/>
<!-- 会覆盖前面的scale动画-->
<scale
android:pivotY="50%"
android:pivotX="50%"
android:fromXScale="1"
android:fromYScale="1"
android:toYScale="0"
android:toXScale="0"
android:duration="1000"/>
<alpha
android:fromAlpha="0"
android:toAlpha="1"
android:duration="1000"/>
</set>
在java代码里面主要用到Animation这个类,然后使用AnimationUtils.loadAnimation(this, R.anim.xxx)来创建Animation实例对象。最后通过控件的startAnimation方法开始动画效果。
以上对于补间动画的叙述是关于如何静态使用补间动画的方法,相对应的还有动态使用补间动画的方法,前者比较后者显得更加方便,调用简介,特别是在一个动画效果需要调用多次的情况下,静态创建更好。而动态创建自然也有它的好处,就是可以根据需求动态的创建我们需要的动画,这样的话就不会有太多的局限。不管的使用哪一种方式,根据目前的需要选择性的创建才是明智的。
对于动态创建这里就不罗嗦,只需要知道alpha、scale、rotate、translate对应的类分别是AlphaAnimation、Scale Animation、Rotate Animation、TranslateAnimation。
属性动画
属性动画是现在用的比较多的。同样的属性动画也有静态创建和动态创建两种方法。
这里需要了解到ValueAnimator、ObjectAnimator、PropertyValuesHolder、AnimatorSet、这四个类,以及他们之间的用法。
public void Onstart(View view){
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 400);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int curint = (int)valueAnimator.getAnimatedValue();
tv1.layout(curint, curint, curint + tv1.getWidth(), curint + tv1.getHeight());
//根据上面OfFloat方法里面参数相应的设置tv1.setText() tv1.setBackground()、、、、
}
});
valueAnimator.setDuration(2000);
valueAnimator.start();
}
ValueAnimator用的比较少
public void OnStart(View View){
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(tv1, "translationY", 0f, 400f);
objectAnimator.setDuration(2000);
objectAnimator.setInterpolator(new BounceInterpolator());
objectAnimator.start();
}
ObjectAnimator也可以设置监听,它有两种监听,一种和ValueAnimator一样,一种是Animator.AnimatorListener接口。两者监听的功能不一样,同时后者也可以用AnimatorListenerAdapter代替。
//创建PropertyValuesHolder实例
PropertyValuesHolder valuesHolder1 = PropertyValuesHolder.ofInt("backgroundColor", 0xffff00ff, 0xffffff00, 0xff0000ff);
valuesHolder1.setEvaluator(new ArgbEvaluator());
PropertyValuesHolder valuesHolder2 = PropertyValuesHolder.ofFloat("scaleX", 0f, 2f, 0f, 3f, 1f);
PropertyValuesHolder valuesHolder3 = PropertyValuesHolder.ofFloat("scaleY", 0f, 2f, 0f, 3f, 1f);
//将创建PropertyValuesHolder实例添加到ObjectAnimator中
ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(mTextView1, valuesHolder1, valuesHolder2, valuesHolder3);
objectAnimator.setDuration(2000);
objectAnimator.start();
PropertyValuesHolder的意义就是保存动画过程中所需要的属性和值,其实ofInt()和ofFloat()的内部实现就是通过封装PropertyValuesHolder实例来保存动画状态的,后面的操作也是以PropertyValuesHolder为主。
public void OnStart(View view){
ObjectAnimator objectAnimator1 = ObjectAnimator.ofFloat(tv1, "rotation", 0f, 360f);
ObjectAnimator objectAnimator2 = ObjectAnimator.ofFloat(tv1, "translationY", 0f, 400f);
ObjectAnimator objectAnimator3 = ObjectAnimator.ofInt(tv2, "BackgroundColor",0xffffff, 0x000000);
objectAnimator1.setDuration(1000000);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.setDuration(2000);//会覆盖objectAnimator1的设置。
//按顺序播放
// animatorSet.playSequentially(objectAnimator1, objectAnimator2, objectAnimator3);
//同时播放
// animatorSet.playTogether(objectAnimator1, objectAnimator2, objectAnimator3);
//既有同时播放又有顺序播放
AnimatorSet.Builder builder = animatorSet.play(objectAnimator1);
builder.with(objectAnimator2).after(objectAnimator3);
//也可以写成这样
animatorSet.play(objectAnimator1).with(objectAnimator2).after(objectAnimator3);
}
静态创建
我们只要记住这个,就能很好的理解了。
<animator />:对应ValueAnimator
<objectAnimator />:对应ObjectAnimator
<set />:对应AnimatorSet
以其中的的objectAnimator为例说明一下。先在res文件夹里面创建见animator文件夹,然后创建相应的资源文件。如下所示:
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@android:anim/bounce_interpolator"
android:propertyName="BackgroundColor"
android:duration="2000"
android:valueFrom="#000000"
android:valueTo="#999999"
android:valueType="colorType" />
然后再java代码这样实现
public void onStart(View view ){
objectAnimator = (ObjectAnimator) AnimatorInflater.loadAnimator(this, R.animator.object_animator);
objectAnimator.setTarget(tv1);
objectAnimator.start();
}
最后
由于Android动画有太多的内容,这里只是大概的讲了一下里面的东西,想要深入必须了解其实现的细节。特别时属性动画,需要熟悉各种插值器、Evaluate等等,还有属性动画的实现的过程。
上一篇: python day4
下一篇: LeetCode9. 回文数
推荐阅读
-
Android自定义View圆形百分比控件(一)
-
Android自定义view Path 的高级用法之搜索按钮动画
-
Android进阶之绘制-自定义View完全掌握(一)
-
Android开发笔记之:如何安全中止一个自定义线程Thread的方法
-
Android自定义控件之可拖动控制的圆环控制条实例代码
-
android之视频播放系统VideoView和自定义VideoView控件的应用
-
Android自定义控件之圆形、圆角ImageView
-
Android开发自定义控件之折线图实现方法详解
-
Android开发之自定义星星评分控件RatingBar用法示例
-
Android自定义view之围棋动画效果的实现