Android开发中 简单实现属性动画

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

窗台的花花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值