Android 5新特性
Android5.0主要特性概述
1、響應(yīng)式交互分為:表層響應(yīng)、元素響應(yīng)、徑向響應(yīng)
- 表層響應(yīng):用戶點擊屏幕,系統(tǒng)立即在交互接觸點上繪制一個可視化圖形,讓用戶感知
- 元素響應(yīng):元素本身也能做出響應(yīng),物體可以在觸控或點擊的時候浮起來,已表示元素處于激活可交互狀態(tài)
View體系和自定義View
1、View和ViewGroup
- View是Android所有控件基類
-
ViewGroup也繼承自View,派生出很多基類:LinearLayout,RelativeLayout等
View樹

坐標系
Android系統(tǒng)中有兩種坐標系:Android坐標系和View坐標系(兩者共存)
Android坐標系:View的getRawX() ,getRawY()獲取的是Android坐標系坐標

View坐標系

//獲取View寬高:
width = getRight() - getLeft()
height = getBottom() - getTop()
或者
width = getWidth()
height = getHeight()
View自身坐標(View相對于ViewGroup的坐標)

Android觸摸事件最終由onTouchEvent(MothionEvent event)處理。MotionEvent中提供了很多常量事件,例如:ACTION_DOWN、ACTION_UP、ACTION_MOVE;此外還提供了獲取觸摸點坐標的方法。
getX() getY()獲取是相對于ViewGroup的坐標;getRawX() getRawY()獲取的相對于屏幕的坐標(Android坐標)

View滑動
View的滑動是Android實現(xiàn)自定義View的基礎(chǔ),以及處理各種View滑動方式。
處理滑動方式基本思想:當點擊事件傳遞到View時,系統(tǒng)記下觸摸點坐標,手指移動時系統(tǒng)記下觸摸點移動后的坐標并計算出偏移量,并通過偏移量來修改View坐標。
實現(xiàn)View滑動的主要方法如下:
layout()方法
View的繪制會調(diào)用onLayout()方法來展示到具體位置上,可以通過修改left,right,bottom,top改變View坐標。例如:onTouchEvent()中接收ACTION_DOWN和ACTION_MOVE事件,DOWN的時候記錄位置,然后MOVE的時候計算出移動后的偏移量,在調(diào)用layout()方法進行重新布局。
offsetLeftAndRight()和offsetTopAndBottom()
使用方式和layout()差不多,只不過只用計算偏移量然后分別移動,layout()方法則是需要傳入移動后的坐標
LayoutParams(布局參數(shù))
LayoutParams保存了View的布局參數(shù),因此可以實現(xiàn)改變布局參數(shù),改變View位置。如父容器是LinearLayout,獲取LayoutParams就調(diào)用LinearLayout.LayoutParams。同樣可以使用ViewGroup.MarginLayoutParams設(shè)置Margin
動畫
- Animation存在一些局限性,也就是動畫改變的只是顯示,但View的位置沒有發(fā)生變化,View移動后并不能響應(yīng)事件。
可以采用動畫來實現(xiàn)View移動,res文件夾中創(chuàng)建anim文件,創(chuàng)建動畫xml文件,代碼通過AnimationUtils.LoadAnimation(this, R.anim.XXX)加載資源,最后通過View的startAnimation()啟動動畫。(這種方式是補間動畫,AlphaAnimation、RotateAnimation、TranslateAnimation、ScaleAnimation這4種動畫)
注意:View動畫并不能改變View的位置參數(shù),實際上只改變了View的效果,如果要實現(xiàn)改變View效果和View的位置參數(shù)同時改變,可以設(shè)置android:fillAfter="true"屬性,表示動畫結(jié)束后,保持現(xiàn)狀?;蛘呤褂脤傩詣赢嫷姆绞剑?/p>

scrollTo()和scrollBy(),效果為瞬間完成
scrollTo(x, y)表示移動到(x, y)這個坐標點
scrollBy(dx, dy)表示移動X和Y方向的dx和dy偏移量,內(nèi)部實際上調(diào)用的是scrollTo()

Scroller,實現(xiàn)過渡效果的滑動,不是瞬時完成而是在一定間隔內(nèi)完成。
原理:Scroller并不能直接實現(xiàn)View的滑動,需要配合View的computeScroll()方法。在computeScroll()中不斷讓View進行重繪,每次重繪都會計算滑動持續(xù)時間,根據(jù)這個持續(xù)時間就能算出此次View滑動效果,然后根據(jù)每次滑動的位置調(diào)用scrollTo() 進行滑動。反復操作最終實現(xiàn)View的滑動效果。
-
注意:scroller本身是不能實現(xiàn)View滑動,需要和View的computeScroll()配合才能實現(xiàn)彈性滑動效果
scoller邏輯
重寫View的computeScroll()方法,不斷地scrollTo()和invalidate()重繪實現(xiàn)彈性滑動效果
屬性動畫(優(yōu)點:效率比較高,使用也方便。)
在Animator框架中使用最多的就是AnimatorSet和ObjectAnimator配合:使用 ObjectAnimator 進行更精細化的控制,控制一個對象和一個屬性值,而使用多個ObjectAnimator組合到AnimatorSet形成一個動畫。屬性動畫通過調(diào)用屬性get、set方法來真實地控制一個View的屬性值
ObjectAnimator


- 注意:ObjectAnimator的屬性必須要有g(shù)et和set方法,否則無效。如果一個屬性沒有set和get方法,可以通過自定義一個屬性類或者包裝類給這個屬性設(shè)置set和get方法。
ValueAnimator
不提供任何動畫效果,用于產(chǎn)生一定規(guī)律的數(shù)字,從而讓調(diào)用者控制動畫的實現(xiàn)過程。
- 監(jiān)聽數(shù)據(jù)更新采用ValueAnimator.AnimatorUpdateListener重寫onAnimationUpdate(ValueAnimator animator)方法有animator的getAniamtedValue()獲取當前動畫值,進行動畫監(jiān)聽。
- 完整的動畫監(jiān)聽:Animator.AnimatorListener中由onAnimationStart()、onAnimationEnd()、onAnimationCancel()、onAnimationRepeat()監(jiān)聽動畫開始,結(jié)束,取消和重復。
- 只監(jiān)聽動畫結(jié)束:AnimatorListenerAdapter的onAnimationEnd()方法就能實現(xiàn)。
組合動畫1-AnimatorSet
AnimatorSet提供一個play(),傳入Animator對象(ValueAnimator或ObjectAnimator),返回一個AnimatorSet.Builder的實例。
public Builder play(Animator anim) {
if (anim != null) {
mNeedSort = true;
return new Builder(anim);
}
return null;
}

組合動畫2-PropertyValuesHolder(只能是多個動畫一起執(zhí)行)

XML中創(chuàng)建屬性動畫:res文件中創(chuàng)建animator文件夾,將屬性動畫xml放入其中。


