(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>