View體系

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樹
View繼承關(guān)系

坐標系

Android系統(tǒng)中有兩種坐標系:Android坐標系和View坐標系(兩者共存)

Android坐標系:View的getRawX() ,getRawY()獲取的是Android坐標系坐標

Android坐標系

View坐標系

View坐標系
//獲取View寬高:
width =  getRight() - getLeft() 
height = getBottom() - getTop()

或者

width = getWidth()
height = getHeight()

View自身坐標(View相對于ViewGroup的坐標)

View自身坐標

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

getX() getY()獲取是相對于ViewGroup的坐標;getRawX() getRawY()獲取的相對于屏幕的坐標(Android坐標)


MotionEvent獲取交點坐標方法

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>

屬性動畫實現(xiàn)方式示例

scrollTo()和scrollBy(),效果為瞬間完成

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


scrollTo()和scrollBy()源碼

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

創(chuàng)建ObjectAnimator

ObjectAnimator屬性參數(shù)常用值
  • 注意: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;
 }
AnimatorSet.Builder提供的方法

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

PropertyValuesHolder組合動畫示例

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

XML中創(chuàng)建屬性動畫
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容