我相信大部分的人都知道在5.0的時候有新增一個新的activity transaction的功能
讓我們可以在Activity 替換之間有一些動畫,but......what about 5.0以下呢?
今天就是要來說我們如何可以在5.0以下完成這個功能
首先我們可以將這個動作分成兩個部分
1.enter animation
2.exit animation
Enter animation
首先我們先看enter animation ,讓我們將速度放慢再看一次
我相信仔細看之後可以發現,enter animation(粉紅色塊)
其實是從button大小漸漸地放大到整個畫面,
所以我們要做的事情其實很簡單
- 先將下一個view縮小到跟button一樣大的size
- 將view恢復到跟原本的view一樣大的size
but 我們是要startActivity耶,這並不是單純的把view 縮小並且恢復正常而已
所以必須要有額外的步驟
1.首先我們必須取消activity原本的transaction功能
// Override transitions: we don't want the normal window animation in addition // to our custom one overridePendingTransition(0, 0);
所以我們必須 開啟粉紅色activity之後呼叫上面的程式碼,避免startactivity之後的default animation
2.接著我們必須將下一個activity用成透明的
<style name="Transparent" parent="android:Theme.Holo.Light.DarkActionBar">> <item name="android:windowIsTranslucent">true</item> <item name="android:windowBackground">@android:color/transparent</item> </style>
3.接著就到了將view縮小到跟button一樣大然後再慢慢恢復的動作了
為了達到這個目的我們必須先取得button的位置以及size
int[] screenLocation = new int[2]; view.getLocationOnScreen(screenLocation); intent.putExtra("left", screenLocation[0]). putExtra("top", screenLocation[1]). putExtra("width", view.getWidth()). putExtra("height", view.getHeight());
然後再將粉紅色activity的view 轉換到跟button一樣大的size和一樣的起始位置,
mView.setPivotX(0); mView.setPivotY(0); mView.setScaleX(mWidthScale); mView.setScaleY(mHeightScale); mView.setTranslationX(mLeftDelta); mView.setTranslationY(mTopDelta);
setPivotX/setPivotY 設定animation的動畫起始點,
setScaleX/setScaleY 將粉紅色的view縮小到跟button一樣大
setTranslationX/setTranslationY 將粉紅色的view移動到跟button一樣的位置
在初始設定完成之後,接著就是要將他恢復到原本的大小
mView.animate().setDuration(duration). scaleX(1).scaleY(1). translationX(0).translationY(0). setInterpolator(sDecelerator);
這部分就相對簡單許多.
這樣enter animation的部分就完成了
接下來就要談exitAniamtion
Exit animation
exit animation相對於enter animation單純許多,
我們要做的動作就是
1.將粉紅色的view縮小到button的size以及位置並且漸漸的變透明
2.finish activity
所以程式碼如下
mView.animate().setDuration(duration). scaleX(mWidthScale).scaleY(mHeightScale). translationX(mLeftDelta).translationY(mTopDelta); ObjectAnimator bgAnim = ObjectAnimator.ofFloat(mView, "alpha", 0); bgAnim.setDuration(duration); bgAnim.start();
這個動作就是將粉紅色的view縮小並位移到button的位置,
接著將activity finish掉即可
最後附上sourceCode
reference可以去參考Chet Haase 的
https://www.youtube.com/watch?v=CPxkoe2MraA
基本上這篇文章是聽完他的youtube再花點時間研究程式碼之後的成果
沒有留言:
張貼留言