您的位置:首页 > 移动开发 > Objective-C

逐帧动画 补间动画 属性动画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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  TypeEvalua ofObject
相关文章推荐