成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android轉(zhuǎn)場動畫深度解析

移動開發(fā) Android
Activity的轉(zhuǎn)場動畫很早就有了,5.0之前用的是overridePendingTransition()這個方法。在5.0之后,Google使用Material Design設(shè)計(jì)風(fēng)格,進(jìn)而有了的新的轉(zhuǎn)場轉(zhuǎn)場動畫的誕生,效果還是挺炫酷的。

 

[[428315]]

前言

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

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

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

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

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

  1. <item name="android:windowAnimationStyle">@style/Animation.Activity.Customer</item> 
  2.     <style name="Animation.Activity.Customer" parent="@android:style/Animation.Activity"
  3.         <!-- 進(jìn)入一個新的Activity的時(shí)候,A->B B進(jìn)入動畫 --> 
  4.         <item name="android:activityOpenEnterAnimation">@anim/right_in</item> 
  5.         <!-- 進(jìn)入一個新的Activity的時(shí)候,A->B A退出動畫 --> 
  6.         <item name="android:activityOpenExitAnimation">@anim/left_out</item> 
  7.         <!-- 退出一個Activity的時(shí)候,B返回到A A進(jìn)入動畫 --> 
  8.         <item name="android:activityCloseEnterAnimation">@anim/left_in</item> 
  9.         <!-- 退出一個Activity的時(shí)候,B返回到A B退出動畫 --> 
  10.         <item name="android:activityCloseExitAnimation">@anim/right_out</item> 
  11. </style> 

代碼overridePendingTransition(enterAnim, exitAnim);

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

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

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

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

所以在使用之前需要進(jìn)行版本判斷。當(dāng)版本API 大于21時(shí)使用轉(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 

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

  1. /** 
  2.  * 和overridePendingTransition類似,設(shè)置跳轉(zhuǎn)時(shí)候的進(jìn)入動畫和退出動畫 
  3.  */ 
  4. public static ActivityOptions makeCustomAnimation(Context context, int enterResId, int exitResId); 
  5. /** 
  6.  * 通過把要進(jìn)入的Activity通過放大的效果過渡進(jìn)去 
  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同時(shí)起作用 
  21.  */ 
  22. public static ActivityOptions makeSceneTransitionAnimation(Activity activity, android.util.Pair<View, String>... sharedElements); 

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

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

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

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

下面分別詳細(xì)的介紹。

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

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

兩個activity切換時(shí)的,有兩個動畫,從activity A 切換到activity B時(shí),會有A的退出動畫和B的進(jìn)入動畫;

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

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

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

①通過xml聲明;

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

activity_fade.xml

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <fade xmlns:android="http://schemas.android.com/apk/res/" 
  3.     android:duration="1000"/> 

activity_slide.xml

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <slide xmlns:android="http://schemas.android.com/apk/res/" 
  3.     android:duration="1000"/> 

ActivityA的代碼如下:因?yàn)閺腁ctivityA切換到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是進(jìn)入動畫使用方法: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代碼如下:實(shí)現(xiàn)一個Slide對象并且設(shè)置時(shí)間為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中實(shí)現(xiàn)一個Fide對象并且設(shè)置時(shí)間為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)換和縮放圖像;

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

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

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

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

① Window Content Transition

設(shè)置styles.xml文件,允許windowContentTransitions如下:

  1. value/style.xml 
  2. <style name="MaterialAnimations" parent="@style/Theme.AppCompat.Light.NoActionBar"
  3.     ... 
  4.     <item name="android:windowContentTransitions">true</item 
  5.     ... 
  6. </style> 

②定義一個相同的transition名稱

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

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

activity_b.xml

  1. <ImageView 
  2.         android:id="@+id/big_blue_icon" 
  3.         style="@style/MaterialAnimations.Icon.Big" 
  4.         android:src="@drawable/circle" 
  5.         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. <style name="MaterialAnimations" parent="@style/Theme.AppCompat.Light.NoActionBar"
  2.     ... 
  3.     <item name="android:windowContentTransitions">true</item> 
  4.     ... 
  5. </style> 

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

layout/fragment_a.xml

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

layout/fragment_b.xml

  1. <ImageView 
  2.         android:id="@+id/big_blue_icon" 
  3.         style="@style/MaterialAnimations.Icon.Big" 
  4.         android:src="@drawable/circle" 
  5.         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(); 

 

 

責(zé)任編輯:武曉燕 來源: Android開發(fā)編程
相關(guān)推薦

2015-03-23 17:43:31

transitionViewControl

2021-12-20 20:30:48

鴻蒙HarmonyOS應(yīng)用

2022-06-01 22:41:29

轉(zhuǎn)場動畫鴻蒙

2011-07-29 14:55:25

iPhone開發(fā) 動畫過渡

2022-07-08 09:55:54

CSS轉(zhuǎn)場動畫

2011-06-02 11:13:10

Android Activity

2011-05-27 17:28:01

Android

2024-01-11 12:14:31

Async線程池任務(wù)

2011-04-15 13:24:27

Android 3.0Android蜂巢

2014-10-15 09:35:26

Android Wea

2023-10-10 11:02:00

LSM Tree數(shù)據(jù)庫

2023-03-27 08:12:40

源碼場景案例

2013-12-09 10:34:12

2023-03-06 11:13:20

Spring注解加載

2023-03-13 08:12:25

@DependsOn源碼場景

2021-12-01 18:36:35

屬性

2019-03-06 09:55:54

Python 開發(fā)編程語言

2009-12-14 17:14:08

Ruby文件操作

2011-06-27 09:15:21

QT Creator

2011-07-29 15:09:48

iPhone Category
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲激情一区二区三区 | 在线国产中文字幕 | 欧美精品一区二区三区视频 | 亚洲一一在线 | 成人久久久 | 黄色免费三级 | 国产成人精品一区二三区在线观看 | 日韩一区二区三区视频 | 欧美一区二区三区精品 | 欧美日韩国产在线 | 日韩免费1区二区电影 | 国产精品视频一区二区三区 | 久久一区精品 | 久久久精品 | 一区二区中文 | 三级国产三级在线 | 激情五月综合 | 欧美黄色一区 | 欧美精品一区二区三区在线 | 美女黄视频网站 | 国产农村妇女毛片精品久久麻豆 | 日韩一区二区三区在线观看 | 亚洲一区二区三区在线视频 | 夜夜撸av | 久久激情av | 日本久久久久久久久 | 国产高清视频 | 91成人在线| av网站在线播放 | 天天射影院 | 日韩一区二区av | 综合自拍 | 一本综合久久 | 婷婷免费视频 | a毛片| 精品www| 久久精品小视频 | 特级黄一级播放 | 亚洲国产成人精品久久 | 国产精品久久久久久婷婷天堂 | 91伊人网|