android+场景切换,Android共享元素场景切换动画的实现
今天跟大家分享的是場景切換的共享元素,源碼已經上傳到github:
我們知道安卓5.0系統引入了共享元素,能做出非常炫酷的場景切換效果,這讓人非常興奮同時非常蛋疼,因為低版本沒法使用啊,所以今天就跟大家分享一下自己寫的一個庫,其實只有2個文件而已,還是叫它工具比較合適吧......非常輕量級,簡直是人畜無害,兼容安卓5.0以下的版本。
什么都不多說,先看看效果:
效果圖涉及了Activity中的元素(頂部bar)和ListView中的元素(icon和name),事實上無論哪個位置的元素都能輕松實現。
用法:
使用這個工具非常簡單,假設有ActivityA(簡稱A)和ActivityB(簡稱B),在A中啟動B,再從B回退到A,首先需要在A和B中,各自定義id相同的兩個View,這里可以是ListView的item布局中的View,只要獲取到View即可,然后:
·A啟動B:
·B回退到A:
用法非常簡單,當然以上只是最少參數的基本用法,除此之外可以設置的參數還有時間、加減速以及動畫監聽,其中動畫監聽可以方便在動畫開始前做一些初始化操作,以及動畫結束后做一些顯示操作,下面就來講一下實現的原理。
原理:
從A啟動B時,首先需要構造一個EasyTransitionOptions對象,直接通過EasyTransitionOptions.makeTransitionOptions方法進行構造,傳入的參數為ActivityA以及需要共享的元素View,我們看一下EasyTransitionOptions有啥:
可以看到前兩個即為構造時傳入的參數,第三個attrs接下來會用到。
接著我們跟往常一樣,構造一個Intent對象,然后調用EasyTransition.startActivity方法,傳入了該Intent以及前面構造好的options,我們看看EasyTransition.startActivity做了什么:
首先調用了options.update方法,接著又獲取了options的attrs并放到intent中,看看update方法:
就是這里,options使用傳入的View填充了之前看到的那個ViewAttrs集合attrs,attrs存儲了View的一些屬性,分別為:
id用于獲取B中的對應的View,接下來會講到。startX和startY分別為View在A中的x、y坐標,這里通過View的getLocationOnScreen方法獲取View在屏幕中的坐標,可以看到該方法的參數為int[] outLocation,以out開頭的參數,意思即為執行方法后將填充該參數。width和height分別為View在A中的寬和高。
接下來通過options獲取Activity并調用真正的startActivity方法,然后再調用overridePendingTransition(0, 0)將系統的轉場動畫覆蓋,0表示沒有轉場動畫。
然后進入到B,我們在B的onCreate方法中,只調用了一個方法EasyTransition.enter,看看這個方法做了什么:
這個方法有很多個重載,最簡單的只需要傳入一個Activity參數即可。參數都很簡單,分別為ActivityB,動畫時間,動畫的差值器以及動畫監聽。
首先通過Activity獲取到Intent并拿到從A傳入的ViewAttrs集合,接著執行了runEnterAnimation方法,到這里就要開始執行動畫了,看看runEnterAnimation方法:
看似挺長的,其實只做了一件事,即
根據ViewAttrs集合attrs,給B中的View先設置屬性,再執行一段動畫
。
首先遍歷attrs,通過id找到B中對應的View;然后在ViewTreeObserver.OnPreDrawListener中設置View的屬性,其中scale屬性設置為A中View的寬高與B中View的寬高的比,transition屬性設置為A中View的坐標相對于B中View的坐標的偏移量,之所以使用屏幕坐標就是為了準確地算出坐標的偏移量,而不受狀態欄等其他因素的影響。
設置完成后,再調用View.animate方法,將動畫結束狀態設置為View在B中的初始狀態,再傳入時間、動畫差值器以及監聽器,就這樣簡單地完成了轉場動畫。
接著我們需要從B回退到A,在回退的操作中,調用了EasyTransition.exit方法,看看它做了什么:
看起來跟enter方法差不多,通過Activity獲取到Intent,再拿到ViewAttrs集合,是的它又派上用場了,接著執行了runExitAnimation方法,可以看到也是挺眼熟的:
也是遍歷attrs,找到B中對應id的View,只不過這次動畫是從View在B中的初始狀態開始,變到View在A中的狀態,屬性還是那些屬性,沒有啥其他的。不一樣的是,在執行動畫后需要關閉B,所以調用了View.postDelayed方法,然后finish掉當前的Activity,依舊是覆蓋一下系統的轉場動畫overridePendingTransition(0, 0)。
就這樣簡單的實現了共享元素炫酷的轉場動畫,最初糾結于如何實現比較優雅,然后開始看5.0共享元素有關的那部分源碼(也只是粗略看了一下),再看了看網上一些其他人的做法,最終提煉出了這個工具,非常輕量,用起來也挺舒服的。
歡迎拍磚,也歡迎到我的github上互粉:
https://github.com/huzenan
,假裝自己粉絲很多哈哈。
總結
以上是生活随笔為你收集整理的android+场景切换,Android共享元素场景切换动画的实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle em配置报错,oracle
- 下一篇: android sina oauth2.