失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Android自定控件之动画总结(一)

Android自定控件之动画总结(一)

时间:2019-09-01 18:48:58

相关推荐

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="/apk/res/android"android:interpolator="@android:anim/accelerate_decelerate_interpolator"android:shareInterpolator="true"><scaleandroid:pivotY="50%"android:pivotX="50%"android:fromXScale="0"android:fromYScale="0"android:toYScale="1"android:toXScale="1"android:duration="1000"/><!-- 会覆盖前面的scale动画--><scaleandroid:pivotY="50%"android:pivotX="50%"android:fromXScale="1"android:fromYScale="1"android:toYScale="0"android:toXScale="0"android:duration="1000"/><alphaandroid: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、这四个类,以及他们之间的用法。

ValueAnimator

public void Onstart(View view){ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 400);valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic 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用的比较少

ObjectAnimator

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实例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为主。

AnimatorSet

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="/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等等,还有属性动画的实现的过程。

如果觉得《Android自定控件之动画总结(一)》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。