成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

08.Android之View事件問(wèn)題

lavnFan / 1256人閱讀

摘要:內(nèi)部是調(diào)用效果是移動(dòng)的內(nèi)容,因此需要在的父控件中調(diào)用。和的情況相似,手機(jī)屏幕向下移動(dòng),為正值手機(jī)屏幕向上移動(dòng),為負(fù)值。

目錄介紹

8.0.0.1 簡(jiǎn)述Android的事件分發(fā)機(jī)制?dispatchTouchEvent方法的作用是什么?說(shuō)下View和ViewGroup分發(fā)事件?

8.0.0.2 onInterceptTouchEvent方法作用是什么?onTouchEvent的方法的作用是什么?

8.0.0.4 滑動(dòng)沖突有哪些場(chǎng)景?滑動(dòng)沖突處理原則是什么?滑動(dòng)沖突解決辦法有哪些?分別是如何解決的?

8.0.0.5 onTouch()、onTouchEvent()和onClick()關(guān)系是怎樣的,哪一個(gè)先執(zhí)行?如果設(shè)置了onClickListener, 但是onClick()沒(méi)有調(diào)用,可能產(chǎn)生的原因?

8.0.0.6 View滑動(dòng)有哪些方法?這些方法分別是如何實(shí)現(xiàn)滑動(dòng)的?分別有什么優(yōu)缺點(diǎn)?

8.0.0.7 事件的傳遞規(guī)則是什么?View處理事件的優(yōu)先級(jí)?點(diǎn)擊事件傳遞過(guò)程遵循如下順序?事件傳遞規(guī)則要點(diǎn)?

8.0.0.8 Scroller的作用?Scroller的要點(diǎn)有哪些?Scroller的使用步驟?Scroller工作原理?

8.0.0.9 Activity事件分發(fā)的過(guò)程?Window事件分發(fā)?DecorView的事件分發(fā)?根View的事件分發(fā)?

8.0.1.0 GestureDetector是干什么用的?GestureDetector作用和注意點(diǎn)?有哪些常用的監(jiān)聽方法?

8.0.1.2 View的滑動(dòng)方式?如何讓控件滾動(dòng)到某一位置?scrollTo()和scrollBy()的區(qū)別?Scroller是什么?

8.0.1.4 談一談View的工作原理,執(zhí)行流程,MeasureSpec是什么?有什么作用?

8.0.1.6 SurfaceView和View的區(qū)別,說(shuō)一下SurfaceView的工作原理,為何不會(huì)導(dǎo)致頁(yè)面卡頓?

好消息

博客筆記大匯總【15年10月到至今】,包括Java基礎(chǔ)及深入知識(shí)點(diǎn),Android技術(shù)博客,Python學(xué)習(xí)筆記等等,還包括平時(shí)開發(fā)中遇到的bug匯總,當(dāng)然也在工作之余收集了大量的面試題,長(zhǎng)期更新維護(hù)并且修正,持續(xù)完善……開源的文件是markdown格式的!同時(shí)也開源了生活博客,從12年起,積累共計(jì)500篇[近100萬(wàn)字],將會(huì)陸續(xù)發(fā)表到網(wǎng)上,轉(zhuǎn)載請(qǐng)注明出處,謝謝!

鏈接地址:https://github.com/yangchong2...

如果覺(jué)得好,可以star一下,謝謝!當(dāng)然也歡迎提出建議,萬(wàn)事起于忽微,量變引起質(zhì)變!

8.0.0.1 簡(jiǎn)述Android的事件分發(fā)機(jī)制?dispatchTouchEvent方法的作用是什么?說(shuō)下View和ViewGroup分發(fā)事件?

簡(jiǎn)述Android的事件分發(fā)機(jī)制?技術(shù)博客大總結(jié)

事件分發(fā)順序:Activty->ViewGroup->View

主要方法:dispatchTouchEvent-分發(fā)事件、onInterceptTouchEvent-當(dāng)前View是否攔截該事件、onTouchEvent-處理事件

1.父View調(diào)用dispatchTouchEvent開啟事件分發(fā)。

2.父View調(diào)用onInterceptTouchEvent判斷是否攔截該事件,一旦攔截后該事件的后續(xù)事件(如DOWN之后的MOVE和UP)都直接攔截,不會(huì)再進(jìn)行判斷。

3.如果父View進(jìn)行攔截,父View調(diào)用onTouchEvent進(jìn)行處理。

4.如果父View不進(jìn)行攔截,會(huì)調(diào)用子View的dispatchTouchEvent進(jìn)行事件的層層分發(fā)。

dispatchTouchEvent方法的作用是什么?

用于進(jìn)行事件的分發(fā)

只要事件傳給當(dāng)前View,該方法一定會(huì)被調(diào)用

返回結(jié)果受到當(dāng)前View的onTouchEvent和下級(jí)View的dispatchTouchEvent影響

表示是否消耗當(dāng)前事件

ViewGroup事件分發(fā)偽代碼

View事件分發(fā)偽代碼

View和ViewGroup在dispatchTouchEvent上的區(qū)別

ViewGroup在dispatchTouchEvent()中會(huì)進(jìn)行事件的分發(fā)。

View在dispatchTouchEvent()中會(huì)對(duì)該事件進(jìn)行處理。技術(shù)博客大總結(jié)

8.0.0.2 onInterceptTouchEvent方法作用是什么?onTouchEvent的方法的作用是什么?

onInterceptTouchEvent方法作用是什么?

在dispatchTouchEvent的內(nèi)部調(diào)用,用于判斷是否攔截某個(gè)事件

View和ViewGroup在onInterceptTouchEvent上的區(qū)別:

View沒(méi)有該方法,View會(huì)處理所有收到的事件,但不一定會(huì)消耗該事件。

onInterceptTouchEvent是ViewGroup中添加的方法,用于判斷是否攔截該事件。

onTouchEvent的方法的作用是什么?技術(shù)博客大總結(jié)

在dispatchTouchEvent的中調(diào)用,用于處理點(diǎn)擊事件

返回結(jié)果表示是否消耗當(dāng)前事件

8.0.0.4 滑動(dòng)沖突有哪些場(chǎng)景?滑動(dòng)沖突處理原則是什么?滑動(dòng)沖突解決辦法有哪些?分別是如何解決的?

滑動(dòng)沖突有哪些場(chǎng)景?

內(nèi)層和外層滑動(dòng)方向不一致:一個(gè)垂直,一個(gè)水平。比如輪播圖ViewPager和ScrollView

內(nèi)存和外層滑動(dòng)方向一致:均垂直or水平。比如scrollView和RecyclerView

前兩者層層嵌套。比如ScrollView和RecyclerView(recyclerView中又嵌套recyclerView)

滑動(dòng)沖突處理原則

對(duì)于內(nèi)外層滑動(dòng)方向不同,只需要根據(jù)滑動(dòng)方向來(lái)給相應(yīng)控件攔截

對(duì)于內(nèi)外層滑動(dòng)方向相同,需要根據(jù)業(yè)務(wù)來(lái)進(jìn)行事件攔截,規(guī)定何時(shí)讓外部View攔截事件何時(shí)由內(nèi)部View攔截事件。

前兩者嵌套的情況,根據(jù)前兩種原則層層處理即可。

滑動(dòng)沖突解決辦法有哪些?技術(shù)博客大總結(jié)

外部攔截法:指點(diǎn)擊事件都先經(jīng)過(guò)父容器的攔截處理,如果父容器需要此事件就攔截,否則就不攔截。具體方法:需要重寫父容器的onInterceptTouchEvent方法,在內(nèi)部做出相應(yīng)的攔截。

內(nèi)部攔截法:指父容器不攔截任何事件,而將所有的事件都傳遞給子容器,如果子容器需要此事件就直接消耗,否則就交由父容器進(jìn)行處理。具體方法:需要配合requestDisallowInterceptTouchEvent方法。

外部攔截解決滑動(dòng)沖突法

外部攔截法要點(diǎn)

父容器的onInterceptTouchEvent方法中處理

ACTION_DOWN不攔截,一旦攔截會(huì)導(dǎo)致后續(xù)事件都直接交給父容器處理。

ACTION_MOVE中根據(jù)情況進(jìn)行攔截,攔截:return true,不攔截:return false(外部攔截核心)

ACTION_UP不攔截,如果父控件攔截UP,會(huì)導(dǎo)致子元素接收不到UP進(jìn)一步會(huì)讓onClick方法無(wú)法觸發(fā)。此外UP攔截也沒(méi)什么用。

onClick方法生效的兩個(gè)條件?

View可以點(diǎn)擊

接收到了DOWN和UP事件

外部攔截,自定義ScrollView,這塊可以看我的博客:

8.0.0.5 onTouch()、onTouchEvent()和onClick()關(guān)系是怎樣的,哪一個(gè)先執(zhí)行?如果設(shè)置了onClickListener, 但是onClick()沒(méi)有調(diào)用,可能產(chǎn)生的原因?

onTouch()、onTouchEvent()和onClick()關(guān)系是怎樣的,哪一個(gè)先執(zhí)行?

onTouch->onTouchEvent->onClick

當(dāng)一個(gè)View需要處理事件時(shí),如果它設(shè)置了OnTouchListener,那么OnTouchListener的onTouch方法會(huì)被回調(diào)。

這時(shí)事件如何處理還得看onTouch的返回值,如果返回false,則當(dāng)前View的onTouchEvent方法會(huì)被調(diào)用;如果返回true,那么onTouchEvent方法將不會(huì)被調(diào)用。由此可見,給View設(shè)置的onTouchListener,其優(yōu)先級(jí)比onTouchEvent要高。

如果當(dāng)前方法中設(shè)置了onClickListener,那么它的onClick方法會(huì)被調(diào)用??梢钥闯?,常用的OnClickListener,其優(yōu)先級(jí)別最低。

如果設(shè)置了onClickListener, 但是onClick()沒(méi)有調(diào)用,可能產(chǎn)生的原因? 技術(shù)博客大總結(jié)

父View攔截了事件,沒(méi)有傳遞到當(dāng)前View

View的Enabled = false(setEnabled(false)): view處于不可用狀態(tài),會(huì)直接返回。

View的Clickable = false(setClickablesetLongClickable(false)):view不可以點(diǎn)擊,不會(huì)執(zhí)行onClick

View設(shè)置了onTouchListener,且消耗了事件。會(huì)提前返回。

View設(shè)置了TouchDelegate,且消耗了事件。會(huì)提前返回。

8.0.0.6 View滑動(dòng)有哪些方法?這些方法分別是如何實(shí)現(xiàn)滑動(dòng)的?分別有什么優(yōu)缺點(diǎn)?

View滑動(dòng)有哪些方法?

layout:對(duì)View進(jìn)行重新布局定位。在onTouchEvent()方法中獲得控件滑動(dòng)前后的偏移。然后通過(guò)layout方法重新設(shè)置。

offsetLeftAndRight和offsetTopAndBottom:系統(tǒng)提供上下/左右同時(shí)偏移的API。onTouchEvent()中調(diào)用

LayoutParams: 更改自身布局參數(shù)

scrollTo/scrollBy: 本質(zhì)是移動(dòng)View的內(nèi)容,需要通過(guò)父容器的該方法來(lái)滑動(dòng)當(dāng)前View

Scroller: 平滑滑動(dòng),通過(guò)重載computeScroll(),使用scrollTo/scrollBy完成滑動(dòng)效果。

屬性動(dòng)畫: 動(dòng)畫對(duì)View進(jìn)行滑動(dòng)技術(shù)博客大總結(jié)

ViewDragHelper: 谷歌提供的輔助類,用于完成各種拖拽效果。

Layout實(shí)現(xiàn)滑動(dòng)

offsetLeftAndRight和offsetTopAndBottom實(shí)現(xiàn)滑動(dòng)

LayoutParams實(shí)現(xiàn)滑動(dòng)

通過(guò)父控件設(shè)置View在父控件的位置,但需要指定父布局的類型,不好

用ViewGroup的MariginLayoutParams的方法去設(shè)置margin

//方法一:通過(guò)布局設(shè)置在父控件的位置。但是必須要有父控件, 而且要指定父布局的類型,不好的方法。 
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) getLayoutParams(); 
layoutParams.leftMargin = getLeft() + offsetX; 
layoutParams.topMargin = getTop() + offsetY; 
setLayoutParams(layoutParams);
/**===============================================
 * 方法二:用ViewGroup的MarginLayoutParams的方法去設(shè)置marign
 * 優(yōu)點(diǎn):相比于上面方法, 就不需要知道父布局的類型。

     *===============================================*/ 
    ViewGroup.MarginLayoutParams mlayoutParams = (ViewGroup.MarginLayoutParams) getLayoutParams();
    mlayoutParams.leftMargin = getLeft() + offsetX; 
    mlayoutParams.topMargin = getTop() + offsetY; 
    setLayoutParams(mlayoutParams);
    ```

scrollToscrollBy實(shí)現(xiàn)滑動(dòng)

都是View提供的方法。

scrollTo-直接到新的x,y坐標(biāo)處。

scrollBy-基于當(dāng)前位置的相對(duì)滑動(dòng)。

scrollBy-內(nèi)部是調(diào)用scrollTo.

scrollToscrollBy, 效果是移動(dòng)View的內(nèi)容,因此需要在View的父控件中調(diào)用。

scrollTo/By內(nèi)部的mScrollX和mScrollY的意義

mScrollX的值,相當(dāng)于手機(jī)屏幕相對(duì)于View左邊緣向右移動(dòng)的距離,手機(jī)屏幕向右移動(dòng)時(shí),mScrollX的值為正;手機(jī)屏幕向左移動(dòng)(等價(jià)于View向右移動(dòng)),mScrollX的值為負(fù)。

mScrollY和X的情況相似,手機(jī)屏幕向下移動(dòng),mScrollY為+正值;手機(jī)屏幕向上移動(dòng),mScrollY為-負(fù)值。

mScrollX/Y是根據(jù)第一次滑動(dòng)前的位置來(lái)獲得的,例如:第一次向左滑動(dòng)200(等于手機(jī)屏幕向右滑動(dòng)200),mScrollX = 200;第二次向右滑動(dòng)50, mScrollX = 200 + (-50)= 150,而不是(-50)。

動(dòng)畫實(shí)現(xiàn)滑動(dòng)的方法

可以通過(guò)傳統(tǒng)動(dòng)畫或者屬性動(dòng)畫的方式實(shí)現(xiàn)

傳統(tǒng)動(dòng)畫需要通過(guò)設(shè)置fillAfter為true來(lái)保留動(dòng)畫后的狀態(tài)(但是無(wú)法在動(dòng)畫后的位置進(jìn)行點(diǎn)擊操作,這方面還是屬性動(dòng)畫好)

屬性動(dòng)畫會(huì)保留動(dòng)畫后的狀態(tài),能夠點(diǎn)擊。技術(shù)博客大總結(jié)

ViewDragHelper

通過(guò)ViewDragHelper去自定義ViewGroup讓其子View具有滑動(dòng)效果。不過(guò)用的很少

8.0.0.7 事件的傳遞規(guī)則是什么?View處理事件的優(yōu)先級(jí)?點(diǎn)擊事件傳遞過(guò)程遵循如下順序?事件傳遞規(guī)則要點(diǎn)?

事件的傳遞規(guī)則是什么?

點(diǎn)擊事件產(chǎn)生后,會(huì)先傳遞給根ViewGroup,并調(diào)用dispatchTouchEvent

之后會(huì)通過(guò)onInterceptTouchEvent判斷是否攔截該事件,如果true,則表示攔截并交給該ViewGroup的onTouchEvent方法進(jìn)行處理

如果不攔截,則當(dāng)前事件會(huì)傳遞給子元素,調(diào)用子元素的dispatchTouchEvent,如此反復(fù)直到事件被處理

View處理事件的優(yōu)先級(jí)?

在View需要處理事件時(shí),會(huì)先調(diào)用OnTouchListener的onTouch方法,并判斷onTouch的返回值

返回true,表示處理完成,不會(huì)調(diào)用onTouchEvent方法

返回false,表示未完成,調(diào)用onTouchEvent方法進(jìn)行處理

可見,onTouchEvent的優(yōu)先級(jí)沒(méi)有OnTouchListener高

onTouchEvent沒(méi)有消耗的話就會(huì)交給TouchDelegate的onTouchEvent去處理。

如果最后事件都沒(méi)有消耗,會(huì)在onTouchEvent中執(zhí)行performClick()方法,內(nèi)部會(huì)執(zhí)行OnClickListener的onClick方法,優(yōu)先級(jí)最低,屬于事件傳遞尾端

點(diǎn)擊事件傳遞過(guò)程遵循如下順序?技術(shù)博客大總結(jié)

Activity->Window->View->分發(fā)

如果View的onTouchEvent返回false,則父容器的onTouchEvent會(huì)被調(diào)用,最終可以傳遞到Activity的onTouchEvent

事件傳遞規(guī)則要點(diǎn)?

View一旦攔截事件,則整個(gè)事件序列都由它處理(ACTION_DOWNUP等),onInterceptTouchEvent不會(huì)再調(diào)用(因?yàn)槟J(rèn)都攔截了)

但是一個(gè)事件序列也可以通過(guò)特殊方法交給其他View處理(onTouchEvent)

如果View開始處理事件(已經(jīng)攔截),如果不消耗ACTIO_DOWN事件(onTouchEvent返回false),則同一事件序列的剩余內(nèi)容都直接交給父onTouchEvent處理

View消耗了ACTION_DOWN,但不處理其他的事件,整個(gè)事件序列會(huì)消失(父onTouchEvent)不會(huì)調(diào)用。這些消失的點(diǎn)擊事件最終會(huì)傳給Activity處理。

ViewGroup默認(rèn)不攔截任何事件(onInterceptTouchEvent默認(rèn)返回false)

View沒(méi)有onInterceptTouchEvent方法,一旦有事件傳遞給View,onTouchEvent就會(huì)被調(diào)用

View的onTouchEvent默認(rèn)都會(huì)消耗事件return true, 除非該View不可點(diǎn)擊(clickable和longClickable同時(shí)為false)

View的enable屬性不影響onTouchEvent的默認(rèn)返回值。即使是disable狀態(tài)。

onClick的發(fā)生前提是當(dāng)前View可點(diǎn)擊,并且收到了down和up事件

事件傳遞過(guò)程是由父到子,層層分發(fā),可以通過(guò)requestDisallowInterceptTouchEvent讓子元素干預(yù)父元素的事件分發(fā)(ACTION_DOWN除外)

8.0.0.8 Scroller的作用?Scroller的要點(diǎn)有哪些?Scroller的使用步驟?Scroller工作原理?

Scroller的作用?

用于封裝滑動(dòng)

提供了基于時(shí)間的滑動(dòng)偏移值,但是實(shí)際滑動(dòng)需要我們?nèi)ヘ?fù)責(zé)。

Scroller的要點(diǎn)有哪些?

調(diào)用startScroll方法時(shí),Scroller只是單純的保存參數(shù)

之后的invalidate方法導(dǎo)致的View重繪

View重繪之后draw方法會(huì)調(diào)用自己實(shí)現(xiàn)的computeScroll(),才真正實(shí)現(xiàn)了滑動(dòng)

Scroller的使用步驟?

Scroller工作原理?技術(shù)博客大總結(jié)

Scroller本身不能實(shí)現(xiàn)View的滑動(dòng),需要配合View的computeScroll方法實(shí)現(xiàn)彈性滑動(dòng)

不斷讓View重繪,每一次重繪距離滑動(dòng)的開始時(shí)間有一個(gè)時(shí)間間隔,通過(guò)該時(shí)間可以得到View當(dāng)前的滑動(dòng)距離

View的每次重繪都會(huì)導(dǎo)致View的小幅滑動(dòng),多次小幅滑動(dòng)就組成了彈性滑動(dòng)

8.0.0.9 Activity事件分發(fā)的過(guò)程?Window事件分發(fā)?DecorView的事件分發(fā)?根View的事件分發(fā)?

Activity事件分發(fā)的過(guò)程?

事件分發(fā)過(guò)程:Activity->Window->Decor View(當(dāng)前界面的底層容器,setContentView的View的父容器)->ViewGroup->View

Activity的dispatchTouchEvent,會(huì)交給Window處理(getWindow().superDispatchTouchEvent()),

返回true:事件全部結(jié)束

返回false:所有View都沒(méi)有處理(onTouchEvent返回false),則調(diào)用Activity的onTouchEvent

Window事件分發(fā)?

Window和superDispatchTouchEvent分別是抽象類和抽象方法

Window的實(shí)現(xiàn)類是PhoneWindow

PhoneWindow的superDispatchTouchEvent()直接調(diào)用mDecor.superDispatchTouchEvent(),也就是直接傳給了DecorView

DecorView的事件分發(fā)?

DecorView繼承自FrameLayout

DecorView的superDispatchTouchEvent()會(huì)調(diào)用super.dispatchTouchEvent()——也就是ViewGroup的dispatchTouchEvent方法,之后就會(huì)層層分發(fā)下去。

根View的事件分發(fā)?技術(shù)博客大總結(jié)

頂層View調(diào)用dispatchTouchEvent

調(diào)用onInterceptTouchEvent方法

返回true,事件由當(dāng)前View處理。如果有onTouchiListener,會(huì)執(zhí)行onTouch,并且屏蔽掉onTouchEvent。沒(méi)有則執(zhí)行onTouchEvent。如果設(shè)置了onClickListener,會(huì)在onTouchEvent后執(zhí)行onClickListener

返回false,不攔截,交給子View重復(fù)如上步驟。

8.0.1.0 GestureDetector是干什么用的?GestureDetector作用和注意點(diǎn)?有哪些常用的監(jiān)聽方法?

GestureDetector作用和注意點(diǎn)?

探測(cè)手勢(shì)和事件,需要通過(guò)提供的MotionEvent

該類僅能用于touch觸摸提供的MotionEvent,不能用于traceball events(追蹤球事件)

可以在自定義View中重寫onTouchEvent()方法并在里面用GestureDetector接管。

可以在View的setOnTouchListener的onTouch中將點(diǎn)擊事件交給GestureDetector接管。

有哪些常用的監(jiān)聽方法?

OnGestureListener

OnDoubleTapListener

OnContextClickListener

SimpleOnGestureListener

OnGestureListener

OnGestureListener作用技術(shù)博客大總結(jié)

用于在手勢(shì)產(chǎn)生時(shí),去通知監(jiān)聽者。

該監(jiān)聽器會(huì)監(jiān)聽所有的手勢(shì),如果只需要監(jiān)聽一部分可以使用SimpleOnGestureListener

OnGestureListener能監(jiān)聽哪些手勢(shì)

按下操作。

按下之后,Move和Up之前。用于提供視覺(jué)反饋告訴用戶已經(jīng)捕獲了他們的行為。

抬起操作。

滑動(dòng)操作(由Down MotionEvent e1觸發(fā),當(dāng)前是Move MotionEvent e2)

長(zhǎng)按操作。

猛扔操作。

所有有返回值的回調(diào)方法,return true-消耗該事件;return false-不消耗該事件

OnDoubleTapListener

OnDoubleTapListener作用

監(jiān)聽“雙擊操作”

監(jiān)聽“確認(rèn)的單擊操作”—該單擊操作之后的操作無(wú)法構(gòu)成一次雙擊。

OnDoubleTapListener能監(jiān)聽哪些手勢(shì)?

單擊操作。

雙擊操作.

雙擊操作之間發(fā)生了down、move或者up事件。

8.0.1.2 View的滑動(dòng)方式?如何讓控件滾動(dòng)到某一位置?scrollTo()和scrollBy()的區(qū)別?Scroller是什么?

View的滑動(dòng)方式?

三種方式:

a. 通過(guò)View本身提供的scrollTo/scrollBy方法

移動(dòng)的是View的內(nèi)容,View本身不移動(dòng)

b. 通過(guò)動(dòng)畫給View施加平移效果實(shí)現(xiàn)滑動(dòng)

通過(guò)補(bǔ)間動(dòng)畫移動(dòng)的View的影像,View本身位置不發(fā)生改變。通過(guò)屬性動(dòng)畫移動(dòng)view的影像,view本身位置會(huì)發(fā)生改變。

c. 通過(guò)改變View的LayoutParams使View重新布局實(shí)現(xiàn)滑動(dòng)

改變布局參數(shù),代碼如下:

MarginLayoutParams params = (MarginLayoutParams) mButton.getLayoutParams();
params.width += 10;
params.height += 10;
mButton.setLayoutParams(params);

三種方法的使用對(duì)比

scrollTo/scrollBy:操作簡(jiǎn)單,適合對(duì)View內(nèi)容的滑動(dòng);

動(dòng)畫:操作簡(jiǎn)單,主要適合于沒(méi)有交互的View和實(shí)現(xiàn)復(fù)雜的動(dòng)畫效果;

改變布局參數(shù):操作稍微復(fù)雜,適用于有交互的View。

scrollTo()和scrollBy()技術(shù)博客大總結(jié)

scrollBy內(nèi)部調(diào)用了scrollTo,它是基于當(dāng)前位置的相對(duì)滑動(dòng);而scrollTo是絕對(duì)滑動(dòng),因此如果利用相同輸入?yún)?shù)多次調(diào)用scrollTo()方法,由于View初始位置是不變只會(huì)出現(xiàn)一次View滾動(dòng)的效果而不是多次。

引申:兩者都只能對(duì)view內(nèi)容進(jìn)行滑動(dòng),而不能使view本身滑動(dòng),且非平滑,可使用Scroller有過(guò)渡滑動(dòng)的效果。

Scroller實(shí)現(xiàn)滑動(dòng)的具體過(guò)程:

在MotionEvent.ACTION_UP事件觸發(fā)時(shí)調(diào)用startScroll()方法,該方法并沒(méi)有進(jìn)行實(shí)際的滑動(dòng)操作,而是記錄滑動(dòng)相關(guān)量

馬上調(diào)用invalidate/postInvalidate()方法,請(qǐng)求View重繪,導(dǎo)致View.draw方法被執(zhí)行

緊接著會(huì)調(diào)用View.computeScroll()方法,此方法是空實(shí)現(xiàn),需要自己處理邏輯。具體邏輯是:先判斷computeScrollOffset(),若為true(表示滾動(dòng)未結(jié)束),則執(zhí)行scrollTo()方法,它會(huì)再次調(diào)用postInvalidate(),如此反復(fù)執(zhí)行,直到返回值為false。

8.0.1.4 談一談View的工作原理,執(zhí)行流程,MeasureSpec是什么?有什么作用?

View工作流程

View工作流程簡(jiǎn)單來(lái)說(shuō)就是,先measure測(cè)量,用于確定View的測(cè)量寬高,再 layout布局,用于確定View的最終寬高和四個(gè)頂點(diǎn)的位置,最后 draw繪制,用于將View 繪制到屏幕上。

ViewRoot對(duì)應(yīng)于ViewRootImpl類,它是連接WindowManager和DecorView的紐帶。

View的繪制流程是從ViewRoot和performTraversals開始。

performTraversals()依次調(diào)用performMeasure()、performLayout()和performDraw()三個(gè)方法,分別完成頂級(jí) View的繪制。

其中,performMeasure()會(huì)調(diào)用measure(),measure()中又調(diào)用onMeasure(),實(shí)現(xiàn)對(duì)其所有子元素的measure過(guò)程,這樣就完成了一次measure過(guò)程;接著子元素會(huì)重復(fù)父容器的measure過(guò)程,如此反復(fù)至完成整個(gè)View樹的遍歷。layout和draw同理。

MeasureSpec作用技術(shù)博客大總結(jié)

通過(guò)寬測(cè)量值widthMeasureSpec和高測(cè)量值heightMeasureSpec決定View的大小

MeasureSpec組成:一個(gè)32位int值,高2位代表SpecMode(測(cè)量模式),低30位代表SpecSize

直接繼承View的自定義View需要重寫onMeasure()并設(shè)置wrap_content時(shí)的自身大小,否則效果相當(dāng)于macth_parent

SpecMode有三類:

UNSPECIFIED 表示父容器不對(duì)View有任何限制,一般用于系統(tǒng)內(nèi)部,表示一種測(cè)量狀態(tài);

EXACTLY 父容器已經(jīng)檢測(cè)出view所需的精確大小,這時(shí)候view的最終大小SpecSize所指定的值,相當(dāng)于match_parent或指定具體數(shù)值。

AT_MOST 父容器指定一個(gè)可用大小即SpecSize,view的大小不能大于這個(gè)值,具體多大要看view的具體實(shí)現(xiàn),相當(dāng)于wrap_content。

8.0.1.6 SurfaceView和View的區(qū)別,說(shuō)一下SurfaceView的工作原理,為何不會(huì)導(dǎo)致頁(yè)面卡頓?

SurfaceView是從View基類中派生出來(lái)的顯示類,他和View的區(qū)別有:

View需要在UI線程對(duì)畫面進(jìn)行刷新,而SurfaceView可在子線程進(jìn)行頁(yè)面的刷新

View適用于主動(dòng)更新的情況,而SurfaceView適用于被動(dòng)更新,如頻繁刷新,這是因?yàn)槿绻褂肰iew頻繁刷新會(huì)阻塞主線程,導(dǎo)致界面卡頓技術(shù)博客大總結(jié)

SurfaceView在底層已實(shí)現(xiàn)雙緩沖機(jī)制,而View沒(méi)有,因此SurfaceView更適用于需要頻繁刷新、刷新時(shí)數(shù)據(jù)處理量很大的頁(yè)面

關(guān)于其他內(nèi)容介紹 01.關(guān)于博客匯總鏈接

1.技術(shù)博客匯總

2.開源項(xiàng)目匯總

3.生活博客匯總

4.喜馬拉雅音頻匯總

5.其他匯總

02.關(guān)于我的博客

我的個(gè)人站點(diǎn):www.yczbj.org, www.ycbjie.cn

github:https://github.com/yangchong211

知乎:https://www.zhihu.com/people/...

簡(jiǎn)書:http://www.jianshu.com/u/b7b2...

csdn:http://my.csdn.net/m0_37700275

喜馬拉雅聽書:http://www.ximalaya.com/zhubo...

開源中國(guó):https://my.oschina.net/zbj161...

泡在網(wǎng)上的日子:http://www.jcodecraeer.com/me...

郵箱:[email protected]

阿里云博客:https://yq.aliyun.com/users/a... 239.headeruserinfo.3.dT4bcV

segmentfault頭條:https://segmentfault.com/u/xi...

掘金:https://juejin.im/user/593943...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/73267.html

相關(guān)文章

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<