欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android動(dòng)畫系列之屬性動(dòng)畫的基本使用教程

 更新時(shí)間:2020年12月02日 14:30:39   作者:躬行之  
這篇文章主要給大家介紹了關(guān)于Android動(dòng)畫系列教程之屬性動(dòng)畫的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

屬性動(dòng)畫相較幀動(dòng)畫和補(bǔ)間動(dòng)畫更強(qiáng)大,幀動(dòng)畫和補(bǔ)間動(dòng)畫只能應(yīng)用于 View 及其子類,而屬性動(dòng)畫可以修改任何對象的屬性值,屬性值可在指定的一段時(shí)間內(nèi)自動(dòng)改變,根據(jù)對象屬性值的變化進(jìn)而實(shí)現(xiàn)更復(fù)雜的動(dòng)畫。

  1. 屬性動(dòng)畫的常用設(shè)置
  2. ValueAnimator
  3. ObjectAnimator
  4. 關(guān)鍵幀
  5. 插值器和估值器

屬性動(dòng)畫的常用設(shè)置

下面是屬性動(dòng)畫的常用設(shè)置,具體如下:

//設(shè)置屬性動(dòng)畫持續(xù)時(shí)間
animator.setDuration(2000);
//設(shè)置屬性插值器
animator.setInterpolator(new AccelerateInterpolator());
//設(shè)置屬性動(dòng)畫重復(fù)播放模式
animator.setRepeatMode(ValueAnimator.REVERSE);
//設(shè)置屬性動(dòng)畫重復(fù)播放次數(shù)
animator.setRepeatCount(0);
//設(shè)置屬性動(dòng)畫延時(shí)播放的時(shí)間
animator.setStartDelay(0);
//設(shè)置屬性動(dòng)畫估值器,用于控制最終屬性值(API22)
animator.setCurrentFraction(0.5f);
//設(shè)置當(dāng)前播放時(shí)間,其值在Duration范圍之內(nèi)
animator.setCurrentPlayTime(1000);
//設(shè)置屬性動(dòng)畫估值器,用于控制最終屬性值
animator.setEvaluator(new IntEvaluator());
//設(shè)置屬性動(dòng)畫監(jiān)聽
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
  @Override
  public void onAnimationUpdate(ValueAnimator animation) {
    Log.i(TAG, animation.getAnimatedValue() + "");
    //
  }
});
//...

ValueAnimator

ValueAnimator 提供了一個(gè)簡單的計(jì)時(shí)引擎,用于執(zhí)行動(dòng)畫時(shí)根據(jù)設(shè)置的時(shí)長以及其他屬相完成動(dòng)畫值的計(jì)算,然后就可以將動(dòng)畫值設(shè)置到合適的目標(biāo)對象上,使用的插值器默認(rèn)時(shí) AccelerateDecelerateInterpolator,表示動(dòng)畫開始和結(jié)束時(shí)較慢,中間加速完成動(dòng)畫,下面是源碼中默認(rèn)的插值器,具體如下:

// The time interpolator to be used if none is set on the animation
private static final TimeInterpolator sDefaultInterpolator =
    new AccelerateDecelerateInterpolator();

在 ValueAnimator 中已經(jīng)內(nèi)部處理了一些估值器 IntEvaluator 和 FloatEvaluator,也就是說如果使用的時(shí) ofInt 和 ofFloat 方法作為動(dòng)畫的屬性值,那么 ValueAnimator 會(huì)自動(dòng)處理 int 和 float 值的變化,在源碼中找了一下,這部分內(nèi)容在 PropertyValuesHolder 這個(gè)類中,具體如下:

void init() {
  if (mEvaluator == null) {
    // We already handle int and float automatically, but not their Object
    // equivalents
    mEvaluator = (mValueType == Integer.class) ? sIntEvaluator :
        (mValueType == Float.class) ? sFloatEvaluator :
        null;
  }
  if (mEvaluator != null) {
    // KeyframeSet knows how to evaluate the common types - only give it a custom
    // evaluator if one has been set on this class
    mKeyframes.setEvaluator(mEvaluator);
  }
}

ValueAnimator 可以使用代碼創(chuàng)建,也可以使用 xml 創(chuàng)建,下面以平移動(dòng)畫為例說明 ValueAnimator 的使用方式,其他如縮放、旋轉(zhuǎn)等使用方式類似。

使用代碼創(chuàng)建

private void translation(){
  ValueAnimator valueAnimator = ValueAnimator.ofInt(0, 100);
  valueAnimator.setDuration(2000);
  valueAnimator.setInterpolator(new AccelerateInterpolator());
  valueAnimator.setRepeatMode(ValueAnimator.REVERSE);
  valueAnimator.setRepeatCount(0);
  valueAnimator.setStartDelay(0);
//  valueAnimator.setCurrentFraction(0.5f);
//  valueAnimator.setCurrentPlayTime(1000);
  valueAnimator.setEvaluator(new IntEvaluator());

  valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
      Log.i(TAG, animation.getAnimatedValue() + "");
      int x = (int) animation.getAnimatedValue();
      ivImage.setTranslationX(x);
      ivImage.setTranslationY(x);
    }
  });

  valueAnimator.start();
}

使用xml創(chuàng)建

在 res/animator 文件夾下創(chuàng)建 test_animator.xml 文件,文件內(nèi)容如下:

<?xml version="1.0" encoding="utf-8"?>
<animator xmlns:android="http://schemas.android.com/apk/res/android"
  android:valueFrom="0"
  android:valueTo="100"
  android:valueType="intType"

  android:duration="2000"
  android:startOffset ="0"
  android:repeatMode = "reverse"
  android:repeatCount = "0"
  android:interpolator = "@android:anim/accelerate_interpolator">
</animator>

然后在 Activity 中獲取 ValueAnimator,設(shè)置目標(biāo)對象,啟動(dòng)動(dòng)畫即可,具體如下:

private void translation(){
  ValueAnimator animator = (ValueAnimator) AnimatorInflater.loadAnimator(this,R.animator.test_animator);
  animator.setTarget(ivImage);
  animator.start();
  animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
      Log.i(TAG, animation.getAnimatedValue() + "");
      int x = (int) animation.getAnimatedValue();
      ivImage.setTranslationX(x);
      ivImage.setTranslationY(x);
    }
  });
}

測試效果

這里使用 ValueAnimator 來實(shí)現(xiàn)平移動(dòng)畫,測試效果如下:

ObjectAnimator

ObjectAnimator 是 ValueAnimator 的子類,可在目標(biāo)對象上支持動(dòng)畫屬性的設(shè)置,在其構(gòu)造方法中通過參數(shù)指定目標(biāo)對象以及所對應(yīng)動(dòng)畫屬性的名稱,然后會(huì)相應(yīng)的執(zhí)行對應(yīng)的動(dòng)畫屬性的 setter 方法來最終完成動(dòng)畫的執(zhí)行,也就是說屬性動(dòng)畫 ObjectAnimator 最終調(diào)用目標(biāo)對象的 setter 方法完成目標(biāo)對象屬性值的變化,然后相應(yīng)的改變目標(biāo)對象的屬性,從而實(shí)現(xiàn)目標(biāo)對象的動(dòng)畫效果,下面以透明度變化來介紹 ObjectAnimator 的基本使用,代碼參考如下:

private void alpha(){
  ObjectAnimator animator = ObjectAnimator.ofFloat(ivImage,"alpha",1f,0,1f);
  animator.setDuration(3000);
  //其他屬性動(dòng)畫設(shè)置
  //...
  animator.start();
}

下面是測試效果,如下圖所示:

至于平移、旋轉(zhuǎn)、縮放動(dòng)畫實(shí)現(xiàn)方式基本如上,這里不再贅述,其對應(yīng)的 setter 方法對應(yīng)關(guān)系如下:

屬性 作用 對應(yīng)方法
Alpha 控制View的透明度 setAlpha
TranslationX 控制X方向的位移 setTranslationX
TranslationY 控制Y方向的位移 setTranslationY
ScaleX 控制X方向的縮放倍數(shù) setScaleX
ScaleY 控制Y方向的縮放倍數(shù) setScaleY
Rotation 控制以屏幕方向?yàn)檩S的旋轉(zhuǎn)度數(shù) setRotation
RotationX 控制以X軸為軸的旋轉(zhuǎn)度數(shù) setRotationX
RotationY 控制以Y軸為軸的旋轉(zhuǎn)度數(shù) setRotationY

ObjectAnimator 提供了很多的 ofXxx() 方法來方面設(shè)置屬性動(dòng)畫,如下圖所示:

可根據(jù)不同的動(dòng)畫需求使用 ObjectValueAnimator 不同 ofXxx() 方法來實(shí)現(xiàn)相應(yīng)的動(dòng)畫。

關(guān)鍵幀

這里簡單說一下關(guān)鍵幀的使用,顧名思義關(guān)鍵幀就是在某個(gè)固定時(shí)刻上定義具體的屬性值,為定義的將按照估值器返回的值返回屬性值,屬性動(dòng)畫中的關(guān)鍵幀使用方式如下:

/**
 * 關(guān)鍵幀的使用
 */
private void keyFrame(){
  Keyframe keyframe1 = Keyframe.ofFloat(0,0);
  Keyframe keyframe2 = Keyframe.ofFloat(0.25f,300);
  //每個(gè)KeyFrame可設(shè)置自己的插值器
  keyframe2.setInterpolator(new AccelerateInterpolator());
  Keyframe keyframe3 = Keyframe.ofFloat(0.75f,100);
  Keyframe keyframe4 = Keyframe.ofFloat(1,400);
  PropertyValuesHolder holder = PropertyValuesHolder.ofKeyframe("translationX",keyframe1,keyframe2,keyframe3,keyframe4);
  ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(ivImage,holder);
  animator.setDuration(3000);
  animator.start();
}

看一下添加關(guān)鍵幀之后對普通平移動(dòng)畫的改變,實(shí)現(xiàn)測試效果如下:

插值器和估值器

插值器(TimeInterpolator) 表示的是整個(gè)動(dòng)畫期間動(dòng)畫的變化規(guī)律,如加速、減速等。
Android 內(nèi)置許多插值器,這些插值器基本涵蓋了實(shí)際開發(fā)中的大部分情況,具體如下:

如果內(nèi)置的插值器不滿足需求,也可以自定義插值器。

估值器(TypeEvaluator)表示的是在整個(gè)動(dòng)畫期間各時(shí)刻屬性值的具體變化。

這里自定義一個(gè)估值器來實(shí)現(xiàn)一個(gè) View 沿正弦曲線運(yùn)動(dòng),自定義估值器如下:

/**
 * 自定義估值器
 * Point封裝了坐標(biāo)x和y
 */
public class SineTypeValue implements TypeEvaluator<Point> {
  @Override
  public Point evaluate(float fraction, Point startValue, Point endValue) {
    //y = sinA
    float distance = fraction * (endValue.getX() - startValue.getX());
    float x = startValue.getX() + distance;
    float y = startValue.getY() + (float) Math.sin(distance / 100 * Math.PI) * 100;
    Point point = new Point();
    point.setX(x);
    point.setY(y);
    return point;
  }
}

然后給動(dòng)畫設(shè)置該估值器,監(jiān)聽動(dòng)畫屬性設(shè)置 View 的位置即可實(shí)現(xiàn)一個(gè) View 沿正弦曲線運(yùn)動(dòng),使用方式如下:

/**
 * 自定義估值器的使用
 * 正弦運(yùn)動(dòng)的估值器
 */
private void sina(){
  Point startPoint = new Point(ivImage.getX(),ivImage.getY());
  Point endPoint = new Point(ivImage.getX()+500,ivImage.getY());
  ValueAnimator valueAnimator = ValueAnimator.ofObject(new SineTypeValue(), startPoint, endPoint);
  valueAnimator.setDuration(5000);
  valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
      Log.i(TAG, animation.getAnimatedValue() + "");
      Point point = (Point) animation.getAnimatedValue();
      ivImage.setX(point.getX());
      ivImage.setY(point.getY());
    }
  });
  valueAnimator.start();
}

測試效果如下:

自定義估值器

到此這篇關(guān)于Android動(dòng)畫系列之屬性動(dòng)畫基本使用的文章就介紹到這了,更多相關(guān)Android屬性動(dòng)畫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論