Android アニメーションの基本 --PropertyAnimation_html/css_WEB-ITnose
この記事には、サンプルのダウンロードが含まれています: Github
この記事では、Android 3.0 で導入された属性アニメーション フレームワークについて説明します。 前回の記事でビュー アニメーションについて書いたときに、ViewAnimation の欠点について言及しました。アニメーションはビュー自体の視覚的な部分に影響しますが、ビューの実際のプロパティはアニメーションによって変更されません。多くの場合、アニメーションによって引き起こされるイベントの非同期に追加で対処する必要があります。たとえば、ViewAnimation はビューを画面外に移動しましたが、ビューのイベントトリガーはまだ残っているため、追加の処理が必要です。 ただし、PropertyAnimation の導入により、この問題は完全に解決され、アニメーションとイベントの変更が常に同時に発生するようになります。重要なのは、ビューのプロパティを変更すると、ビューの再描画が行われてアニメーションが完了するということです。
ディレクトリ属性アニメーション フレーム構造
個人的には、継承を理解するのが良いと感じています構造はフレームワークを学ぶのに役立ちます。それでは、属性アニメーションのフレームワークから始めましょう。StartUML を使用して、次のクラス図を描画しました。描画は比較的ラフです (StartUML はうまく使用されていません、-_-!)。 )、TypeEvaluator と Interpolator は描画されていません。これは、第一に、複雑すぎて重要な情報を読み取ることができないため、そして第二に、後で説明するためです。各クラスの機能について簡単に説明します。
Animator クラス: アニメーション時間、リスナー、およびアニメーション ステータスの制御をカプセル化する、属性アニメーション フレームワークの基本クラス。
3. TypeEvaluator と Interpolators
アニメーション フレーム (Frame) については何度も言及しました。これはビュー アニメーションのフレーム アニメーションに相当します。つまり、個々のページはフィルム ムービーのフレームに似ています。人間の目で認識できるリフレッシュ レートは 24 フレーム/秒です。この周波数より低いアニメーションでは、画像が連続していないことがわかります。 setFrameDelay() メソッドは、一般的なアニメーションでアニメーションの更新頻度を指定するために使用されます。デフォルトでは、その値は 10ms、つまり 1 秒あたり 100 フレームです。更新頻度を値にマッピングするにはどうすればよいでしょうか?これには、TypeEvaluator と Interpolators を使用する必要があります。 まずインターポレーターについて話しましょう。その一般的な目的は、時間の部分を値の部分に変換することです。これら 2 つの間の相対関係は、アニメーションの形式 (均一速度、加速、最初に加速してから減速する、またはその他の数学的変換) を反映します。時間部分が値部分に変換されることはどのように理解できますか?インターフェースを見てみましょう!したがって、インターポレーターはすべて TimeInterpolator インターフェースのサブクラスであり、そこで宣言されているメソッドは次のとおりです:
abstract float getInterpolation(float input)
input是一个已经过去的时间占总时间的比例,也就是动画已经完成的百分比。返回的也是个小数,代表了希望这个点完成的总动画的百分数。假设有这样一个插值器,它接受0.5,返回0.8。这意味着这个差值器在经过50%的时间时,希望动画完成了80%。为什么是希望呢?因为真正映射为属性值是由TypeEvaluator来完成的。 TypeEvaluator:(翻译成类型求值器吧!这样比较贴合它的意思)它完成了差值器返回的值到实际值的映射?或许你会疑问为什么需要这个值,不应该是下面这个公式吗?
startVal:起始值 endVal:结束值 percent:完成百分比 progress:当前值 progress = startVal + (endVal-startVal)*progress
对,的确是这样的。内置的IntEvator、floatEvator也是这样的,但是我们动画的类型不一定都是这种数值类型的值吧!我们还可以动画字符串,在不同的时间点显示不同的字串,这时上述公式就不成立了。所以TypeEvaluator就是为了达到自定义装换的需求的。要实现满足自己需求的TypeEvaluator也很简单,只需要实现TypeEvaluator接口就可以了,它声明的方法如:
abstract T evaluate(float fraction, T startValue, T endValue)
T是要动画的属性类型,fraction是值分数,startValue、endValue是进行动画属性的起始值和终止值。返回映射的中间值。 到这,可以对属性动画的工作原理做个简单的接受了。 动画需要指定持续时间,属性起始值,属性终止值,帧延时。然后每过帧延时的时间间隔,触发插值器,接着触发值装换器,接下来是触发AnimationUpdateListenr中的onAnimationUpdate()方法重新设置View的属性,接着View重绘,如此循环知道动画结束。为了方便,我画了如下流程图:
ps:这符图不是很严谨,因为有些内容是不好表达,比如动画帧的计时是连续的,并不是等到上一帧完成了才开始计数下一帧。其次就是Animator本身的Listener是班法画上去的,当Animator调用cance(),end()之类的方法是能打断这个流程的。但是这图对理解过程还是不错的。
四、ObjectAnimator
先来讲最常使用的属性动画,ObejectAnimator,通过置顶好动画作用对象个对用属性等设置值后,ObjectAnimator能够通过反射区设置对象属性达到动画的目的。 ObjectAnimator提供了四种静态方法来构造自己的对象,分别是:ofInt、ofFloat、ofArgb、ofObject 。它们动画的值类型正如名字中说的那样,如ofInt动画作用于一个int域,offArgb注意与一个带透明的颜色域。 来看一个用动画改变栏背景的例子
public class MainActivity extends AppCompatActivity { @Bind(R.id.btn_bg) Button mGradientBg; ObjectAnimator mAnimator; @TargetApi(Build.VERSION_CODES.LOLLIPOP) @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final View view = findViewById(android.R.id.content); final Drawable bgd =view.getBackground(); mAnimator = ObjectAnimator.ofArgb(view,"backgroundColor",0x881DDA38,0x88D48AB2); mAnimator.setDuration(5*1000); mAnimator.setRepeatMode(ObjectAnimator.REVERSE); mAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); view.setBackground(bgd); } }); ButterKnife.bind(this); } @OnClick(R.id.btn_bg) void onGradientActionbarClicked() { mAnimator.start(); }}
效果如下:
上面就是ObjectAnimation使用过程,先通过四个静态方法构造出一个ObjectAnimation对象,这里使用的是ofArgb:
static ObjectAnimator ofArgb(Object target, String propertyName, int... values)
ObjectAnimator作用的域在对象是必须有相应的setter,getter(用于省略初始值的情况)方法,否则反射调用不了会报错。至于没有setter方法的域如何动画,官方Guide提供了如下解决方案:
讲一下使用包装类,假设有类A,且A类中有域a,我可以正常操作A.a(访问和写值),现在我要动画A的a域,直接用ObjectAnimator是不行了,因为A类中没有A.setA()这个方法,那该怎么办呢?使用包装类,写一个A的包装类AWrapper,它接受一个A对象来构造自己,然后里面有一个setter和getter方法来设置和读取A的a域。现在就可以在AWrapper上使用ObjectAnimator了。
六、ValueAnimator
ValueAnimator提供的便利性大大强于ObejectAnimator,因为需要你自己去更新对象的值,ValueAnimator只是为了提供了一个过渡值。为了更新对象的值,你就必须去设置前面讲的AnimationUpdateListenr接口。一个简单的例子来完成ValueAnimator的使用:
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); final float X = 0, Y = 500; LogUtil.d("X,Y = "+X+","+Y); mValueAnimator = ValueAnimator.ofFloat(0f, 1f); mValueAnimator.setDuration(3 * 1000); mValueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { mChangelocation.setY(Y * (Float)animation.getAnimatedValue()); mChangelocation.invalidate(); } }); mValueAnimator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); mChangelocation.setY(Y); } }); } @OnClick(R.id.btn_cl) void onChangeLocationClicked() { mValueAnimator.start(); }}
效果:
七、动画集: Keyframes于AnimatorSet
类似于ViewAnimation中的动画集,参考资料:AnimatorSet
Keyframes实现动画集:Keyframes
本篇涉及例子下载:Github

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











webdevelopmentReliesOnhtml、css、andjavascript:1)htmlStructuresContent、2)cssStylesit、および3)Javascriptaddsinteractivity、形成、

Web開発におけるHTML、CSS、およびJavaScriptの役割は次のとおりです。1。HTMLは、Webページ構造を定義し、2。CSSはWebページスタイルを制御し、3。JavaScriptは動的な動作を追加します。一緒に、彼らは最新のウェブサイトのフレームワーク、美学、および相互作用を構築します。

HTMLの将来の傾向はセマンティクスとWebコンポーネントであり、CSSの将来の傾向はCSS-in-JSとCSShoudiniであり、JavaScriptの将来の傾向はWebAssemblyとServerLessです。 1。HTMLセマンティクスはアクセシビリティとSEO効果を改善し、Webコンポーネントは開発効率を向上させますが、ブラウザの互換性に注意を払う必要があります。 2。CSS-in-JSは、スタイル管理の柔軟性を高めますが、ファイルサイズを増やす可能性があります。 CSShoudiniは、CSSレンダリングの直接操作を可能にします。 3. Webassemblyブラウザーアプリケーションのパフォーマンスを最適化しますが、急な学習曲線があり、サーバーレスは開発を簡素化しますが、コールドスタートの問題の最適化が必要です。

HTMLの将来は、無限の可能性に満ちています。 1)新機能と標準には、より多くのセマンティックタグとWebComponentsの人気が含まれます。 2)Webデザインのトレンドは、レスポンシブでアクセス可能なデザインに向けて発展し続けます。 3)パフォーマンスの最適化により、応答性の高い画像読み込みと怠zyなロードテクノロジーを通じてユーザーエクスペリエンスが向上します。

Web開発におけるHTML、CSS、およびJavaScriptの役割は次のとおりです。HTMLはコンテンツ構造を担当し、CSSはスタイルを担当し、JavaScriptは動的な動作を担当します。 1。HTMLは、セマンティクスを確保するためにタグを使用してWebページの構造とコンテンツを定義します。 2。CSSは、セレクターと属性を介してWebページスタイルを制御して、美しく読みやすくします。 3。JavaScriptは、動的でインタラクティブな関数を実現するために、スクリプトを通じてWebページの動作を制御します。

HTMLは、Webページ構造の構築の基礎です。 1。HTMLは、コンテンツ構造とセマンティクス、および使用などを定義します。タグ。 2. SEO効果を改善するために、などのセマンティックマーカーを提供します。 3.タグを介したユーザーの相互作用を実現するには、フォーム検証に注意してください。 4. JavaScriptと組み合わせて、動的効果を実現するなどの高度な要素を使用します。 5.一般的なエラーには、閉じられていないラベルと引用されていない属性値が含まれ、検証ツールが必要です。 6.最適化戦略には、HTTP要求の削減、HTMLの圧縮、セマンティックタグの使用などが含まれます。

HTMLの役割は、タグと属性を使用してWebページの構造とコンテンツを定義することです。 1。HTMLは、読みやすく理解しやすいようなタグを介してコンテンツを整理します。 2。アクセシビリティとSEOを強化するには、セマンティックタグなどを使用します。 3. HTMLコードの最適化により、Webページの読み込み速度とユーザーエクスペリエンスが向上する可能性があります。

htmlisnotaprogramminglanguage; itisamarkuplanguage.1)htmlStructuresandformatswebcontentusingtags.2)ItworkswithcsssssssssdjavascriptforInteractivity、強化を促進します。
