一種新的Activity轉換動畫實現方式
0. 前言
為Android中基本的View組建Activity設置轉換動畫的方式一般有兩種:通過 overridePendingTransitions設置,以及使用TransitionManager實現。 overridePendingTransitions只能使用XML來設置Activity的進入和退出動畫,局限性很大。而使用 TransitionManager只兼容API level 19及以上的設備。最近在InstaMaterial concept中發現其利用addOnPreDrawListener方法,提供了一種新的Activity轉換動畫實現方式,這里詳細記錄下這種基于addOnPreDrawListener()的實現方式。
1. 實現展開動畫
首先創建一個基本的Activity轉換場景,去掉默認的轉換動畫,沒有任何動畫的Activity轉換效果如下。
修改第二個Activity的布局activty_second,設置最頂層的布局id為root。之后,在SecondAcivity的onCreate中,為root設置動畫,核心部分代碼如下:
@Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);setContentView(R.layout.activity_second); rootView = findViewById(R.id.root); if (savedInstanceState == null) { rootView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override public boolean onPreDraw() { rootView.getViewTreeObserver().removeOnPreDrawListener(this); startRootAnimation(); return true; } }); }
}</pre>
這里需要注意的是: 1)只需要在首次創建時執行動畫,因此需要滿足條件savedInstanceState == null;2)在onPreDraw中要首先移除OnPreDrawListener,否則在動畫過程中會多次調用,導致死循環。
最后,startRootAnimation的實現如下:private void startRootAnimation() { rootView.setScaleY(0.1f); rootView.setPivotY(rootView.getY() + rootView.getHeight() / 2);rootView.animate() .scaleY(1) .setDuration(1000) .setInterpolator(new AccelerateInterpolator()) .start();
}</pre>
此時的動畫效果如下:
![]()
2. 設置Activity透明背景
上面的動畫還有一個問題:第二個 Activity展開的時候,它的背景不是第一個Activity,而是白色背景,這是因為默認的主題為每個Activity設置了白色作為窗口的背景, 因此需要在style中創建一個背景為透明的主題,并在AndroidManifest.xml中設置SecondActivty的主題為透明背景主題。
透明背景主題代碼如下:<style name="AppTheme.TransparentActivity"> <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowIsTranslucent">true</item> <item name="android:windowAnimationStyle">@null</item> </style>
最后的效果如下:
![]()
3. 小結
至此實現了一個簡單的基于addOnPreDrawListener的轉換動畫,這種轉換動畫相對于overridePendingTransitions更為靈活,提供了更多想象空間,同時相比于TransitionManager有更好的兼容性。
這種方式目前存在的問題是需要為頂級view以及各層子view分別設置動畫,使得頂級view和子view同時展開,或子view延后展開(否則會出現子view已經繪制到目標位置,頂級view仍然在執行動畫的情況),對于復雜的布局而言實現有些繁瑣。
來自:http://codethink.me/2015/06/21/a-new-implementation-of-activity-transition-animations/
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!