I.概要
プロパティアニメーション(プロパティアニメーション)がAPI11に導入された新機能である、それが比較されるトゥイーン次のような利点があります。
- ビュートゥイーンのみを動作させることができ、アニメーション、属性が任意のオブジェクト、およびなくてもオブジェクトを操作することができます。
- トゥイーンは、我々はより多くの効果を必要とするとき、モーショントゥイーンの無力を翻訳、拡大縮小、回転、およびアニメーションのこれら4種類の透明性を達成することができ、およびアニメーションプロパティは、我々はできる限り、我々は、一定のルールに基づいているとして、優れた拡張性を持っています様々な属性を操作します。
- トゥイーンは、実際の表示プロパティを変更することなく、ビューの表示を変更、およびプロパティは、直接操作のアニメーションプロパティの値であるので、このような問題は存在しません。
この記事では、次のように構造化属性を使用して簡単なアニメーションを説明します。
- 使用ValueAnimator
- ObjectAnimatorの使用
- AnimatorSetの使用
- 使用ViewPropertyAnimator
- プロパティアニメーションにリスナーを設定します
二、ValueAnimator
ValueAnimator
アニメーションは、オブジェクトの属性値が変化するため、プロパティのアニメーションプロパティのアニメーション理由が呼び出されるクラスの最もコアな属性であるため、操作機構は、プロパティ値は、アニメーションの効果を達成するために修正され続けてアニメーションを介して行われます。
そしてValueAnimator
常に値、最終値まで初期値からの遷移を修正する内部タイミングエンジンを使用して、その後、アニメーションの開始および終了値とを受信し、そのような計算を行うために使用されます。これは、作成するための次の三つの重要なメソッドがありValueAnimator
、オブジェクトを:
方法 | 説明 |
---|---|
ValueAnimator.ofInt(int型...値) | 整数値の形で最終値への遷移の初期値 |
ValueAnimator.ofFloat(フロート...値) | 端部への過剰な値として浮動小数点数の初期値 |
ValueAnimator.ofObject(TypeEvaluator評価、オブジェクト...の値) | オブジェクトの形で最終値への遷移の初期値 |
このセクションでは、最初に紹介しますofInt
とofFloat
、ofObject
その後、私たちが見る、推定部に導入されたValueAnimator
一般的な方法を:
方法 | 説明 |
---|---|
setDuration | あなたはミリ秒でアニメーションの長さを設定すると、 |
setStartDelay | ミリ秒の遅延時間の開始を設定します。 |
setRepeatCount | 繰り返し回数を設定し、デフォルト値は0です。無限の再読み取りのためのINFINITEの値 |
setRepeatMode | リピートモード設定、二つの値があります。RESTARTとREVERSE |
setEvaluator | セットの推定 |
addUpdateListener | 値は、このコールバックメソッドを更新するたびにリスナーを更新する値を加算 |
開始 | オープンアニメーション |
休止 | 仮死 |
キャンセル | 閉じるアニメーション |
証明するために簡単な例に続いてValueAnimator
の使用は:
ValueAnimator anim = ValueAnimator.ofFloat(0.0f, 100.0f);
anim.setDuration(500);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Log.d(TAG, "current value is " + animation.getAnimatedValue());
}
});
anim.start();
出力:
D / MainActivity:現在の値が0.0である
D / MainActivity:現在の値は9.549156であり、
D / MainActivity:電流値は74.909256である
D / MainActivity:現在値が83.06559である
D / MainActivity:電流値は86.875656である
D / MainActivity:電流値は90.078354であり、
D / MainActivity:現在の値は93.037094である
D / MainActivity:電流値は95.5053である
D / MainActivity:現在値が97.35491である
D / MainActivity:電流値は98.795845である
D / MainActivity:電流値は99.680565である
D / MainActivity:電流値は99.996056である
D / MainActivity。現在の値は100.0です
この例では、使用ofFloat
初期化するためにValueAnimator
、そして次に0と100、500ミリ秒の長さの初期値および終了値を設定します。その理由は、私たちがログの方法を印刷して値の変化を見るために、あなたは視覚的な変化を見ることができない、任意のアプリケーションのビューに値を変更するためにリスナーを追加していないということです。我々は次のように整数値を採用する場合:
ValueAnimator anim = ValueAnimator.ofInt(0, 100);
anim.setDuration(500);
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
Log.d(TAG, "current value is " + animation.getAnimatedValue());
}
});
anim.start();
ただ、完全な整数値をプリントアウトすることで、私たちのログをコードの最初の行を変更します。上記についてですValueAnimator
簡単な使用、そして我々が表示ObjectAnimator
使用を。
三、ObjectAnimator
ObjectAnimator
であるValueAnimator
と比べて、サブクラスValueAnimator
のみトランジションの値に、ObjectAnimator
あなたが直接、任意のオブジェクトのアニメーション動作のための属性値をすることができますので、我々は通常の多くを開発し使用ObjectAnimator
。そして、それは、オブジェクトを作成する方法とされValueAnimator
、非常に類似した次の3つの方法が用意されています。
public static ObjectAnimator ofInt(Object target, String propertyName, int... values)
パラメータ | 説明 |
---|---|
ターゲット | テキストやボタンなどのオブジェクトプロパティのアニメーション効果 |
プロパティ名 | アニメーション化されたプロパティの効果 |
値 | アニメーションの遷移値は、通常、ここでは、int型の値を初期値と終了値を設定します |
public static ObjectAnimator ofFloat(Object target, String propertyName, float... values)
ofFloat
及び使用する方法ofInt
と同様の方法を、唯一の違いはvalues
、異なる種類のofFloat
方法は、フロートを使用します。
public static ObjectAnimator ofObject(Object target, String propertyName,
TypeEvaluator evaluator, Object... values)
パラメータ | 説明 |
---|---|
ターゲット | テキストやボタンなどのオブジェクトプロパティのアニメーション効果 |
プロパティ名 | アニメーション化されたプロパティの効果 |
エバリュエータ | カスタム推定 |
値 | アニメーションの遷移値は、通常、ここで初期値と終了値を設定します |
ofObject
同じように、私たちは、導入された推定量は、導入を行う際に後ろにそれを残します。ここでは、ボタンの透明度を変更する、例えば、その使用を見て:
ObjectAnimator anim = ObjectAnimator.ofFloat(mButton, "alpha", 1.0f, 0.0f, 1.0f);
anim.setDuration(3000);
anim.start();
効果次のコードを実行します。
以下のようなコードをスケーリングなどの他の修飾は、であってもよいです。
ObjectAnimator anim = ObjectAnimator.ofFloat(mButton, "scaleX", 1.0f, 1.5f, 1.0f);
anim.setDuration(1000);
anim.start();
全体的に、非常にシンプルな使用する、と我々は次を参照:AnimatorSet
。
四、AnimatorSet
XML形式とJavaコードの形式、XML形式の使用を見て最初:アニメーションのコレクションですAnimatorSetは、それは2つの方法で使用されています。
1. XMLフォーム
アニメーションの形でXML属性は、以下の中から選択するには、いくつかのタグがあります。
タグ | 対応するクラス |
---|---|
<設定> | AnimatorSet |
<アニメーター> | ValueAnimator |
<objectAnimator> | ObjectAnimator |
以下は、さまざまな属性名とそれに対応するラベルの説明です。
1.1セット・ラベル
プロパティ | 説明 |
---|---|
fillAfter | 映画の終了後に固定、デフォルトはtrueであるかどうか |
インターポレータ | 插值器设置,默认为加减速插值器 |
repeatMode | 重复模式设置,课选择值有restart和reverse两种 |
repeatCount | 重复次数,默认为0 |
startOffset | 动画开启后的延时时间 |
startTime | 设置开始动画的时刻 |
1.2 animator标签
属性 | 描述 |
---|---|
duration | 动画的持续时长,取值为int型数值,单位为毫秒 |
interpolator | 动画的插值器设置,默认为加速减速插值器 |
repeatCount | 重复次数,默认为0,取值为int型整数,代表重复次数 |
repeatMode | 重复模式,有restart和reverse两种取值,reverse表示动画正反轮流执行,restart表示一直从头开始执行 |
startOffset | 动画开始的延迟时间,取值为int型数值,单位为毫秒 |
valueFrom | 动画的初始值,取值可以为int型、float型或颜色值,取值类型受valueType属性影响 |
valueTo | 动画的结束值,取值可以为int型、float型或颜色值,取值类型受valueType属性影响 |
valueType | value的取值类型,可以取intType或者floatType,如果值类型为颜色值,那么无需定义此属性 |
1.3 objectAnimator标签
objectAnimator标签的设置与animator的设置十分相似,animator标签可用的属性objectAnimator标签均可以用,下面只列举出部分objectAnimator特有的属性:
属性 | 描述 |
---|---|
propertyName | 表示属性动画作用对象的属性的名称 |
接下来通过一个例子来展示XML形式的使用:
// res/animator/anim_demo.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:propertyName="alpha"
android:valueType="floatType"
android:valueFrom="1.0"
android:valueTo="0.5"/>
<objectAnimator
android:propertyName="scaleX"
android:valueType="floatType"
android:valueFrom="1.0f"
android:valueTo="1.5f"/>
</set>
在Java代码中,使用如下代码:
AnimatorSet animationSet = (AnimatorSet) AnimatorInflater.loadAnimator(this, R.animator.anim_demo);
animationSet.setTarget(mButton);
animationSet.start();
通过这种形式,我们就实现了在1s内同时改变按钮的透明度和x轴的伸缩的动画,效果如下所示:
以上就是关于AnimatorSet
在XML形式下的使用,下面介绍Java代码形式的使用,这是一种更加推荐的用法。
2. Java代码形式
在Java代码中,我们只需要用到AnimatorSet类即可,下面我们先来介绍下这个类的常用 API:
方法 | 描述 |
---|---|
setTarget | 设置动画的作用对象,例如一个按钮 |
start | 开启动画的方法 |
cancel | 取消动画的方法 |
pause | 暂停动画的方法 |
play | 这个方法会返回一个Builder对象,传入的值为ValueAnimator对象或者ObjectAnimator对象,Builder类用于协助构造动画集合 |
with | 将现有动画和传入的动画同时执行 |
before | 将现有动画插入到传入的动画之前执行 |
after(Animator anim) | 将现有动画插入到传入的动画之后执行 |
after(long delayTime) | 将现有动画延迟指定毫秒后执行 |
接下来我们就通过一个实际的例子来展示它的使用。
ObjectAnimator alpha = ObjectAnimator.ofFloat(mButton, "alpha", 1.0f, 0.0f, 1.0f);
ObjectAnimator scaleX = ObjectAnimator.ofFloat(mButton, "scaleX", 1.0f, 1.5f, 1.0f);
ObjectAnimator rotate = ObjectAnimator.ofFloat(mButton, "rotationX", 0.0f, 360.0f);
AnimatorSet animationSet = new AnimatorSet();
// 在进行x轴缩放之前,先同时进行透明度和旋转动画。
animationSet.play(rotate).with(alpha).before(scaleX);
animationSet.setDuration(5000);
animationSet.start();
运行代码,效果如下所示:
可以发现按钮先进行旋转和透明度动画(这两个是同时进行的),然后再进行x轴的拉伸动画。结果与我们的预期是相符的。
五、ViewPropertyAnimator
为了让我们能够更加轻松地使用属性动画,Android官方还为我们提供了一个面向对象的属性动画操作方式。它的使用方式如下所示:
View.animate().xxx().xxx();
我们这里以一个按钮动画为例展示它的使用:
mButton.animate().scaleX(2.0f).alpha(0.0f).setDuration(2000).setInterpolator(new LinearInterpolator());
效果如下所示:
需要注意的是这种设置下的动画是同时进行的,并且动画会自动启动,无需调用start
方法。可以看到关于ViewPropertyAnimator的使用还是非常简单的,但我们只需要简单地对View中的一些常规属性进行动画操作时就可以考虑使用ViewPropertyAnimator。
六、属性动画的监听
属性动画提供了监听器用于监听动画的播放过程,主要有以下三个接口:AnimatorUpdateListener
、AnimatorListener
和AnimatorPauseListener
。
1. AnimatorUpdateListener
AnimatorUpdateListener
接口的定义如下:
public static interface AnimatorUpdateListener {
/**
* <p>Notifies the occurrence of another frame of the animation.</p>
*
* @param animation The animation which was repeated.
*/
void onAnimationUpdate(ValueAnimator animation);
}
可以看到这个接口中只有一个方法onAnimationUpdate
,它会在动画属性值被更新的时候回调,也就是说在动画每播放一帧的时候它就会被回调一次。该监听通过addUpdateListener
方法添加该监听事件。
2. AnimatorListener
AnimatorListener
次のようにインターフェースが定義されます。
public static interface AnimatorListener {
void onAnimationStart(Animator animation);
void onAnimationEnd(Animator animation);
void onAnimationCancel(Animator animation);
void onAnimationRepeat(Animator animation);
}
AnimatorListener
リプレイは、私たちができるときインタフェースは、4つのメソッドを定義し、この方法は、アニメーションの開始、終了、取り消しにそれぞれ4つになり、バックと呼ばれるaddListener
イベントリスナーメソッドを追加します。
3. AnimatorPauseListener
上記の二つのインターフェースに比べてAnimatorPauseListener
使用頻度が低い、このインタフェースは、次の2つのメソッドが定義されています。
public static interface AnimatorPauseListener {
/**
* <p>Notifies that the animation was paused.</p>
*
* @param animation The animaton being paused.
* @see #pause()
*/
void onAnimationPause(Animator animation);
/**
* <p>Notifies that the animation was resumed, after being
* previously paused.</p>
*
* @param animation The animation being resumed.
* @see #resume()
*/
void onAnimationResume(Animator animation);
}
これらの2つの方法は、あなたがすることができ、動画が一時停止されたときにコールバックしており、回復に一時停止addPauseListener
イベントリスナーメソッドを追加します。
参照
「芸術的探求のAndroidの開発。」
- 第7章Androidのアニメーションでの詳細な分析
- 7.3プロパティのアニメーション
Androidの属性アニメーションが完全に(上)解決し、知人プロパティアニメーションの基本的な使い方
私は〜あなたを助けるために、この記事を願っています