逐帧动画 补间动画 属性动画ObjectAnimator ValueAnimator AnimatorSet)演示 TypeEvaluator
2016-11-05 15:15
471 查看
package com.example.tyxiong.myapplication; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.TypeEvaluator; import android.animation.ValueAnimator; import android.app.Activity; import android.graphics.drawable.AnimationDrawable; import android.os.Bundle; import android.view.View; import android.view.animation.LinearInterpolator; import android.view.animation.TranslateAnimation; import android.widget.Button; import android.widget.ImageView; /* 1 用ImageView显示图片 2 用AnimationDrawable开发逐帧动画 3 用Animation开发补间动画. * Bitmap BitmapDrawable BitmapFactory 三者关系 * 1 Bitmap代表一个位图对象.自己有4静态方法构建Bitmap 从源图挖生成 源图挖取并进行Matrix变换 对源位图缩放生成 生成尺寸的Bitmap * 2 BitmapDrawable包装了一个位图. 通过new包装Bitmap 其getBitmap()方法可取出其中的Bitmap * 3 BitmapFactory工具类,有方法4个从不同来源解析创建Bitmap对象. * Bitmap用后需要回收自己 2方法 isRecyled() recely() * * Canvas:依附于View的画布 * 大量绘制各种图形 线 点的方法+4方法进行画布坐标系(左上为0,0)变换. 其实是两个坐标系. * * Paint:画布上的笔 实际上我觉得Canvas才是笔.. * 11方法进行画笔设置,其中5个 笔触宽度/笔触转弯/填充风格/填充效果/路径填充效果 strokewidth strokejoin style shader pathEffect * *Path 1首先创建一条路径 2用Canvas的drawPath()方法绘制出来. * 3步: 1路径 * 2Paint 设置pathEffect 6子类 * 3Canvas 绘制出来. * * 重调组件的onDraw()方法重绘组件.UI线程中用invalidate(); 非主线程用postinvalidate() * *双缓冲即: 需要实时重绘组件onDraw()且要保留先前的状态. 先绘制(用Canvas绘制路径之类的,不会盖之前)到大小相同的缓冲区,再一起绘制到组件. * *使用Matrix控制变换. Bitmap有方法 创建Bitmap并应用Matrix变换 * 3步: 1创建Matrix对象(也可从其他对象获取) * 2对Matrix进行变换(4种变换 位移/缩放/旋转/倾斜 translation/scale/rotate/skew) * 3把这种变换应用于指定对象. * * drawBitmapMesh 扭曲图像 这是Canvas的draw方法, 即将图像分成很多小网格 事件点的小距离变换 绘制出来. * * shader Paint的 方法填充效果 5子类 BitmapShader/LinearGradient/RadialGradient/SweepGradient/ComposeShader * * 逐帧动画Frame 大量静态图片集中起来,依次显示 * xml 根元素animation-list 1属性name 子元素item 2属性 drawable duraing * java 1创建AnimationDrawable对象 2 方法addFrame()添加一帧 默认是不播放的. start() stop() 补间动画Tween Anmation为其抽象类 4子类TranslateAnimation AlphaAnimation Scale.../Rotate.. java 设置开始帧 结束帧 持续时间 Interpolator则控制插值. 自定义补间:继承基类Animation,重写applyTransformation() 属性动画:增强版的补间动画. 区别:补间动画仅对4个属性方面的变化; 属性动画能定义任何属性的变化. 补间动画仅能对UI组件执行动画;属性动画能对任何对象执行动画(不管是否显示.). 6相似:都需要指定如duraing/interpolator/repateMode/repateCount/刷新频率/组合 4API Animator ValueAnimator ObjectAnimator AnimatorSet * Animator:基类被继承 * ValueAnimator:性动画的时间引擎,只负责计算各帧的属性值So要监听计算的值..它不管为对象设置值.我们来负责. * java方式使用步骤4:1用静态方法(3个)ofInt()/ofFloat(start,end)获取ValueAnimator动画对象. * 2设置动画的属性设置如:duration/repeatMode * 3调用动画对象方法start()开始动画. * 4为动画设置监听AnimatorUpdateListener,监听计算出来的值,并将值应用到对象组件上. * * ObjectAnimator:ValueAnimator的子类,允许对指定对象的属性执行动画.简单些. * java方式使用步骤3: 1同样静态方法ofxxx(动画应用的对象,应用的属性,属性开始值,结束值) * 后两步同上.无须设置监听器它会帮我把值应用到属性上. * 3注意点:需要为对象的该属性设置setter()方法,这是对自定义组件而言的. * 若属性值只设置了一个,则认为是结束值,还需提供getter()方法,的值作为开始值. * 动画应用的对象为View的话,可能要在onAnimationUpdate()方法里手动调用invlidate()重绘. * AnimatorSet:组合动画,同时,依次 * Evaluator 控制如何计算属性值..4子类 int/string/argb/TypeEvaluator(用于实现自定义计算器) * View有3缺点:1 onView()重绘时会重绘整个图片 2 新线程无法直接更新View组件 3 缺乏双缓冲机制. * * SurfaceView概述4:1 SurfaceView对应于屏幕上的一块缓存区. * 2 普通View共享一块缓存区. * 3 View绘制在SurfaceView上面. * 4 每个Window对应一个Surface(内有Canvas) * SurfaceView在游戏时实显示有优势. SurfaceHolder:用于在其对应的SurfaceView上绘制图像. 使用步骤4:1 获取SurfaceView对象上的SurfceHolder对象 getHolder() 2 SurfaceHolder对象方法lockCanvas()获取SurfaceView上的Canvas 3 Canvas进行绘制 4 SurfaceHolder方法unlockCanvas() 释放,提交绘制. 还可以实现SurfaceHolder内部接口Callback,监听SurfaceView的生命状态. * * * * *以下是 逐帧动画 补间动画 属性动画(ObjectAnimator ValueAnimator AnimatorSet)演示. * */ public class MainActivity extends Activity { AnimationDrawable animationDrawable; private TranslateAnimation translateAnimation; ObjectAnimator objectAnimator; ValueAnimator valueAnimator; AnimatorSet animatorSet; private boolean flag = false; ImageView imageView; Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button = (Button) findViewById(R.id.button2); imageView = (ImageView) findViewById(R.id.imageView2); animationDrawable = (AnimationDrawable) imageView.getBackground(); translateAnimation = new TranslateAnimation(0, 200, 0, 200); translateAnimation.setDuration(2000); translateAnimation.setFillAfter(true); translateAnimation.setInterpolator(new LinearInterpolator()); objectAnimator = ObjectAnimator.ofFloat(button, "alpha", 1.0f, 0.2f); objectAnimator.setDuration(3000) .setRepeatCount(1); valueAnimator = ValueAnimator.ofObject(new TypeEvaluator() {//ofArgb()方法是由5.0加入的 ofObject()适用于低版本11引入 @Override public Object evaluate(float fraction, Object startValue, Object endValue) {//实现接口方法fraction是1/n duraing int startInt = (int) startValue; int startA = startInt >> 24 & 0xff; int startR = startInt >> 16 & 0xff; int startG = startInt >> 8 & 0xff; int startB = startInt & 0xff; int endInt = (int) endValue; int endA = endInt >> 24 & 0xff; int endR = endInt >> 16 & 0xff; int endG = endInt >> 8 & 0xff; int endB = endInt & abb6 0xff; return startA + ((int) (fraction * (endA - startA))) << 24 | startR + ((int) (fraction * (endR - startR))) << 16 | startG + ((int) (fraction * (endG - startG))) << 8 | startB + ((int) (fraction * (endB - startB))); //x0+fraction*(x1-x0) } }, 0xffffffff, 0xff888888); valueAnimator.setDuration(2000); //valueAnimator.start(); ValueAnimator.AnimatorUpdateListener animatorUpdateListener = new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { int color = (int) animation.getAnimatedValue(); button.setBackgroundColor(color); } }; valueAnimator.addUpdateListener(animatorUpdateListener); animatorSet = new AnimatorSet(); animatorSet.play(valueAnimator).before(objectAnimator); } public void click(View view) { if (flag = !flag) { animationDrawable.start(); } else { animationDrawable.stop(); } animatorSet.start(); } public void stick(View view) { view.startAnimation(translateAnimation);//该组件为ImageView没有为它的任何属性指定该动画,它是怎么知道改为background运用动画的呢.. } } <?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/icon1" android:duration="500" /> <item android:drawable="@drawable/icon2" android:duration="500" /> <item android:drawable="@drawable/icon3" android:duration="500" /> <item android:drawable="@drawable/icon4" android:duration="500" /> <item android:drawable="@drawable/icon5" android:duration="500" /> </animation-list>
相关文章推荐
- 属性动画,属性动画组合队列详解 ValueAnimator ObjectAnimator AnimatorSet
- Android属性动画(ObjectAnimator、PropertyValuesHolder、ValueAnimator、AnimatorSet)
- Android - ObjectAnimator set pivot value属性动画设置放大时的中心点设置
- 属性动画:ObjectAnimator、PropertyValuesHolder、ValueAnimator、AnimatorSet
- 安卓 属性动画 ValueAnimator ObjectAnimator 源码分析 关键处
- 属性动画-ValueAnimator的ofObject()讲解
- 逐帧动画 补间动画 属性动画演示
- 简单的补间动画Animation和属性动画ObjectAnimator加页面跳转动画
- 简单的补间动画Animation和属性动画ObjectAnimator
- Android-Animator属性动画( ObjectAnimator , AnimatorSet , ValueAnimator )
- Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法
- Android 属性动画(二):ObjectAnimator与ValueAnimator
- Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法
- Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法
- Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法
- Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法
- android属性动画 —— ValueAnimator和ObjectAnimator的例子
- Android 属性动画ObjectAnimator和ValueAnimator讲解
- Android属性动画Property Animation系列二之ObjectAnimator
- Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法