日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android+场景切换,Android共享元素场景切换动画的实现

發布時間:2025/3/17 Android 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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共享元素场景切换动画的实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。