多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > php開(kāi)源 > 綜合技術(shù) > 屬性動(dòng)畫(huà)資料文件如何編寫(xiě)?property-animation資源文件 屬性動(dòng)畫(huà)如何自定義TypeEvaluator

屬性動(dòng)畫(huà)資料文件如何編寫(xiě)?property-animation資源文件 屬性動(dòng)畫(huà)如何自定義TypeEvaluator

來(lái)源:程序員人生   發(fā)布時(shí)間:2017-02-06 08:33:02 閱讀次數(shù):2910次

android動(dòng)畫(huà)分為3種:AnimationDrawable(類(lèi))逐幀動(dòng)畫(huà);Tween補(bǔ)間動(dòng)畫(huà);property animation屬性動(dòng)畫(huà);

第1種的類(lèi)名:AnimationDrawable,在資料文件部份,這類(lèi)動(dòng)畫(huà)也屬于Drawable的1種,是Drawable的子類(lèi);

第2種的類(lèi)名:Animation,Animation是個(gè)抽象類(lèi),android提供了幾個(gè)具體的實(shí)現(xiàn)類(lèi)如TranslateAnimation,RotateAnimation,AlphaAnimation,ScaleAnimation;

第3種的類(lèi)名:Animator,Animator也是個(gè)抽象類(lèi),android提供了ValueAnimator和ObjectAnimator和Animatorset作為具體實(shí)現(xiàn)。其中ObjectAnimator繼承了ValueAnimator,前者1般情況下使用起來(lái)可以更方便,但有些特殊情況必須使用ValueAnimator.   而Animatorset可以對(duì)多個(gè)Animator對(duì)象包裹。


在這里主要就Animator進(jìn)行1些記錄:

定義屬性動(dòng)畫(huà)資源文件的格式舉例:


實(shí)例-實(shí)現(xiàn)不斷漸變的背風(fēng)景


res文件夾下建立animator文件夾,在該文件夾下建立

color_anim.xml

<?xml version="1.0" encoding="utf⑻"?>
<objectAnimator xmlns:Android="http://schemas.android.com/apk/res/android" 
    android:propertyName="backgroundColor"
    android:duration="3000"
    android:valueFrom="#FF8080"
    android:valueTo="#8080FF"
    android:repeatCount="infinite"
    android:repeatMode="reverse"
    android:valueType="intType">
    
</objectAnimator>

其他文件

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/my_linear"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" 
    android:orientation="vertical">

</LinearLayout>

MainActivity.Java

package com.example.propertyanimation;

import android.os.Bundle;
import android.animation.AnimatorInflater;
import android.animation.ArgbEvaluator;
import android.animation.ObjectAnimator;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.view.Menu;
import android.view.View;
import android.widget.LinearLayout;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
LinearLayout Container=(LinearLayout) super.findViewById(R.id.my_linear);
container.addView(new MyAnimationView(this));
}

public class MyAnimationView extends View{

@SuppressLint("NewApi")
public MyAnimationView(Context context) {
super(context);
//加載動(dòng)畫(huà)資源
ObjectAnimator colorAnim=(ObjectAnimator) AnimatorInflater.loadAnimator(MainActivity.this, R.animator.color_anim);
/**
* 如果想要的動(dòng)畫(huà)類(lèi)型是Android系統(tǒng)所未知的,那末通過(guò)實(shí)現(xiàn)TypeEvaluator接口就可以夠創(chuàng)建自己的評(píng)價(jià)器。
* Android系統(tǒng)已知的類(lèi)型是int、float或色彩(color),分別有IntEvaluator、FloatEvaluator
* 和ArgbEvaluator類(lèi)型的評(píng)價(jià)器所支持。
*/
colorAnim.setEvaluator(new ArgbEvaluator());
//對(duì)該View本身利用屬性動(dòng)畫(huà)
colorAnim.setTarget(this);
//開(kāi)始指定動(dòng)畫(huà)
colorAnim.start();
}
}
}



屬性動(dòng)畫(huà)使用時(shí)有時(shí)會(huì)用到自定義的TypeEvaluator,自定義舉例:

如果想根據(jù)某個(gè)屬性TYPE來(lái)實(shí)現(xiàn)動(dòng)畫(huà),但是這個(gè)Type又不是Android系統(tǒng)內(nèi)置的,這個(gè)時(shí)候就需要?jiǎng)?chuàng)建1個(gè)自己的evaluator來(lái)實(shí)現(xiàn)了,并且新創(chuàng)建的type必須實(shí)現(xiàn)接口TypeEvaluator。Android系統(tǒng)內(nèi)置的type有int,float和color,他們對(duì)應(yīng)的evaluator是IntEvaluator、FloatEvaluator和ArgbEvaluator。接口TypeEvaluator內(nèi)只有1個(gè)方法,用來(lái)計(jì)算要實(shí)現(xiàn)動(dòng)畫(huà)屬性的值。    

[java] view plain copy
  1. /** 
  2.  * Interface for use with the {@link ValueAnimator#setEvaluator(TypeEvaluator)} function. Evaluators 
  3.  * allow developers to create animations on arbitrary property types, by allowing them to supply 
  4.  * custom evaluators for types that are not automatically understood and used by the animation 
  5.  * system. 
  6.  * 
  7.  * @see ValueAnimator#setEvaluator(TypeEvaluator) 
  8.  */  
  9. public interface TypeEvaluator<T> {  
  10. /** 
  11.      * This function returns the result of linearly interpolating the start and end values, with 
  12.      * <code>fraction</code> representing the proportion between the start and end values. The 
  13.      * calculation is a simple parametric calculation: <code>result = x0 + t * (x1 - x0)</code>, 
  14.      * where <code>x0</code> is <code>startValue</code>, <code>x1</code> is <code>endValue</code>, 
  15.      * and <code>t</code> is <code>fraction</code>. 
  16.      * 
  17.      * @param fraction   The fraction from the starting to the ending values 
  18.      * @param startValue The start value. 
  19.      * @param endValue   The end value. 
  20.      * @return A linear interpolation between the start and end values, given the 
  21.      *         <code>fraction</code> parameter. 
  22.      */  
  23. public T evaluate(float fraction, T startValue, T endValue);  
  24.   
  25. }  
先看看Android系統(tǒng)內(nèi)置FloatEvaluator是怎樣弄的:
[java] view plain copy
  1. public class FloatEvaluator implements TypeEvaluator<Number> {  
  2. /** 
  3.      * This function returns the result of linearly interpolating the start and end values, with 
  4.      * <code>fraction</code> representing the proportion between the start and end values. The 
  5.      * calculation is a simple parametric calculation: <code>result = x0 + t * (v1 - v0)</code>, 
  6.      * where <code>x0</code> is <code>startValue</code>, <code>x1</code> is <code>endValue</code>, 
  7.      * and <code>t</code> is <code>fraction</code>. 
  8.      * 
  9.      * @param fraction   The fraction from the starting to the ending values 
  10.      * @param startValue The start value; should be of type <code>float</code> or 
  11.      *                   <code>Float</code>  
  12. * @param endValue   The end value; should be of type <code>float</code> or <code>Float</code> 
  13. * @return A linear interpolation between the start and end values, given the 
  14.      *         <code>fraction</code> parameter. 
  15.      */  
  16. public Float evaluate(float fraction, Number startValue, Number endValue) {  
  17. float startFloat = startValue.floatValue();  
  18.         return startFloat + fraction * (endValue.floatValue() - startFloat);  
  19. }  
  20. }  
還是舉個(gè)例子來(lái)測(cè)試1下,先看下面圖中的效果:

這個(gè)動(dòng)畫(huà)在Android-Property Animation(屬性動(dòng)畫(huà))中就實(shí)現(xiàn)過(guò)了,當(dāng)時(shí)是這么實(shí)現(xiàn)的:
[java] view plain copy
  1. private void startValueAnimation(){  
  2.     if(mValueAnimator == null){  
  3.         mValueAnimator = ValueAnimator.ofFloat(0500);  
  4.     }  
  5.     mValueAnimator.setInterpolator(new AnticipateInterpolator());  
  6.     mValueAnimator.setTarget(mImageView);  
  7.     mValueAnimator.setDuration(3000);  
  8.     mValueAnimator.setRepeatCount(1);  
  9.     mValueAnimator.start();  
  10.     mValueAnimator.addUpdateListener(new AnimatorUpdateListener() {  
  11.         @Override  
  12.         public void onAnimationUpdate(ValueAnimator animation) {  
  13.         //同時(shí)設(shè)置X,Y 兩個(gè)屬性  
  14.             mImageView.setTranslationX((Float) animation.getAnimatedValue());  
  15.             mImageView.setTranslationY((Float) animation.getAnimatedValue());  
  16.         }  
  17.     });  
  18. }  
在動(dòng)畫(huà)update的時(shí)候同時(shí)更新View的X和Y屬性。另外,使用AnimatorSet也能夠?qū)崿F(xiàn)這類(lèi)動(dòng)畫(huà)效果。
除這兩種以外還有無(wú)呢?就是自定義1個(gè)TypeEvaluator,主要代碼以下:
[java] view plain copy
  1. private void startObjectAnimation() {  
  2.     ViewXYHolder viewXYHolder = new ViewXYHolder(mImageView);  
  3.     XYHolder startXY = new XYHolder(0f, 0f);  
  4.     XYHolder endXY = new XYHolder(500f, 500f);  
  5.     ObjectAnimator objectAnimator = ObjectAnimator.ofObject(viewXYHolder, "xY"new XYmEvaluator(), startXY, endXY);  
  6.     objectAnimator.setInterpolator(new LinearInterpolator());  
  7.     objectAnimator.setDuration(3000);  
  8.     objectAnimator.start();  
  9. }  
  10.   
  11. public class XYmEvaluator implements TypeEvaluator {  
  12.     public Object evaluate(float fraction, Object startValue, Object endValue) {  
  13.             XYHolder startXY = (XYHolder) startValue;  
  14.             XYHolder endXY = (XYHolder) endValue;  
  15.         return new XYHolder(startXY.getX() + fraction * (endXY.getX() - startXY.getX()),  
  16.             startXY.getY() + fraction * (endXY.getY() - startXY.getY()));  
  17.     }  
  18. }  
  19.   
  20. public class XYHolder{  
  21.     private float mX;  
  22.     private float mY;  
  23.   
  24.     public XYHolder(float x, float y) {  
  25.     mX = x;  
  26.     mY = y;  
  27. }  
  28.   
  29. public float getX() {  
  30.     return mX;  
  31. }  
  32.   
  33. public void setX(float x) {  
  34.     mX = x;  
  35. }  
  36.   
  37. public float getY() {  
  38.     return mY;  
  39. }  
  40.   
  41. public void setY(float y) {  
  42.     mY = y;  
  43.     }  
  44. }  
  45.   
  46. public class ViewXYHolder{  
  47.     private View imageView;  
  48.     public ViewXYHolder(View view){  
  49.         imageView = view;  
  50.     }  
  51.   
  52. //看到這個(gè)是否是感覺(jué)跟第1種方法1樣的感腳,只是封裝的不同  
  53. public void setXY(XYHolder xyHolder) {  
  54.     imageView.setX(xyHolder.getX());  
  55.     imageView.setY(xyHolder.getY());  
  56. }  
  57.   
  58. public XYHolder getXY() {  
  59.     return new XYHolder(imageView.getX(), imageView.getY());  
  60. }  
  61. }  
而其實(shí),對(duì)這個(gè)例子,使用的對(duì)象是1個(gè)View,Android系統(tǒng)中有封裝View屬性動(dòng)畫(huà)的1個(gè)類(lèi):ViewPropertyAnimator,其簡(jiǎn)單使用方式以下:
[html] view plain copy
  1. private void startViewPropertyAnimation(){  
  2.     ViewPropertyAnimator viewPropertyAnimator;  
  3.     viewPropertyAnimator = mImageView.animate().x(500).y(500);  
  4.     viewPropertyAnimator.setDuration(3000);  
  5.     viewPropertyAnimator.start();  
  6. }  
一樣也能實(shí)現(xiàn)上面的動(dòng)畫(huà)效果,只是只局限于View,不管方法怎樣變,但是終究原理都是1樣的,都是要同時(shí)改變X 和 Y兩個(gè)屬性的值。
復(fù)雜1點(diǎn)的例子還是直接參考ApiDemo比較好,ApiDemo里面有個(gè)Custom Evaluator,值得學(xué)習(xí)! 最后引文作者提到了ViewPropertyAnimator類(lèi),這個(gè)類(lèi)源碼解釋的意思大概是:這個(gè)類(lèi)可以自動(dòng)并優(yōu)化view對(duì)象所觸及的某些屬性的動(dòng)畫(huà),與用單純的Animator控制view屬性動(dòng)畫(huà)不同的是: Animator更合適于只對(duì)view對(duì)象的1兩個(gè)屬性進(jìn)行操作,當(dāng)view的很多個(gè)屬性都需要?jiǎng)赢?huà)操作時(shí)用ViewPropertyAnimator比較好,緣由在于后者可以將多個(gè)屬性操作放在1次invalidate履行,即多個(gè)屬性的變化可以是調(diào)用1次刷新。 而單純Animator每個(gè)屬性的變化都要單獨(dú)調(diào)用1次invalidate進(jìn)行刷新。

生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 1024在线视频国产在线播放 | 国产欧美另类性视频 | h视频网站在线 | 免费观看一级欧美大 | 亚洲一区精品视频在线 | 国产suv精品一区二区四区三区 | 欧美一级毛片无遮 | 波多野结衣在线不卡 | 国产精品自拍在线 | 在线视频中文字幕 | 操白嫩| 亚洲精品中文字幕乱码三区一二 | 色影音 | 在线国产视频观看 | 久久精品国产亚洲片 | 外国美女一级片 | 第一页亚洲| 伊人久久大香 | 国产三级中文字幕 | 亚洲国产精品二区久久 | 日韩亚洲一区中文字幕 | 黑人videovideosex大 | 欧美3| 国产精品suv | 五月天综合 | 看一级毛片一区二区三区免费 | 中日韩欧美在线观看 | 国产一区二区自拍视频 | 无人区一区二区三区乱码 | jizz日本老师jizz在线播放 | 日韩欧美亚州 | 欧美日本二区 | 亚洲第一区二区快射影院 | 欧美13一14周岁a在线播放 | jizz亚洲大全| 亚洲欧美一区二区三区久久 | 亚洲一区二区三区精品影院 | www.91在线播放 | 亚洲国产成人在线观看 | 日本无套| 精品在线播放视频 |