日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
MaterialDesign中全新的動畫

Material Design中的動畫將為用戶提供操作反饋并在用戶與您的應(yīng)用進行互動時提供視覺連續(xù)性。 Material Design將為按鈕與操作行為轉(zhuǎn)換提供一些默認動畫,而 Android 5.0(API Level 21)及更高版本可讓您定制這些動畫,同時也可創(chuàng)建新動畫:

10年積累的成都網(wǎng)站制作、成都網(wǎng)站設(shè)計經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先網(wǎng)站設(shè)計制作后付款的網(wǎng)站建設(shè)流程,更有城東免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

一、觸摸反饋動畫

效果圖: 

 

 

 

Material Design的觸摸反饋可在用戶與 UI 元素互動時,在接觸點上提供即時視覺確認。 適用于按鈕的默認觸摸動畫使用全新 RippleDrawable類別,以波紋效果實現(xiàn)不同狀態(tài)間的轉(zhuǎn)換。

在大多數(shù)情況下,應(yīng)以下列方式指定視圖背景,在您的視圖 XML 中應(yīng)用此功能:

  • android:attr/selectableItemBackground 指定有界的波紋。
  • android:attr/selectableItemBackgroundBorderless 指定越過視圖邊界的波紋。 它將由一個非空背景的視圖的最近父項所繪制和設(shè)定邊界。

任何view處于可點擊狀態(tài),都可以使用RippleDrawable來達到水波紋特效,而且必須處于可點擊狀態(tài),才會出現(xiàn)波紋動畫效果。

在代碼中可以這樣設(shè)置: 

 

 

 

注意:selectableItemBackgroundBorderless是 API Level 21 中推出的新屬性。

此外,您可利用 ripple元素將 RippleDrawable定義為一個 XML 資源。

您可以為 RippleDrawable對象指定一種顏色。如果要改變默認觸摸反饋顏色,請使用主題的 android:colorControlHighlight屬性。

如果要了解更多信息,請參閱 RippleDrawable類別的 API 參考文檔。

我們來看看系統(tǒng)自帶的觸摸反饋動畫是怎么實現(xiàn)的,為什么只需要在view的background或者foreground屬性設(shè)置成?android:attr/selectableItemBackground或者?android:attr/selectableItemBackgroundBorderless就可以實現(xiàn)波紋動畫的效果?這兩個屬性點進去,可以看到在路徑sdk/platforms/android-xx/data/res/values/attrs.xml文件中有定義這么兩個屬性:

 
 
 
 
  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.   

我們想到,這兩個屬性既然是整個app中有效的,那可能會是在Theme中的屬性吧,那就去AndroidManifest文件中跟這個Theme一步步看下去,***在Base.V21.Theme.AppCompat.Light這個style中看到確實是有這兩個item屬性:

 
 
 
 
  1. ?android:attr/selectableItemBackground 
  2.  
  3. ?android:attr/selectableItemBackgroundBorderless  

但是這里還是調(diào)用的系統(tǒng)的定義的屬性,繼續(xù)往下追,在android:Theme.Material和android:Theme.Material.Light中,可以看到:

 
 
 
 
  1. @drawable/item_background_material 
  2.  
  3. @drawable/item_background_borderless_material  

然后sdk路徑下platforms\\android-xx\\data\\res\\drawable可以找到這些資源文件如下圖: 

 

 

 

item_background_material的內(nèi)容是:

 
 
 
 
  1.  
  2.     android:color="?attr/colorControlHighlight"> 
  3.  
  4.      
  5.  
  6.          
  7.  
  8.      
  9.  
  10.   

item_background_borderless_material的內(nèi)容是:

 
 
 
 
  1.  
  2.     android:color="?attr/colorControlHighlight" />  

系統(tǒng)的做法是用ripple元素將 RippleDrawable定義為一個 XML 資源,而通過看View的源碼中在構(gòu)造方法中是這樣獲取background屬性的:

 
 
 
 
  1. public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
  2.  
  3.         this(context); 
  4.  
  5.  
  6.         final TypedArray a = context.obtainStyledAttributes( 
  7.  
  8.                 attrs, com.android.internal.R.styleable.View, defStyleAttr, defStyleRes); 
  9.  
  10.  
  11.         if (mDebugViewAttributes) { 
  12.  
  13.             saveAttributeData(attrs, a); 
  14.  
  15.         } 
  16.  
  17.  
  18.         Drawable background = null; 
  19.  
  20.  
  21.         switch (attr) { 
  22.  
  23.             case com.android.internal.R.styleable.View_background: 
  24.  
  25.                 background = a.getDrawable(attr); 
  26.  
  27.                 break; 
  28.  
  29.         . 
  30.  
  31.         . 
  32.  
  33.         . 
  34.  
  35. }  

也就是說,這個background實際上就是RippleDrawable類。那我們就來看看這個RippleDrawable內(nèi)部到底是怎么做的吧。

首先官方文檔對RippleDrawable解釋是

Drawable that shows a ripple effect in response to state changes. The anchoring position of the ripple for a given state may be specified by calling setHotspot(float, float)with the corresponding state attribute identifier.

通過顯示出波紋效果來響應(yīng)狀態(tài)的改變,對于給定狀態(tài)的波紋的錨定位置可以通過調(diào)用具有對應(yīng)的狀態(tài)屬性標識符的setHotspot(float,float)來指定。

RippleDrawable繼承自LayerDrawable,而LayerDrawable是繼承Drawable,RippleDrawable又是為了響應(yīng)View的statechange,那就看看Drawable類中對點擊時的狀態(tài)處理吧。

 
 
 
 
  1. public boolean setState(@NonNull final int[] stateSet) { 
  2.  
  3.     if (!Arrays.equals(mStateSet, stateSet)) { 
  4.  
  5.         mStateSet = stateSet; 
  6.  
  7.         return onStateChange(stateSet); 
  8.  
  9.     } 
  10.  
  11.     return false; 
  12.  
  13. }  

給Drawable設(shè)置狀態(tài)屬性時,會把狀態(tài)的數(shù)組傳給onStateChange方法,在RippleDrawable中重寫了onStateChange。 

 

 

 

看到setRippleActive和setBackgroundActive這兩個方法應(yīng)該可以猜到是什么意思了,接著看。

 
 
 
 
  1. private void setRippleActive(boolean active) { 
  2.  
  3.     if (mRippleActive != active) { 
  4.  
  5.         mRippleActive = active; 
  6.  
  7.         if (active) { 
  8.  
  9.             tryRippleEnter(); 
  10.  
  11.         } else { 
  12.  
  13.             tryRippleExit(); 
  14.  
  15.         } 
  16.  
  17.     } 
  18.  
  19. }  

如果Drawable是enable=true且pressd=true時,會調(diào)用tryRippleEnter方法 

 

 

 

看到這里,我們可以知道要開始做波紋動畫的效果了。mRipple 是RippleForeground類的實例,然而我沒有在RippleForeground類中找到setup和enter方法,但是RippleForeground繼承自RippleComponent類,于是,我在這個類中發(fā)現(xiàn)了這兩個方法。

 
 
 
 
  1. public final void setup(float maxRadius, int densityDpi) { 
  2.  
  3.     if (maxRadius >= 0) { 
  4.  
  5.         mHasMaxRadius = true; 
  6.  
  7.         mTargetRadius = maxRadius; 
  8.  
  9.     } else { 
  10.  
  11.         mTargetRadius = getTargetRadius(mBounds); 
  12.  
  13.     } 
  14.  
  15.  
  16.     mDensityScale = densityDpi * DisplayMetrics.DENSITY_DEFAULT_SCALE; 
  17.  
  18.  
  19.     onTargetRadiusChanged(mTargetRadius); 
  20.  
  21. }  

setup是初始化一系列參數(shù),enter創(chuàng)建一個動畫并開始動畫。 

 

 

 

從上面創(chuàng)建動畫的代碼可以看到,實際上是一個組合的屬性動畫,然后自定義了三個屬性波紋半徑TWEEN_RADIUS、波紋中心點TWEEN_ORIGIN和波紋的不透明度OPACITY。通過這三個屬性的過渡變化得到一個復(fù)合的動畫。以上就是前景波紋動畫效果的實現(xiàn)過程。

 
 
 
 
  1. private void setBackgroundActive(boolean active, boolean focused) { 
  2.  
  3.     if (mBackgroundActive != active) { 
  4.  
  5.         mBackgroundActive = active; 
  6.  
  7.         if (active) { 
  8.  
  9.             tryBackgroundEnter(focused); 
  10.  
  11.         } else { 
  12.  
  13.             tryBackgroundExit(); 
  14.  
  15.         } 
  16.  
  17.     } 
  18.  
  19. }  

mBackground是RippleBackground類的實例,與RippleForeground不同的是,背景動畫只是改變了不透明度。

 
 
 
 
  1. @Override 
  2.  
  3. protected Animator createSoftwareEnter(boolean fast) { 
  4.  
  5.     // Linear enter based on current opacity. 
  6.  
  7.     final int maxDuration = fast ? OPACITY_ENTER_DURATION_FAST : OPACITY_ENTER_DURATION; 
  8.  
  9.     final int duration = (int) ((1 - mOpacity) * maxDuration); 
  10.  
  11.  
  12.     final ObjectAnimator opacity = ObjectAnimator.ofFloat(this, OPACITY, 1); 
  13.  
  14.     opacity.setAutoCancel(true); 
  15.  
  16.     opacity.setDuration(duration); 
  17.  
  18.     opacity.setInterpolator(LINEAR_INTERPOLATOR); 
  19.  
  20.  
  21.     return opacity; 
  22.  
  23. }  

以上分析的都是手指觸摸view時產(chǎn)生的enter波紋動畫,當(dāng)手指抬起時state也會改變,會產(chǎn)生一個exit動畫,這里就不詳細分析了。

二、使用揭露效果

效果圖: 

 

 

 

當(dāng)需要顯示或隱藏一組UI元素時,揭露動畫可為用戶提供視覺連續(xù)性。

 
 
 
 
  1. /* @param view The View will be clipped to the animating circle.要隱藏或顯示的view 
  2.  
  3.  * @param centerX The x coordinate of the center of the animating circle, relative to view.動畫開始的中心點X 
  4.  
  5.  * @param centerY The y coordinate of the center of the animating circle, relative to view.動畫開始的中心點Y 
  6.  
  7.  * @param startRadius The starting radius of the animating circle.動畫開始半徑 
  8.  
  9.  * @param endRadius The ending radius of the animating circle.動畫結(jié)束半徑 
  10.  
  11.  */ 
  12.  
  13. public static Animator createCircularReveal(View view, 
  14.  
  15.         int centerX,  int centerY, float startRadius, float endRadius) { 
  16.  
  17.     return new RevealAnimator(view, centerX, centerY, startRadius, endRadius); 
  18.  
  19. }  

RevealAnimator和之前的動畫使用沒什么區(qū)別,同樣可以設(shè)置監(jiān)聽器和加速器來實現(xiàn)各種各樣的特效,該動畫主要用在隱藏或者顯示一個view,改變view的大小等過渡效果。

顯示view:

 
 
 
 
  1. final TextView tv9 = (TextView) findViewById(R.id.tv9); 
  2.  
  3.  
  4. findViewById(R.id.content_main).setOnClickListener(new View.OnClickListener() { 
  5.  
  6.     @Override public void onClick(View v) { 
  7.  
  8.         // get the center for the clipping circle 
  9.  
  10.         int cx = (tv9.getRight() - tv9.getLeft()) / 2; 
  11.  
  12.         int cy = (tv9.getBottom() - tv9.getTop()) / 2; 
  13.  
  14.  
  15.         // get the final radius for the clipping circle 
  16.  
  17.         int finalRadius = Math.max(tv9.getWidth(), tv9.getHeight()); 
  18.  
  19.  
  20.         // create the animator for this view (the start radius is zero) 
  21.  
  22.         final Animator anim = ViewAnimationUtils.createCircularReveal(tv9, cx, cy, 0, finalRadius); 
  23.  
  24.  
  25.         tv9.setVisibility(View.VISIBLE); 
  26.  
  27.  
  28.         anim.start(); 
  29.  
  30.     } 
  31.  
  32. });  

隱藏view:

 
 
 
 
  1. final TextView tv9 = (TextView) findViewById(R.id.tv9); 
  2.  
  3.  
  4. tv9.setOnClickListener(new View.OnClickListener() { 
  5.  
  6.     @Override public void onClick(View v) { 
  7.  
  8.         // get the center for the clipping circle 
  9.  
  10.         int cx = (tv9.getRight() - tv9.getLeft()) / 2; 
  11.  
  12.         int cy = (tv9.getBottom() - tv9.getTop()) / 2; 
  13.  
  14.  
  15.         // get the final radius for the clipping circle 
  16.  
  17.         int initRadius = Math.max(tv9.getWidth(), tv9.getHeight()); 
  18.  
  19.  
  20.         // create the animator for this view (the start radius is zero) 
  21.  
  22.         final Animator anim = ViewAnimationUtils.createCircularReveal(tv9, cx, cy, initRadius, 0); 
  23.  
  24.  
  25.         anim.addListener(new AnimatorListenerAdapter() { 
  26.  
  27.             @Override public void onAnimationEnd(Animator animation) { 
  28.  
  29.                 super.onAnimationEnd(animation); 
  30.  
  31.                 // make the view visible and start the animation 
  32.  
  33.                 tv9.setVisibility(View.INVISIBLE); 
  34.  
  35.             } 
  36.  
  37.         }); 
  38.  
  39.         anim.start(); 
  40.  
  41.     } 
  42.  
  43. });  

沿著中心縮小:

 
 
 
 
  1. Animator animator = ViewAnimationUtils.createCircularReveal(view, view.getWidth() / 2, view.getHeight() / 2, view.getWidth(), 0); 
  2.  
  3. animator.setInterpolator(new LinearInterpolator()); 
  4.  
  5. animator.setDuration(1000); 
  6.  
  7. animator.start();  

從左上角擴展:

 
 
 
 
  1. Animator animator = ViewAnimationUtils.createCircularReveal(view,0,0,0,(float) Math.hypot(view.getWidth(), view.getHeight())); 
  2.  
  3. animator.setDuration(1000); 
  4.  
  5. animator.start();  

三、使用轉(zhuǎn)場動畫

效果圖以共享元素的轉(zhuǎn)場動畫為例: 

 

 

 

MaterialDesign應(yīng)用中的操作行為轉(zhuǎn)換透過通用元素之間的移動和轉(zhuǎn)換提供不同狀態(tài)之間的視覺連接??蔀檫M入、退出轉(zhuǎn)換以及操作行為之間的共享元素轉(zhuǎn)換指定定制動畫。在5.0之前,我們可以在startActivity之后調(diào)用overridePendingTransition來指定Activity的轉(zhuǎn)場動畫。

  • 進入轉(zhuǎn)換將決定操作行為中視圖如何進入場景。例如,在分解進入轉(zhuǎn)換中,視圖將從屏幕外進入場景并飛往屏幕中心。
  • 退出轉(zhuǎn)換將決定操作行為中應(yīng)用行為的顯示視圖如何退出場景。例如,在分解退出轉(zhuǎn)換中,視圖將從屏幕中心退出場景。
  • 共享元素轉(zhuǎn)換將決定兩個操作行為轉(zhuǎn)換之間共享的視圖如何在這些操作行為中轉(zhuǎn)換。 例如,如果兩個操作行為擁有相同的圖像,但其位置與大小不同,changeImageTransform共享元素轉(zhuǎn)換將在這些操作行為之間平滑地轉(zhuǎn)換與縮放圖像。

Android 5.0(API Level 21)支持這些進入與退出轉(zhuǎn)換:(普通過渡動畫)

  • 分解 - 從場景中心移入或移出視圖。
  • 滑動 - 從場景邊緣移入或移出視圖。
  • 淡入淡出 - 通過調(diào)整透明度在場景中增添或移除視圖。

也支持這些共享元素轉(zhuǎn)換:(共享元素的過渡動畫)

  • changeBounds - 為目標視圖的大小添加動畫。
  • changeClipBounds - 為目標視圖的裁剪大小添加動畫。
  • changeTransform - 為目標視圖的縮放、旋轉(zhuǎn)和位移添加動畫。
  • changeImageTransform - 為目標圖片的縮放、旋轉(zhuǎn)和位移添加動畫。

指定轉(zhuǎn)場動畫

要想使用新的轉(zhuǎn)場動畫,可以繼承Material Design主題后在style風(fēng)格中指定: 

 

 

 

其中,change_image_transform定義如下:

 
 
 
 
  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.    
  8.  
  9.   

如果要帶代碼中開啟窗口內(nèi)容轉(zhuǎn)換,需要調(diào)用Window.requestFeature()方法。 

 

 

 

普通轉(zhuǎn)場動畫:

所有繼承自visibility類都可以作為進入、退出的過度動畫。如果我們想自定義進入和退出時的動畫效果,只需要繼承Visibility,重載onAppear和onDisappear方法來定義進入喝退出的動畫。系統(tǒng)提供了三種默認方式:

  • explode 從屏幕中心移入或移出視圖
  • slide 從屏幕邊緣移入或移出視圖
  • fade 改變視圖的透明度

想在xml中指定自定義的進入、退出的過度動畫需要先對動畫進行定義:

 
 
 
 
  1.  

注意:其中CustomTransition是我們自定義的動畫,它必須繼承自Visibility。

想以普通轉(zhuǎn)場動畫的方式啟動一個Activity,必須在startActivity函數(shù)中傳遞一個ActivityOptions的Bundle對象:

 
 
 
 
  1. ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(activity);  
  2.  
  3. startActivity(intent, options.toBundle());  

如果想讓返回也具備轉(zhuǎn)場效果,那么在返回的Activity中不要再調(diào)用finish函數(shù),而是應(yīng)該使finishAfterTransition來結(jié)束一個Activity,該函數(shù)會等待動畫執(zhí)行完畢才結(jié)束該Activity。

共享轉(zhuǎn)場動畫:

如果要在兩個具有共享元素的Activity之間使用轉(zhuǎn)場動畫,那么:

1、在題中啟用窗口內(nèi)容轉(zhuǎn)換。android:windowContentTransitions

2、在Theme中指定一個共享元素轉(zhuǎn)換。

3、將transitions定義為xml資源。

4、利用 android:transitionName屬性對兩個布局中的共享元素指定一個通用名稱。

5、使用 ActivityOptions.makeSceneTransitionAnimation()方法。

 
 
 
 
  1. // get the element that receives the click event 
  2.  
  3. final View imgContainerView = findViewById(R.id.img_container); 
  4.  
  5.  
  6. // get the common element for the transition in this activity 
  7.  
  8. final View androidRobotView = findViewById(R.id.image_small); 
  9.  
  10.  
  11. // define a click listener 
  12.  
  13. imgContainerView.setOnClickListener(new View.OnClickListener() { 
  14.  
  15.     @Override 
  16.  
  17.     public void onClick(View view) { 
  18.  
  19.         Intent intent = new Intent(this, Activity2.class); 
  20.  
  21.         // create the transition animation - the images in the layouts 
  22.  
  23.         // of both activities are defined with android:transitionName="robot" 
  24.  
  25.         ActivityOptions options = ActivityOptions 
  26.  
  27.             .makeSceneTransitionAnimation(this, androidRobotView, "robot"); 
  28.  
  29.         // start the new activity 
  30.  
  31.         startActivity(intent, options.toBundle()); 
  32.  
  33.     } 
  34.  
  35. });  

如果要在代碼中生成共享view,那么需要調(diào)用View.setTransitionName()方法對兩個布局中的共享元素指定一個通用名稱。

如果有多個共享元素,則可以通過Pair進行包裝處理:

 
 
 
 
  1. ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(activity, 
  2.  
  3.       Pair.create(view1, "name1"),//這里view1、view2如果是TextView或者ImageView等,需要轉(zhuǎn)成View類型才可以 
  4.  
  5.       Pair.create(view2, "name2"));       
  6.  
  7. startActivity(intent,.toBundle());  

返回時如果需要具備轉(zhuǎn)場動畫,那么也需要用finish函數(shù)替代finishAfterTransition來結(jié)束一個Activity。

使用曲線運動

因為曲線運動和屬性動畫以及貝塞爾曲線這些東西混雜在一起,所以準備把這節(jié)拿出來單獨寫。這里就不多說了。

視圖狀態(tài)改變

Android 5.0在原有的圖片選擇器和顏色選擇器上進行了增強,不僅是控件能根據(jù)不同的狀態(tài)顯示不同的背景圖片,還能在兩種狀態(tài)切換時指定一個動畫,來增加過渡效果,吸引用戶眼球,以突出重點內(nèi)容。

StateListAnimator類和圖片選擇器,顏色選擇器類似,可以根據(jù)view的狀態(tài)改變呈現(xiàn)不同的動畫效果,通過xml我們可以構(gòu)建對應(yīng)不同狀態(tài)的動畫合集,其使用方式也非常簡單,在對應(yīng)的狀態(tài)指定一個屬性動畫即可:

 
 
 
 
  1.  
  2.  
  3.      
  4.  
  5.          
  6.  
  7.             
  8.  
  9.                             android:duration="200" 
  10.  
  11.                             android:valueTo="20dp" 
  12.  
  13.                             android:valueType="floatType"/> 
  14.  
  15.          
  16.  
  17.      
  18.  
  19.      
  20.  
  21.          
  22.  
  23.             
  24.  
  25.                             android:duration="200" 
  26.  
  27.                             android:valueTo="0" 
  28.  
  29.                             android:valueType="floatType"/> 
  30.  
  31.          
  32.  
  33.      
  34.  
  35.   

代碼中這樣加載即可:

 
 
 
 
  1. TextView tv11 = (TextView) findViewById(R.id.tv11); 
  2.  
  3. StateListAnimator stateLAnim = AnimatorInflater.loadStateListAnimator(this,R.drawable.selector_for_button); 
  4.  
  5. tv11.setStateListAnimator(stateLAnim);  

繼承了Material主題后,按鈕默認擁有了z屬性動畫。如果想取消這種默認狀態(tài),可以把狀態(tài)動畫指定為null。

除了StateListAnimator類指定狀態(tài)切換的屬性動畫外,還可以通過AnimatedStateListDrawable來指定狀態(tài)切換的幀動畫:

 
 
 
 
  1.  
  2.  
  3.      
  4.  
  5.      
  6.  
  7.      
  8.  
  9.          
  10.  
  11.              
  12.  
  13.              
  14.  
  15.              
  16.  
  17.          
  18.  
  19.      
  20.  
  21.   

幀動畫的資源文件直接在xml中作為view的background即可。

四、矢量圖動畫

效果圖: 

 

 

 

先在drawable中定義一張矢量圖:

 
 
 
 
  1.  
  2.  
  3.  
  4.     android:height="200dp" 
  5.  
  6.     android:width="200dp" 
  7.  
  8.     android:viewportHeight="400" 
  9.  
  10.     android:viewportWidth="400"> 
  11.  
  12.        
  13.  
  14.     
  15.  
  16.         android:name="rotationGroup" 
  17.  
  18.         android:pivotX="0" 
  19.  
  20.         android:pivotY="0"> 
  21.  
  22.             
  23.  
  24.         
  25.  
  26.             android:name="star" 
  27.  
  28.             android:pathData="M 100,100 h 200 l -200 150 100 -250 100 250 z" 
  29.  
  30.             android:strokeColor="@color/colorPrimary" 
  31.  
  32.             android:strokeLineCap="round" 
  33.  
  34.             android:strokeWidth="10"/> 
  35.  
  36.            
  37.  
  38.      
  39.  
  40.   

然后在anim中定義動畫:

 
 
 
 
  1.  
  2.  
  3.  
  4.  
  5.     
  6.  
  7.         android:propertyName="trimPathStart" 
  8.  
  9.         android:valueFrom="0" 
  10.  
  11.         android:valueTo="1" 
  12.  
  13.         android:valueType="floatType" 
  14.  
  15.         android:duration="2000" 
  16.  
  17.         android:repeatMode="reverse" 
  18.  
  19.         android:repeatCount="-1" 
  20.  
  21.         android:interpolator="@android:interpolator/accelerate_decelerate"/> 
  22.  
  23.   

***在drawable中定義一個animated-vector:將動畫資源指定給drawable屬性值的矢量圖。

 
 
 
 
  1.    android:drawable="@drawable/vector_drawable"> 
  2.    
  3.        android:name="star" 
  4.        android:animation="@anim/animation"/>  

注意:這里drawable屬性值是前面我們定義的矢量圖,target中name要和矢量圖中path的name一樣,animation就是前面定義的動畫資源文件。

在view的xml中使用以及在代碼中開始動畫: 

 
 
 
 
  1.  
  2.     android:id="@+id/iv" 
  3.  
  4.     android:layout_width="wrap_content" 
  5.  
  6.     android:layout_height="wrap_content" 
  7.  
  8.     android:layout_margin="20dp" 
  9.  
  10.     app:srcCompat="@drawable/anim_vector_drawable" 
  11.  
  12.     android:layout_gravity="center"/>   
 
 
 
 
  1. ImageView iv = (ImageView) findViewById(R.id.iv); 
  2.  
  3. Drawable drawable = iv.getDrawable(); 
  4.  
  5. if (drawable instanceof Animatable) { 
  6.  
  7.     ((Animatable) drawable).start(); 
  8.  
  9. }  

文章名稱:MaterialDesign中全新的動畫
網(wǎng)址分享:http://www.5511xx.com/article/cdecogo.html