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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Android轉(zhuǎn)場動畫深度解析

前言

所謂轉(zhuǎn)場動畫,通俗的講就是一個Activity跳轉(zhuǎn)到另一個Activity是的動畫;Activity的轉(zhuǎn)場動畫很早就有了,5.0之前用的是overridePendingTransition()這個方法。在5.0之后,Google使用Material Design設計風格,進而有了的新的轉(zhuǎn)場轉(zhuǎn)場動畫的誕生,效果還是挺炫酷的;今天我們就來講解下。

一、轉(zhuǎn)場動畫兼容性

1、API21之前Activity過渡動畫使用

API21之前Activity過渡動畫通過兩種方式來實現(xiàn):style主題里面統(tǒng)一設置、使用代碼overridePendingTransition函數(shù)單獨設置;

style文件主題里面統(tǒng)一定義,全局為所有Activity設置過渡動畫效果;

 
 
 
 
  1. @style/Animation.Activity.Customer
  2.     
  3.         
  4.         @anim/right_in
  5.         
  6.         @anim/left_out
  7.         
  8.         @anim/left_in
  9.         
  10.         @anim/right_out

代碼overridePendingTransition(enterAnim, exitAnim);

關于overridePendingTransition函數(shù),有一個需要注意的地方就是:它必需緊挨著startActivity()或者finish()或者onBackPressed()函數(shù)調(diào)用,否則不一定有效果;

2、API 21 之后Activity過渡動畫使用

在API 21之后google又推出了一種比之前效果更加贊的過渡動畫;

通過ActivityOptions + Transition來實現(xiàn)Activity過渡動畫;

所以在使用之前需要進行版本判斷。當版本API 大于21時使用轉(zhuǎn)場動畫,否則不使用;

 
 
 
 
  1. // Check if we're running on Android 5.0 or higher
  2. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
  3.     // Apply activity transition
  4. } else {
  5.     // Swap without transition
  6. }

ActivityOptions + Transition來實現(xiàn)Activity過渡動畫之前先來了看下ActivityOptions里面幾個函數(shù)代表啥意思;

 
 
 
 
  1. /**
  2.  * 和overridePendingTransition類似,設置跳轉(zhuǎn)時候的進入動畫和退出動畫
  3.  */
  4. public static ActivityOptions makeCustomAnimation(Context context, int enterResId, int exitResId);
  5. /**
  6.  * 通過把要進入的Activity通過放大的效果過渡進去
  7.  * 舉一個簡單的例子來理解source=view,startX=view.getWidth(),startY=view.getHeight(),startWidth=0,startHeight=0
  8.  * 表明新的Activity從view的中心從無到有慢慢放大的過程
  9.  */
  10. public static ActivityOptions makeScaleUpAnimation(View source, int startX, int startY, int width, int height);
  11. /**
  12.  * 通過放大一個圖片過渡到新的Activity
  13.  */
  14. public static ActivityOptions makeThumbnailScaleUpAnimation(View source, Bitmap thumbnail, int startX, int startY);
  15. /**
  16.  * 場景動畫,體現(xiàn)在兩個Activity中的某些view協(xié)同去完成過渡動畫效果,等下在例子中能更好的看到效果
  17.  */
  18. public static ActivityOptions makeSceneTransitionAnimation(Activity activity, View sharedElement, String sharedElementName);
  19. /**
  20.  * 場景動畫,同上是對多個View同時起作用
  21.  */
  22. public static ActivityOptions makeSceneTransitionAnimation(Activity activity, android.util.Pair... sharedElements);

對于Transition Activity過渡動畫的使用,我們簡單的分為三個步驟:告訴系統(tǒng)以Transition的方式啟動Activity、定義過渡動畫、設置過渡動畫。

3、轉(zhuǎn)場動畫的使用場景

Android中的轉(zhuǎn)場動畫主要有三種場景:

  • 在兩個activity之間切換時界面的過渡效果;
  • 兩個activity或者Fragment之間shared elements 切換效果;

下面分別詳細的介紹。

二、轉(zhuǎn)場動畫的使用場景

1、兩個activity之間切換時界面的過渡效果

兩個activity切換時的,有兩個動畫,從activity A 切換到activity B時,會有A的退出動畫和B的進入動畫;

在Google提供的android.transition.Transition包中從activity A切換到activity B有三種方式:Explode, Slide 和Fade;

  • Explode:從屏幕的中間進入或退出;
  • Slide:從屏幕的一邊向另一邊進入或退出;
  • Fade:通過改變透明度來出現(xiàn)或消失;

上面的三種動畫有兩種實現(xiàn)方式:

①通過xml聲明;

在res目錄下新建transition文件夾在transition文件夾下新建activity_fade.xml文件;

activity_fade.xml

 
 
 
 
  1.     android:duration="1000"/>

activity_slide.xml

 
 
 
 
  1.     android:duration="1000"/>

ActivityA的代碼如下:因為從ActivityA切換到ActivityB,所以ActivityA是退出動畫使用的方法是:getWindow().setExitTransition(slide);

 
 
 
 
  1. @Override
  2.     protected void onCreate(Bundle savedInstanceState) {
  3.         super.onCreate(savedInstanceState);
  4.         setContentView(R.layout.activity_transition);
  5.         setupWindowAnimations();
  6.     }
  7.     private void setupWindowAnimations() {
  8.         Slide slide = TransitionInflater.from(this).inflateTransition(R.transition.activity_slide);
  9.         getWindow().setExitTransition(slide);
  10.     }

ActivityB是進入動畫使用方法:getWindow().setEnterTransition(fade);,ActivityB的代碼如下

 
 
 
 
  1. @Override
  2.     protected void onCreate(Bundle savedInstanceState) {
  3.         super.onCreate(savedInstanceState);
  4.         setContentView(R.layout.activity_transition);
  5.         setupWindowAnimations();
  6.     }
  7.     private void setupWindowAnimations() {
  8.         Fade fade = TransitionInflater.from(this).inflateTransition(R.transition.activity_fade);
  9.         getWindow().setEnterTransition(fade);
  10.     }

②代碼方式

ActivityA代碼如下:實現(xiàn)一個Slide對象并且設置時間為1000毫秒

 
 
 
 
  1. @Override
  2.     protected void onCreate(Bundle savedInstanceState) {
  3.         super.onCreate(savedInstanceState);
  4.         setContentView(R.layout.activity_transition);
  5.         setupWindowAnimations();
  6.     }
  7.     private void setupWindowAnimations() {
  8.         Slide slide = new Slide();
  9.         slide.setDuration(1000);
  10.         getWindow().setExitTransition(slide);
  11.     }

ActivityB中實現(xiàn)一個Fide對象并且設置時間為1000毫秒;

 
 
 
 
  1. @Override
  2.     protected void onCreate(Bundle savedInstanceState) {
  3.         super.onCreate(savedInstanceState);
  4.         setContentView(R.layout.activity_transition);
  5.         setupWindowAnimations();
  6.     }
  7.     private void setupWindowAnimations() {
  8.         Fade fade = new Fade();
  9.         fade.setDuration(1000);
  10.         getWindow().setEnterTransition(fade);
  11.     }

2、兩個activity或者Fragment之間shared elements 切換效果

Shared elements轉(zhuǎn)換確定兩個Activity之間共享的視圖如何在這兩個Activity之間轉(zhuǎn)換;

如果兩個Activity在不同的位置和大小中具有相同的圖像,則通過Shared elements轉(zhuǎn)換會在這兩個Activity之間平滑地轉(zhuǎn)換和縮放圖像;

當從Activity A跳轉(zhuǎn)到Activity B時,ActivityA, ActivityB中的兩個item有動畫變化,但是要注意的時ActivityA ,ActivityB中的item是兩個獨立的item;

shared elements轉(zhuǎn)換包括以下幾種:

  • changeBounds 改變目標布局中view的邊界
  • changeClipBounds 裁剪目標布局中view的邊界
  • changeTransform 實現(xiàn)旋轉(zhuǎn)或者縮放動畫
  • changeImageTransform 實現(xiàn)目標布局中ImageView的旋轉(zhuǎn)或者縮放動畫

實現(xiàn)上面的效果需要三個步驟:

① Window Content Transition

設置styles.xml文件,允許windowContentTransitions如下:

 
 
 
 
  1. value/style.xml
  2.     ...
  3.     true
  4.     ...

②定義一個相同的transition名稱

分別在Activity A 和Activity B的布局文件中定義item,這兩個item的屬性可以不一樣,但是android:transitionName必須一樣。如下:

 
 
 
 
  1.         android:id="@+id/small_blue_icon"
  2.         style="@style/MaterialAnimations.Icon.Small"
  3.         android:src="@drawable/circle"
  4.         android:transitionName="@string/blue_name" />

activity_b.xml

 
 
 
 
  1.         android:id="@+id/big_blue_icon"
  2.         style="@style/MaterialAnimations.Icon.Big"
  3.         android:src="@drawable/circle"
  4.         android:transitionName="@string/blue_name" />

③在activity中啟動shared element

使用ActivityOptions.makeSceneTransitionAnimation()方法

ActivityA.java

 
 
 
 
  1. blueIconImageView.setOnClickListener(new View.OnClickListener() {
  2.     @Override
  3.     public void onClick(View v) {
  4.         Intent i = new Intent(MainActivity.this, SharedElementActivity.class);
  5.         View sharedView = blueIconImageView;
  6.         String transitionName = getString(R.string.blue_name);
  7.         ActivityOptions transitionActivityOptions = ActivityOptions.makeSceneTransitionAnimation(MainActivity.this, sharedView, transitionName);
  8.         startActivity(i, transitionActivityOptions.toBundle());
  9.     }
  10. });

Fragment之間Shared elements

Fragment之間的Shared elements的使用過程和Activity之間的類似,分為三個步驟:

①允許windowContentTransitions

 
 
 
 
  1.     ...
  2.     true
  3.     ...

②定義一個共同的變換名稱

layout/fragment_a.xml

 
 
 
 
  1.         android:id="@+id/small_blue_icon"
  2.         style="@style/MaterialAnimations.Icon.Small"
  3.         android:src="@drawable/circle"
  4.         android:transitionName="@string/blue_name" />

layout/fragment_b.xml

 
 
 
 
  1.         android:id="@+id/big_blue_icon"
  2.         style="@style/MaterialAnimations.Icon.Big"
  3.         android:src="@drawable/circle"
  4.         android:transitionName="@string/blue_name" />

③使用FragmentTransaction

 
 
 
 
  1. FragmentB fragmentB = FragmentB.newInstance(sample);
  2. // Defines enter transition for all fragment views
  3. Slide slideTransition = new Slide(Gravity.RIGHT);
  4. slideTransition.setDuration(1000);
  5. sharedElementFragment2.setEnterTransition(slideTransition);
  6. // Defines enter transition only for shared element
  7. ChangeBounds changeBoundsTransition = TransitionInflater.from(this).inflateTransition(R.transition.change_bounds);
  8. fragmentB.setSharedElementEnterTransition(changeBoundsTransition);
  9. getFragmentManager().beginTransaction()
  10.         .replace(R.id.content, fragmentB)
  11.         .addSharedElement(blueView, getString(R.string.blue_name))
  12.         .commit();

本文題目:Android轉(zhuǎn)場動畫深度解析
URL地址:http://www.5511xx.com/article/dpsceec.html