Android之MotionLayout(一),MotionLayout的基本使用
我們提供的服務(wù)有:成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、延川ssl等。為近千家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢(xún)和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的延川網(wǎng)站制作公司
Android之MotionLayout(二),MotionScene的標(biāo)簽屬性說(shuō)明
Android之MotionLayout(三),用 MotionLayout 來(lái)做過(guò)渡動(dòng)畫(huà),如何使用ConstraintSet
Android之MotionLayout(四),用 MotionLayout實(shí)現(xiàn)向上拉的折疊效果
Android之MotionLayout(五),如何使用 MotionLayout的自定義屬性
Android之MotionLayout(六),如果使用Keyframes實(shí)現(xiàn)實(shí)現(xiàn)YouTube切換效果
MotionLayout 是一個(gè) Google 官方出品用于制作 Android 中的過(guò)渡動(dòng)畫(huà)的框架。用來(lái)它就能輕松的做出一些較為復(fù)雜的動(dòng)畫(huà)效果
我們看一下效果圖:
如果您使用了 AndroidX
如果您沒(méi)有使用 AndroidX
由于 MotionLayout 類(lèi)繼承自 ConstraintLayout 類(lèi),因此可以在布局中使用 MotionLayout 替換掉 ConstraintLayout
MotionLayout 與 ConstraintLayout 不同的是:
MotionLayout 需要鏈接到一個(gè) MotionScene 文件。使用 MotionLayout 的 app:layoutDescription 屬性將 MotionLayout 鏈接到一個(gè) MotionScene 文件。
在之前的 MotionLayout 示例中,app:layoutDescription 屬性引用一個(gè) MotionScene。MotionScene 是一個(gè) XML 資源文件,其中包含相應(yīng)布局的所有運(yùn)動(dòng)描述。為了將布局信息與運(yùn)動(dòng)描述分開(kāi),每個(gè) MotionLayout 都引用一個(gè)單獨(dú)的 MotionScene。請(qǐng)注意,MotionScene 中的定義優(yōu)先于 MotionLayout 中的任何類(lèi)似定義。
MotionScene 文件描述了兩個(gè)場(chǎng)景間的過(guò)渡動(dòng)畫(huà),存放在 res/xml 目錄下。
要使用 MotionLayout 創(chuàng)建過(guò)渡動(dòng)畫(huà),你需要?jiǎng)?chuàng)建兩個(gè) layout 布局文件來(lái)描述兩個(gè)不同場(chǎng)景的屬性。當(dāng)從一個(gè)場(chǎng)景切換到另一個(gè)場(chǎng)景時(shí),MotionLayout 框架會(huì)自動(dòng)檢測(cè)這兩個(gè)場(chǎng)景中具有相同 id 的 View 的屬性差別,然后針對(duì)這些差別屬性應(yīng)用過(guò)渡動(dòng)畫(huà)(類(lèi)似于 TransitionManger)
MationLayout 除了支持上面列出的標(biāo)準(zhǔn)屬性外,還支持全部的 ConstraintLayout 屬性。
我們來(lái)分三步完成線面這個(gè)例子
場(chǎng)景1布局效果
場(chǎng)景2布局效果
編寫(xiě)完 MotionLayout 文件后就可以直接運(yùn)行程序了。點(diǎn)擊 image 即可進(jìn)行場(chǎng)景切換。當(dāng)進(jìn)行場(chǎng)景切換時(shí),MotionLayout 會(huì)自動(dòng)計(jì)算出兩個(gè)場(chǎng)景之間的差別,然后應(yīng)用相應(yīng)的過(guò)渡動(dòng)畫(huà)
補(bǔ)間動(dòng)畫(huà),幀動(dòng)畫(huà),以及最新的屬性動(dòng)畫(huà)。
幀動(dòng)畫(huà)就是類(lèi)似電影,由多張圖片切換而成。
補(bǔ)間動(dòng)畫(huà)可以望文生義吧,就是在兩點(diǎn)之間插入漸變值來(lái)平滑過(guò)渡。
屬性動(dòng)畫(huà)和補(bǔ)間動(dòng)畫(huà)類(lèi)似,不過(guò)是真的屬性在變動(dòng),包括可視屬性和其他屬性。
補(bǔ)間動(dòng)畫(huà)僅僅是可視屬性在顯示層面的動(dòng)畫(huà),屬性的實(shí)質(zhì)并未改動(dòng)。
一般情況下推薦使用最新的屬性動(dòng)畫(huà)。
1、Rajawali
介紹:
安卓的OpenGL ES 2.0/3.0 引擎??梢杂糜谥谱髌胀☉?yīng)用或者動(dòng)態(tài)壁紙,當(dāng)然也可以用于制作游戲。
項(xiàng)目地址:
2、RxAndroid
介紹:
RxAndroid是RxJava的一個(gè)針對(duì)Android平臺(tái)的擴(kuò)展。它包含了一些能夠簡(jiǎn)化Android開(kāi)發(fā)的工具。
項(xiàng)目地址:
3、Paginize
介紹:
Paginize 是一個(gè)輕量級(jí)的UI框架,使用注解來(lái)注入布局和view,除了使用注解之外,該框架還有兩個(gè)特色:1.用Page的概念來(lái)取代Fragment,2.切換page時(shí)自帶ios風(fēng)格的動(dòng)畫(huà)效果。
項(xiàng)目地址:
4、otto
介紹:
Otto 是square公司出的一個(gè)事件庫(kù)(pub/sub模式),用來(lái)簡(jiǎn)化應(yīng)用程序組件之間的通訊。 Otto 修改自Google的Guava庫(kù),專(zhuān)門(mén)為Android平臺(tái)進(jìn)行了優(yōu)化。
項(xiàng)目地址:
5 、rebound
介紹:
rebound是facebook的開(kāi)源動(dòng)畫(huà)庫(kù)。可以認(rèn)為這個(gè)動(dòng)畫(huà)庫(kù)是獨(dú)立于android Framework之外的一種動(dòng)畫(huà)實(shí)現(xiàn)。
項(xiàng)目地址:
6、KJFrameForAndroid
介紹:
KJFrameForAndroid 又叫KJLibrary,是一個(gè)幫助快速開(kāi)發(fā)的框架。使用KJFrameForAndroid,你可以只用一行代碼就完成http請(qǐng)求、網(wǎng)絡(luò)圖片加載、數(shù)據(jù)庫(kù)數(shù)據(jù)保存或讀取。
項(xiàng)目地址:
7、xUtils
介紹:
xUtils
包含了很多實(shí)用的android工具。 xUtils
支持大文件上傳,更全面的http請(qǐng)求協(xié)議支持(10種謂詞),擁有更加靈活的ORM,更多的事件注解支持且不受混淆影響... xUitls
最低兼容android 2.2 (api level 8)
項(xiàng)目地址:
目前xUtils主要有四大模塊:
DbUtils模塊:
android中的orm框架,一行代碼就可以進(jìn)行增刪改查;
支持事務(wù),默認(rèn)關(guān)閉;
可通過(guò)注解自定義表名,列名,外鍵,唯一性約束,NOT NULL約束,CHECK約束等(需要混淆的時(shí)候請(qǐng)注解表名和列名);
支持綁定外鍵,保存實(shí)體時(shí)外鍵關(guān)聯(lián)實(shí)體自動(dòng)保存或更新;
自動(dòng)加載外鍵關(guān)聯(lián)實(shí)體,支持延時(shí)加載;
支持鏈?zhǔn)奖磉_(dá)查詢(xún),更直觀的查詢(xún)語(yǔ)義,參考下面的介紹或sample中的例子。
ViewUtils模塊:
android中的ioc框架,完全注解方式就可以進(jìn)行UI,資源和事件綁定;
新的事件綁定方式,使用混淆工具混淆后仍可正常工作;
目前支持常用的20種事件綁定,參見(jiàn)ViewCommonEventListener類(lèi)和包c(diǎn)om.lidroid.xutils.view.annotation.event。
HttpUtils模塊:
支持同步,異步方式的請(qǐng)求;
支持大文件上傳,上傳大文件不會(huì)oom;
支持GET,POST,PUT,MOVE,COPY,DELETE,HEAD,OPTIONS,TRACE,CONNECT請(qǐng)求;
下載支持301/302重定向,支持設(shè)置是否根據(jù)Content-Disposition重命名下載的文件;
返回文本內(nèi)容的請(qǐng)求(默認(rèn)只啟用了GET請(qǐng)求)支持緩存,可設(shè)置默認(rèn)過(guò)期時(shí)間和針對(duì)當(dāng)前請(qǐng)求的過(guò)期時(shí)間。
BitmapUtils模塊:
加載bitmap的時(shí)候無(wú)需考慮bitmap加載過(guò)程中出現(xiàn)的oom和android容器快速滑動(dòng)時(shí)候出現(xiàn)的圖片錯(cuò)位等現(xiàn)象;
支持加載網(wǎng)絡(luò)圖片和本地圖片;
內(nèi)存管理使用lru算法,更好的管理bitmap內(nèi)存;
可配置線程加載線程數(shù)量,緩存大小,緩存路徑,加載顯示動(dòng)畫(huà)等...
8、butterknife-view
注入工具
介紹:
為了減少頻繁的調(diào)用findViewById(R.id...),可以采用一些注入框架,可以簡(jiǎn)化自己的代碼,讓你更專(zhuān)注于實(shí)際的功能開(kāi)發(fā),butterknife就是這樣的一個(gè)框架,他是jakewharton大神的作品,值得一試。
class ExampleActivity extends Activity {
@InjectView(R.id.title) TextView title;
@InjectView(R.id.subtitle) TextView subtitle;
@InjectView(R.id.footer) TextView footer;
@Override public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.simple_activity);
ButterKnife.inject(this);
// TODO Use "injected" views...
}
}
這是博客地址:
項(xiàng)目地址:
9、cube-sdk
一淘推出的開(kāi)發(fā)框架
介紹:
cube一個(gè)Android開(kāi)發(fā)包, 可極大提高你的開(kāi)發(fā)效率。主要提供了圖片加載以及網(wǎng)絡(luò)請(qǐng)求方面的api功能。
項(xiàng)目地址:
他們的網(wǎng)站:
10、ASimpleCache
一個(gè)簡(jiǎn)單的緩存框架
介紹:
ASimpleCache
是一個(gè)為android制定的 輕量級(jí)的 開(kāi)源緩存框架。輕量到只有一個(gè)java文件(由十幾個(gè)類(lèi)精簡(jiǎn)而來(lái))。
它可以緩存什么東西?普通的字符串、JsonObject、JsonArray、Bitmap、Drawable、序列化的java對(duì)象,和
byte數(shù)據(jù)。
項(xiàng)目地址:
11、androidannotations
介紹:
AndroidAnnotations是一個(gè)能夠讓你快速進(jìn)行Android開(kāi)發(fā)的開(kāi)源框架,它能讓你專(zhuān)注于真正重要的地方。
使代碼更加精簡(jiǎn),使項(xiàng)目更加容易維護(hù),它的目標(biāo)就是“Fast Android Development.Easy maintainance”。
通過(guò)一段時(shí)間的使用發(fā)現(xiàn),相比原生的Android開(kāi)發(fā),確實(shí)能夠讓你少些很多代碼
項(xiàng)目地址:
12、Event Bus
解耦android模塊
介紹:
當(dāng)一個(gè)Android應(yīng)用功能越來(lái)越多的時(shí)候,保證應(yīng)用的各個(gè)部分之間高效的通信將變得越來(lái)越困難。如何優(yōu)雅地解決這個(gè)問(wèn)題?這時(shí)候,就需要使用到EventBus。
EventBus是GreenRobot出品的Android系統(tǒng)的一個(gè)Event
Bus類(lèi)庫(kù),使用起來(lái)和之前我們所介紹的Square的Otto差不多,都是用來(lái)簡(jiǎn)化應(yīng)用組件之間的通信。
項(xiàng)目地址:
13、BeeFramework_Android
介紹:
BeeFramework
Android版主要為Android初級(jí)開(kāi)發(fā)人員提供一個(gè)基于MVC開(kāi)發(fā)模式的APP DEMO,并提供一套APP內(nèi)調(diào)試工具,包括
查看網(wǎng)絡(luò)數(shù)據(jù)請(qǐng)求歷史 Crash Log列表 真機(jī)WIFI環(huán)境下模擬2G\3G網(wǎng)絡(luò) 查看APP性能(內(nèi)存占用,CPU占用等)
項(xiàng)目地址:
14、afinal
介紹:
Afinal是一個(gè)android的ioc,orm框架,內(nèi)置了四大模塊功能:FinalAcitivity,FinalBitmap,FinalDb,FinalHttp。通過(guò)finalActivity,我們可以通過(guò)注解的方式進(jìn)行綁定ui和事件。通過(guò)finalBitmap,我們可以方便的加載bitmap圖片,而無(wú)需考慮oom等問(wèn)題。通過(guò)finalDB模塊,我們一行代碼就可以對(duì)android的sqlite數(shù)據(jù)庫(kù)進(jìn)行增刪改查。通過(guò)FinalHttp模塊,我們可以以ajax形式請(qǐng)求http數(shù)據(jù)。
Afinal里面目前包含了四大組件:
FinalHttp:用于請(qǐng)求http數(shù)據(jù),直接ajax方式請(qǐng)求,文件上傳, 斷點(diǎn)續(xù)傳下載文件等
FinalBitmap:用于顯示bitmap圖片,而無(wú)需考慮線程并發(fā)和oom等問(wèn)題。
FinalActivity:完全可以通過(guò)注解方式綁定控件和事件,無(wú)需編寫(xiě)代碼。
FinalDb:android中sqlite的orm框架,一行代碼搞定增刪改查。
Afinal是一個(gè)android的ioc,orm框架,內(nèi)置了四大模塊功能:FinalAcitivity,FinalBitmap,FinalDb,FinalHttp。通過(guò)finalActivity,我們可以通過(guò)注解的方式進(jìn)行綁定ui和事件。通過(guò)finalBitmap,我們可以方便的加載bitmap圖片,而無(wú)需考慮oom等問(wèn)題。通過(guò)finalDB模塊,我們一行代碼就可以對(duì)android的sqlite數(shù)據(jù)庫(kù)進(jìn)行增刪改查。通過(guò)FinalHttp模塊,我們可以以ajax形式請(qǐng)求http數(shù)據(jù)。詳情請(qǐng)通過(guò)以下網(wǎng)址查看。
項(xiàng)目地址:
15、Volley
介紹:
在這之前,我們?cè)诔绦蛑行枰途W(wǎng)絡(luò)通信的時(shí)候,大體使用的東西莫過(guò)于AsyncTaskLoader,HttpURLConnection,AsyncTask,HTTPClient(Apache)等,今年的Google
I/O 2013上,Volley發(fā)布了。Volley是Android平臺(tái)上的網(wǎng)絡(luò)通信庫(kù),能使網(wǎng)絡(luò)通信更快,更簡(jiǎn)單,更健壯。
項(xiàng)目地址:
可以給題主一些概述,具體的細(xì)節(jié)可以根據(jù)你的實(shí)際需求或者感興趣的方面再慢慢展開(kāi),每個(gè)部分都能挖掘出很有趣的內(nèi)容:
關(guān)于在實(shí)際工作中常用或者會(huì)接觸到的 Android Animation 大概可以分成以下幾種:
1. View Animation
這種屬于最常使用的動(dòng)畫(huà)之一,例如 View Slide, Fade In/Out, Parallax Effect 等等
2. Activity Transition
常見(jiàn)于 Activity 進(jìn)入或者跳出時(shí)的動(dòng)畫(huà),比如啟動(dòng)一個(gè) Activity, 從側(cè)面滑入。在 Android 4.4 之后,引入了Scene, enterTransition 和 exitTransition 等概念,可以定義 Activity 進(jìn)入以后不同View 做的一系列動(dòng)畫(huà)。在 Android 5.0 以后引入了 ShareElementsTransition, 讓開(kāi)發(fā)高質(zhì)量的 Activity Transition 變的更加容易。
3. Drawable Animation
Drawable Animation 常見(jiàn)于啟動(dòng)或者一些加載過(guò)程中的幀動(dòng)畫(huà)。當(dāng)然,Android 5.0 以后引入了 Vector Drawable, 一些很漂亮的 icon transition 就變的相對(duì)很容易實(shí)現(xiàn)一些,自然應(yīng)用細(xì)節(jié)體驗(yàn)就能上很大一個(gè)臺(tái)階。
4. Property Animation
Property Animation 是 Android 3.0 以后引入的動(dòng)畫(huà)框架,一開(kāi)始概念略微難理解,但是理解以后會(huì)發(fā)現(xiàn)非常好用,很多自定義動(dòng)畫(huà)或者復(fù)雜動(dòng)畫(huà)的場(chǎng)景變換可以借助這套框架來(lái)實(shí)現(xiàn)。
5. 其他
這些包括 @徐廷霆 提到的粒子,分形,煙霧,模糊等等,需要借助一些高階技術(shù),比如 RenderScript, OpenGLES, NDK 等等來(lái)做,假如不是特別需求,一般開(kāi)發(fā)應(yīng)用過(guò)程中還不會(huì)用到,做為興趣愛(ài)好倒是挺好的一個(gè)切入點(diǎn)。
學(xué)習(xí)分三個(gè)階段:
1,Android基礎(chǔ)階段:平臺(tái)架構(gòu)特性(JAVA/C) Market/應(yīng)用程序組件 環(huán)境搭建與部署/打包與發(fā)布 AVD/DDMS/AAPT 調(diào)試與測(cè)試 相關(guān)資源訪問(wèn)/資源制作 Activity/Service/Broadcast Receiver/Content Provider/原理(生命周期)及深層實(shí)現(xiàn)
2,Android進(jìn)階初級(jí):組件Widget/ 菜單Menu/ 布局Layout 詳解 Xml解析(Pull/Dom/Sax)/JNI 解析SQL數(shù)據(jù)庫(kù)原理,。
SQLite /SharedPreferences/File詳解 多媒體Audio/Video/Camera 詳解
3,Android進(jìn)階高級(jí):藍(lán)牙/WIFI SMS/MMS 應(yīng)用實(shí)現(xiàn) 深層次解析GPS原理。
實(shí)現(xiàn)LocationManager/LocationProvider 進(jìn)行定位/跟蹤/查找/趨近警告以及Geocoder正逆向編解碼等技術(shù)細(xì)節(jié) 2D圖形庫(kù)(Graphics/View)詳解 SDCARD/傳感器/手勢(shì) 應(yīng)用實(shí)現(xiàn)
擴(kuò)展資料:
知識(shí)體系
1、Unix/Linux平臺(tái)技術(shù):基本命令,Linux下的開(kāi)發(fā)環(huán)境
2、企業(yè)級(jí)數(shù)據(jù)庫(kù)技術(shù):SQL語(yǔ)言、SQL語(yǔ)句調(diào)優(yōu)、Oracle數(shù)據(jù)庫(kù)技術(shù)
3、Java 語(yǔ)言核心技術(shù):Java語(yǔ)言基礎(chǔ)、Java面向?qū)ο缶幊獭DK核心API、Java集合框架、Java網(wǎng)絡(luò)編 程、JavaI/O編程、Java多線程編程、Java異常機(jī)制、Java安全、JDBC、XML
4、軟件工程和設(shè)計(jì)模式:軟件工程概述、配置管理及SVN、UML、基本設(shè)計(jì)模式
5、Android應(yīng)用開(kāi)發(fā)基礎(chǔ):Android開(kāi)發(fā)平臺(tái)、Eclipse+ADT開(kāi)發(fā)環(huán)境、AVD及傳感模擬器調(diào)試、Android核心組件、Android常用組件、Android高級(jí)組件、文件及網(wǎng)絡(luò)訪問(wèn)、SQLite數(shù)據(jù)庫(kù)編程、后臺(tái)服務(wù)編程
6、互聯(lián)網(wǎng)核心技術(shù): HTML、CSS、JavaScript、JQuery、Ajax應(yīng)用
7、Android高級(jí)應(yīng)用開(kāi)發(fā):音頻\視頻\攝像頭、互聯(lián)網(wǎng)應(yīng)用、GPS和位置服務(wù)、Google Map、2D\3D繪制、傳感器開(kāi)發(fā)、游戲開(kāi)發(fā)、電話及SMS服務(wù)、網(wǎng)絡(luò)\Bluetooth\Wi-Fi等。
8、Android系統(tǒng)級(jí)開(kāi)發(fā):移植、驅(qū)動(dòng)、NDK(C方向)。
9、JavaEE核心技術(shù):Servlet核心技術(shù)、JSP核心技術(shù)、Struts、Spring、Hibernate框架。
參考資料:百度百科---android開(kāi)發(fā)
一、 前言
Animator框架是Android 4.0中新添加的一個(gè)動(dòng)畫(huà)框架,和之前的Animation框架相比,Animator可以進(jìn)行更多和更精細(xì)化的動(dòng)畫(huà)控制,而且比之前更簡(jiǎn)單和更高效。在4.0源碼中隨處都可以看到Animator的使用。
二、 Animation和Animator比較
如下圖,是Animation和Animator兩個(gè)類(lèi)繼承圖的對(duì)比。
C:Object C:Object
C:Animation C:Animator
C:AlphaAnimation C:AnimatorSet
C:AnimationSet C:ValueAnimator
C:DummyAnimation C:ObjectAnimator
C:Rotate3dAnimation C:TimeAnbimator
C:RotateAniamtion
C:ScaleAnimation
C:TranslateAnimation
Animation框架定義了透明度,旋轉(zhuǎn),縮放和位移幾種常見(jiàn)的動(dòng)畫(huà),而且控制的是一個(gè)整個(gè)View動(dòng)畫(huà),實(shí)現(xiàn)原理是每次繪制視圖時(shí)View所在的ViewGroup中的drawChild函數(shù)獲取該View的Animation的Transformation值,然后調(diào)用canvas.concat(transformToApply.getMatrix()),通過(guò)矩陣運(yùn)算完成動(dòng)畫(huà)幀,如果動(dòng)畫(huà)沒(méi)有完成,繼續(xù)調(diào)用invalidate()函數(shù),啟動(dòng)下次繪制來(lái)驅(qū)動(dòng)動(dòng)畫(huà),動(dòng)畫(huà)過(guò)程中的幀之間間隙時(shí)間是繪制函數(shù)所消耗的時(shí)間,可能會(huì)導(dǎo)致動(dòng)畫(huà)消耗比較多的CPU資源。
在Animator框架中使用最多的是AnimatorSet和ObjectAnimator配合,使用ObjectAnimator進(jìn)行更精細(xì)化控制,只控制一個(gè)對(duì)象的一個(gè)屬性值,多個(gè)ObjectAnimator組合到AnimatorSet形成一個(gè)動(dòng)畫(huà)。而且ObjectAnimator能夠自動(dòng)驅(qū)動(dòng),可以調(diào)用setFrameDelay(longframeDelay)設(shè)置動(dòng)畫(huà)幀之間的間隙時(shí)間,調(diào)整幀率,減少動(dòng)畫(huà)過(guò)程中頻繁繪制界面,而在不影響動(dòng)畫(huà)效果的前提下減少CPU資源消耗。
三、 關(guān)鍵接口介紹
1. ObjectAnimator介紹
Animator框架封裝得比較完美,對(duì)外提供的接口非常簡(jiǎn)單,創(chuàng)建一個(gè)ObjectAnimator只需通過(guò)如下圖所示的靜態(tài)工廠類(lèi)直接返回一個(gè)ObjectAnimator對(duì)象。傳的參數(shù)包括一個(gè)對(duì)象和對(duì)象的屬性名字,但這個(gè)屬性必須有g(shù)et和set函數(shù),內(nèi)部會(huì)通過(guò)java反射機(jī)制來(lái)調(diào)用set函數(shù)修改對(duì)象屬性值。還包括屬性的初始值,最終值,還可以調(diào)用setInterpolator設(shè)置曲線函數(shù)。
2. AnimatorSet介紹
AnimatorSet主要是組合多個(gè)AnimatorSet和ObjectAnimator形成一個(gè)動(dòng)畫(huà),并可以控制動(dòng)畫(huà)的播放順序,其中還有個(gè)輔助類(lèi)通過(guò)調(diào)用play函數(shù)獲得。
3. AnimatorUpdateListner介紹
通過(guò)實(shí)現(xiàn)AnimatorUpdateListner,來(lái)獲得屬性值發(fā)生變化時(shí)的事件,在這個(gè)回調(diào)中發(fā)起重繪屏幕事件。
四、 使用實(shí)例
在Android4.0中的ApiDemo中有個(gè)BouncingBalls實(shí)例,描述了Animator框架的使用,當(dāng)點(diǎn)擊屏幕時(shí),繪制一個(gè)球從點(diǎn)擊位置掉到屏幕底部,碰到底部時(shí)球有壓扁的效果,然后回彈到點(diǎn)擊位置再消失。
代碼如下:
ShapeHolder newBall =addBall(event.getX(), event.getY());
// Bouncing animation with squash and stretch
float startY = newBall.getY();
float endY = getHeight() - 50f;
float h = (float)getHeight();
float eventY = event.getY();
int duration = (int)(500 * ((h - eventY)/h));
ValueAnimator bounceAnim = ObjectAnimator.ofFloat(newBall, "y", startY, endY);
bounceAnim.setDuration(duration);
bounceAnim.setInterpolator(new AccelerateInterpolator());
ValueAnimator squashAnim1 = ObjectAnimator.ofFloat(newBall, "x", newBall.getX(),
newBall.getX() - 25f);
squashAnim1.setDuration(duration/4);
squashAnim1.setRepeatCount(1);
squashAnim1.setRepeatMode(ValueAnimator.REVERSE);
squashAnim1.setInterpolator(new DecelerateInterpolator());
ValueAnimator squashAnim2 = ObjectAnimator.ofFloat(newBall, "width", newBall.getWidth(),
newBall.getWidth() + 50);
squashAnim2.setDuration(duration/4);
squashAnim2.setRepeatCount(1);
squashAnim2.setRepeatMode(ValueAnimator.REVERSE);
squashAnim2.setInterpolator(new DecelerateInterpolator());
ValueAnimator stretchAnim1 = ObjectAnimator.ofFloat(newBall, "y", endY,
endY + 25f);
stretchAnim1.setDuration(duration/4);
stretchAnim1.setRepeatCount(1);
stretchAnim1.setInterpolator(new DecelerateInterpolator());
stretchAnim1.setRepeatMode(ValueAnimator.REVERSE);
ValueAnimator stretchAnim2 = ObjectAnimator.ofFloat(newBall, "height",
newBall.getHeight(),newBall.getHeight() - 25);
stretchAnim2.setDuration(duration/4);
stretchAnim2.setRepeatCount(1);
stretchAnim2.setInterpolator(new DecelerateInterpolator());
stretchAnim2.setRepeatMode(ValueAnimator.REVERSE);
ValueAnimator bounceBackAnim = ObjectAnimator.ofFloat(newBall, "y", endY,
startY);
bounceBackAnim.setDuration(duration);
bounceBackAnim.setInterpolator(newDecelerateInterpolator());
// Sequence the down/squashstretch/upanimations
AnimatorSet bouncer = new AnimatorSet();
bouncer.play(bounceAnim).before(squashAnim1);
bouncer.play(squashAnim1).with(squashAnim2);
bouncer.play(squashAnim1).with(stretchAnim1);
bouncer.play(squashAnim1).with(stretchAnim2);
bouncer.play(bounceBackAnim).after(stretchAnim2);
// Fading animation - remove the ball when theanimation is done
ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
fadeAnim.setDuration(250);
fadeAnim.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animatoranimation) {
balls.remove(((ObjectAnimator)animation).getTarget());
}
});
// Sequence the two animations to play oneafter the other
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(bouncer).before(fadeAnim);
// Start the animation
animatorSet.start();
網(wǎng)站名稱(chēng):android動(dòng)畫(huà)框架,Android動(dòng)畫(huà)效果
當(dāng)前網(wǎng)址:http://aaarwkj.com/article32/dsspdpc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、App設(shè)計(jì)、網(wǎng)站設(shè)計(jì)、做網(wǎng)站、小程序開(kāi)發(fā)、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)