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
相關文章
- Android——Activity切換炫酷動畫實現Android動畫
- Android學習筆記-Activity的啟動模式Android筆記模式
- iOS學習筆記04 檢視切換iOS筆記
- QT學習筆記4(動畫)QT筆記動畫
- Git 分支的建立與切換 —— Git 學習筆記 14Git筆記
- .NET 5學習筆記(10)——Entity Framework Core之切換SQLServer和SQLite筆記FrameworkServerSQLite
- web基礎學習筆記(二十)之jquery動畫操作Web筆記jQuery動畫
- Android技術分享| Activity 過渡動畫 — 讓切換更加炫酷Android動畫
- app直播原始碼,自定義兩種Activity切換動畫實現APP原始碼動畫
- go 學習筆記之工作空間Go筆記
- 微星筆記本怎麼切換啟動模式?微星筆記本bios設定啟動模式切換的教程筆記模式iOS
- 👾 筆記 | react-transition-group 實現路由切換過渡動畫筆記React路由動畫
- linux學習之使用者的切換Linux
- Python學習筆記5——一切皆物件Python筆記物件
- 學習 PixiJS — 補間動畫JS動畫
- Android 補間動畫學習Android動畫
- 【Android 動畫】動畫詳解之補間動畫(一)Android動畫
- Appium用driver.start_activity切換Activity報錯APP
- Python——格式轉換的學習筆記Python筆記
- 學習筆記之IdentityServer4(一)筆記IDEServer
- 爬蟲學習日記(十)selenium frame的切換爬蟲
- java反射之動態代理學習筆記Java反射筆記
- TransX 一個小巧玲瓏的 vue 元件切換動畫庫Vue元件動畫
- 如何停止iPhone和Mac之間的切換?iPhoneMac
- Qt 學習筆記 - 第二章 - 新增圖片、佈局、介面切換QT筆記
- 學習筆記(一)筆記
- TP5學習筆記一 名稱空間筆記
- Activity橫豎屏切換生命週期
- 系統學習iOS動畫之七:其它型別的動畫iOS動畫型別
- Vue學習筆記之Webpack的使用Vue筆記Web
- 學習筆記之測試筆記
- JS學習筆記之this指向JS筆記
- flask學習筆記之blueprintFlask筆記
- Swoft 學習筆記之配置筆記
- 學習筆記:DOM之appendChild筆記APP
- node學習筆記之39筆記
- Web之http學習筆記WebHTTP筆記
- Netty學習筆記之ChannelHandlerNetty筆記
- Pytorch學習筆記之tensorboardPyTorch筆記ORB