(1)ObjectAnimator 动画使用及动画实现的原理:
相比于ValueAnimator,ObjectAnimator可能才是我们最常接触到的类,因为ValueAnimator只不过是对值进行了个平滑
的动画过渡。
不过虽说ObjectAnimator会更加常用一些,但是它其实是继承自ValueAnimator的,底层的动画实现机制也是基于
ValueAnimator来完成的,因此ValueAnimator仍然是整个属性动画当中最核心的一个类。那么既然是继承关系,说明
ValueAnimator中可以使用的方法在ObjectAnimator中也是可以正常使用的,它们的用法也非常类似
(2)ValueAnimator 动画使用:
ValueAnimator是整个属性动画机制当中最核心的一个类,前面我们已经提到了,属性动画的运行机制是通过不断
地对值进行操作来实现的,而初始值和结束值之间的动画过渡就是由ValueAnimator这个类来负责计算的。它的内部使
用一种时间循环的机制来计算值与值之间的动画过渡,我们只需要将初始值和结束值提供给ValueAnimator,并且告诉
它动画所需运行的时长,那么ValueAnimator就会自动帮我们完成从初始值平滑地过渡到结束值这样的效果。除此之
外,ValueAnimator还负责管理动画的播放次数、播放模式、以及对动画设置监听器等,确实是一个非常重要的类。
但是在实际应用过程中,这个类我们用的并不多,因为它只是计算值。我们要的是实际的动画。
案例:
将值从0-1进行过度,事件是3s
(3) 分析补间动画 逐帧动画 属性动画 的区别
补间动画:提供开始帧和结束帧,中间的过程由计算机自己完成。
帧动画:逐帧动画的工作原理很简单,其实就是将一个完整的动画拆分成一张张单独的图片,然后再将它们连贯起来
进行播放,类似于动画片的工作原理。
属性动画:通过改变属性实现的动画。
(4) 分析动画使用场景
补间动画具有以下几个特点:首先,制作方法简单方便。只需要为动画的第一个关键帧和最后一个关键帧创建内容,
两个关键帧之间帧的内容由Flash自动生成,不需要人为处理。其次,相对于逐帧动画来说,补间动画更为连贯自
然。因为逐帧动画是由手工控制,帧与帧之间的过渡很可能会不自然、不连贯,而补间动画除了两个关键帧由手工控
制外,中间的帧都由Flash自动生成,技术含量很高,因此过渡更为自然连贯。最后,相对于逐帧动画来说,补间动
画的文件更小,占用内存少。
逐帧动画是在时间帧上逐帧绘制帧内容,由于是一帧一帧的画,所以逐帧动画具有非常大的灵活性,几乎可以表现任
何想表现的内容。但是在开发中,我们不常用这个动画。
属性动画:故名思议就是通过动画的方式改变对象的属性;
补间动画改变的只是视觉的效果,但是View是没变的,比如平移动画其实View是没有动的。为了实现真正的对
View的控制,就要使用属性动画.
-----------------------MainActivity-------------------------------
package com.example.earl.baipenggui1511j20170109;
import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends AppCompatActivity {
private MyView myView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myView = findViewById(R.id.MyVIew);
}
//渐变
public void jianbian(View v) {
ObjectAnimator alpha = ObjectAnimator.ofFloat(myView, "alpha", 0, 1);
alpha.setDuration(2000);
alpha.start();
}
//平移
public void pingyi(View v) {
float translationX = myView.getTranslationX();
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(myView, "translationX", translationX, 300f);
objectAnimator.setDuration(3000);
objectAnimator.start();
}
//旋转
public void xuanzhuan(View v) {
ObjectAnimator rotation = ObjectAnimator.ofFloat(myView, "rotation", 0f, 360f);
rotation.setDuration(5000);
rotation.start();
}
//缩放
public void suofang(View v) {
//ObjectAnimator scaleX = ObjectAnimator.ofFloat(myView, "scaleX", 1f, 3f);
//scaleX.setDuration(5000);
//scaleX.start();
ObjectAnimator scaleY = ObjectAnimator.ofFloat(myView, "scaleY", 1f, 3f);
scaleY.setDuration(5000);
scaleY.start();
}
//动画合集 public void heji(View v){ //平移 属性动画 ObjectAnimator translationX = ObjectAnimator.ofFloat(myView, "translationX", 0, 300); //创建透明度动画 ObjectAnimator alpha = ObjectAnimator.ofFloat(myView, "alpha", 1.0f, 0f); //动画集合 AnimatorSet set = new AnimatorSet(); //添加动画 set.play(translationX).with(alpha); //设置时间等 set.setDuration(5000); set.start(); //动画监听 //设置动画结束后消失 set.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); myView.setVisibility(View.GONE); } @Override public void onAnimationRepeat(Animator animation) { super.onAnimationRepeat(animation); } @Override public void onAnimationStart(Animator animation) { super.onAnimationStart(animation); } }); } }
--------------MyView----------------------
package com.example.earl.baipenggui1511j20170109; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.view.View; /** * Created by Earl on 2018/1/9. */ public class MyView extends View{ private Paint paint; public MyView(Context context) { this(context,null); } public MyView(Context context, @Nullable AttributeSet attrs) { this(context, attrs,0); } public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); paint = new Paint(); paint.setColor(Color.RED); paint.setDither(true); //防抖 paint.setAntiAlias(true); //抗锯齿 paint.setStrokeWidth(50); //设置画笔的线宽 } @Override public void draw(Canvas canvas) { super.draw(canvas); // 画小球 canvas.drawCircle(100,250,50,paint); } }------------activity_main.xml---------------------
xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.earl.baipenggui1511j20170109.MainActivity">
<com.example.earl.baipenggui1511j20170109.MyView
android:layout_weight="5"
android:layout_width="wrap_content"
android:layout_height="0dp"
android:id="@+id/MyVIew"/>
<LinearLayout
android:layout_weight="1"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="0dp">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="jianbian"
android:text="渐变"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="pingyi"
android:text="平移"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="xuanzhuan"
android:text="旋转"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="suofang"
android:text="缩放"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="heji"
android:text="动画合集"/>
LinearLayout>
LinearLayout>