Activity之間的動畫切換學習筆記(一)
Activity之間的動畫切換
首先什麼是Transition?
安卓5.0中Activity和Fragment變換是建立在名叫Transitions的安卓新特性之上的。這個誕生於4.4的transition框架為在不同的UI狀態之間產生動畫效果提供了非常方便的API。該框架主要基於兩個概念:場景(scenes)和變換(transitions)。場景(scenes)定義了當前的UI狀態,變換(transitions)則定義了在不同場景之間動畫變化的過程。雖然transition翻譯為變換似乎很確切,但是總覺得還是沒有直接使用transition直觀,為了更好的理解下面個別地方直接用transition代表變換。
當一個場景改變的時候,transition主要負責:
(1)捕捉每個View在開始場景和結束場景時的狀態。
(2)根據兩個場景(開始和結束)之間的區別建立一個Animator。
transition框架的兩個主要優點。第一、Transitions抽象和封裝了屬性動畫,Animator的概念對開發者來說是透明的,因此它極大 的精簡了程式碼量。開發者所做的所有事情只是改變一下view前後的狀態資料,Transition就會自動的根據狀態的區別去生成動畫效果。第二、不同場 景之間變換的動畫效果可以簡單的通過使用不同的Transition類來改變。一般的transition有explode,fade,slide。
在開始講解之前我們先做一些約定,雖然下面的約定是針對activity的,但是在Fragment中也是一樣的約定。
AB表示兩個Activity,現在假設A跳轉B。這裡的進入和退出一個有兩種方式。
Activity transition API圍繞退出(exit),進入(enter),返回(return)和再次進入(reenter)四種transition。按照上面對A和B的約定,我這樣描述這一過程。
Activity A的退出變換(exit transition)決定了在A呼叫B的時候,A中的View是如何播放動畫的。
Activity B的進入變換(enter transition)決定了在A呼叫B的時候,B中的View是如何播放動畫的。
Activity B的返回變換(return transition)決定了在B返回A的時候,B中的View是如何播放動畫的。
Activity A的再次進入變換(reenter transition)決定了在B返回A的時候,A中的View是如何播放動畫的。
具體的使用步驟:
1.在呼叫與被呼叫的activity中,通過設定Window.FEATURE_ACTIVITY_TRANSITIONS 和 Window.FEATURE_CONTENT_TRANSITIONS 來啟用transition api ,可以通過程式碼也可以通過設定主題來啟用:
A.程式碼方式,在setContentView之前呼叫:
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
B.主題xml
item name=”android:windowContentTransitions”>true
2.分別在呼叫與被呼叫的activity中設定exit 和enter transition。Material主題預設會將exit的transition設定成null而enter的transition設 置成Fade .如果reenter 或者 return transition沒有明確設定,則將用exit 和enter的transition替代。
getWindow().setExitTransition(explode);
getWindow().setEnterTransition(explode);
開始一個activity的content transaction需要呼叫startActivity(Context, Bundle)方法,將下面的bundle作為第二個引數:
只是單純的slide或者fade效果以及只有一個view元素共享,
Bundle=ActivityOptions.makeSceneTransitionAnimation(this).toBundle();
Bundle= ActivityOptions.makeSceneTransitionAnimation(this, view, “transitionName”).toBundle());
但是如果是多個view進行元素共享,用pari更方便
Pari:import android.support.v4.util.Pair;
//比如三個view同時設定共享元素
Pair first=new Pair<>(small, ViewCompat.getTransitionName(small));
Pair second=new Pair<>(small1, ViewCompat.getTransitionName(small1));
Pair thid=new Pair<>(small2, ViewCompat.getTransitionName(small2));
ActivityOptionsCompat optionsMore = ActivityOptionsCompat.makeSceneTransitionAnimation(MainActivity.this, first,second,thid);
熟悉基本的步驟後下面整理幾個學習的demo
1.explode|slide|fade
explode:
final Transition explode = TransitionInflater.from(this).inflateTransition(R.transition.explode);
/*
退出時使用
*/
getWindow().setExitTransition(explode);
/*
第一次進入時使用
*/
getWindow().setEnterTransition(explode);
/*
再次進入時使用
*/
getWindow().setReenterTransition(explode);
startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(StartActivity.this).toBundle());
fade:
final Transition fade = TransitionInflater.from(this).inflateTransition(R.transition.fade);
findViewById(R.id.fade).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getWindow().setExitTransition(fade);
getWindow().setEnterTransition(fade);
getWindow().setReenterTransition(fade);
startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(StartActivity.this).toBundle());
}
});
slide:
final Transition slide= TransitionInflater.from(this).inflateTransition(R.transition.slide);
findViewById(R.id.slide).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getWindow().setExitTransition(slide);
getWindow().setEnterTransition(slide);
getWindow().setReenterTransition(slide);
startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(StartActivity.this).toBundle());
}
});
元素共享:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final Intent intent = new Intent(MainActivity.this, Main2Activity.class);
small= (TextView) findViewById(R.id.small);
small1= (TextView) findViewById(R.id.small1);
small2= (TextView) findViewById(R.id.small2);
//多個view同時分享元素,就要用到pari
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Pair first=new Pair<>(small, ViewCompat.getTransitionName(small));
Pair second=new Pair<>(small1, ViewCompat.getTransitionName(small1));
Pair thid=new Pair<>(small2, ViewCompat.getTransitionName(small2));
ActivityOptionsCompat optionsMore = ActivityOptionsCompat.makeSceneTransitionAnimation(MainActivity.this, first,second,thid);
startActivity(intent,optionsMore.toBundle());
}
});
}
這裡注意,這個時候使用的不是ActivityOptions而是ActivityOptionsCompat
這裡寫共享元素的時候出現兩個問題:
第一個:
這個是由於所有的TransitionName設定的值都是一樣的,感覺起來第二隻有
第二個問題:
我列印了Activity1中的log,發現控制元件的可見值發生了變化,但是具體原因我不清楚….還在找:
是否可見----第一個8 第二個8 第三個0
是否可見----第一個4 第二個0 第三個0
以上,我們都是主要在Activity1中設定動畫,還有一個問題就是假設不在點選事件中進行startActivity,就會有一個異常,這個問題我也在找….(好多問題還不清楚…..還在學習…..).
這個效果,是不是感覺像側滑選單,這個就是直接在Activity2中呼叫setupWindowAnimations即可
private void setupWindowAnimations() {
Transition fade = TransitionInflater.from(this).inflateTransition(R.transition.slide);
getWindow().setReturnTransition(fade);//返回上一個activity 時本activity的效果
getWindow().setEnterTransition(fade);//進入本activity時本activity的效果
}
以上,就是現在的一個學習整理,還有好多不清楚的地方還在查詢學習,加油~
參考資料:
https://github.com/lgvalle/Material-Animations/blob/master/README.md
http://www.jianshu.com/p/1b5212d84a15
http://blog.csdn.net/u013675234/article/details/50472282
http://blog.csdn.net/huachao1001/article/details/51659963
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0201/2394.html
http://jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0113/2310.html
相關文章
- 安卓學習筆記之Activity(一)安卓筆記
- Android切換Activity的動畫效果Android動畫
- activity切換無動畫效果的實現動畫
- iOS學習筆記04 檢視切換iOS筆記
- Android——Activity切換炫酷動畫實現Android動畫
- 學習筆記 AS入門(四) 元件篇之Activity筆記元件
- Git 分支的建立與切換 —— Git 學習筆記 14Git筆記
- ReactNative學習筆記四之動畫篇React筆記動畫
- .NET 5學習筆記(10)——Entity Framework Core之切換SQLServer和SQLite筆記FrameworkServerSQLite
- angular學習筆記(十七)-路由和切換檢視Angular筆記路由
- Android 程式設計下設定 Activity 切換動畫Android程式設計動畫
- go 學習筆記之工作空間Go筆記
- QT學習筆記4(動畫)QT筆記動畫
- CUDA 學習筆記之型別轉換筆記型別
- Android學習筆記-Activity的啟動模式Android筆記模式
- web基礎學習筆記(二十)之jquery動畫操作Web筆記jQuery動畫
- 學習筆記-----一時間函式筆記函式
- iOS學習筆記-動畫篇1iOS筆記動畫
- Android學習筆記04——Activity的生命週期Android筆記
- Unity3D之空間轉換學習筆記(三):3D數學Unity3D筆記
- app直播原始碼,自定義兩種Activity切換動畫實現APP原始碼動畫
- 👾 筆記 | react-transition-group 實現路由切換過渡動畫筆記React路由動畫
- linux學習之使用者的切換Linux
- Python學習筆記5——一切皆物件Python筆記物件
- 《Android藝術開發探索》學習筆記之Activity的生命週期Android筆記
- Andoroid學習筆記05——Activity佈局管理筆記
- Android開發之ViewPager切換動畫AndroidViewpager動畫
- 《從零開始學Swift》學習筆記(Day 15)——請注意數字型別之間的轉換Swift筆記型別
- Android技術分享| Activity 過渡動畫 — 讓切換更加炫酷Android動畫
- canvas學習之API整理筆記(一)CanvasAPI筆記
- 學習筆記(一)筆記
- Python——格式轉換的學習筆記Python筆記
- Qt 學習筆記 - 第二章 - 新增圖片、佈局、介面切換QT筆記
- 學習筆記之IdentityServer4(一)筆記IDEServer
- JSTL Tag學習筆記(一)之<c: />JS筆記
- centos5.4之apache學習筆記(一)CentOSApache筆記
- 爬蟲學習日記(十)selenium frame的切換爬蟲
- Deep Learning(深度學習)學習筆記整理系列之(一)深度學習筆記