国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

08.Android之View事件問題

lavnFan / 1253人閱讀

摘要:內部是調用效果是移動的內容,因此需要在的父控件中調用。和的情況相似,手機屏幕向下移動,為正值手機屏幕向上移動,為負值。

目錄介紹

8.0.0.1 簡述Android的事件分發機制?dispatchTouchEvent方法的作用是什么?說下View和ViewGroup分發事件?

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

8.0.0.4 滑動沖突有哪些場景?滑動沖突處理原則是什么?滑動沖突解決辦法有哪些?分別是如何解決的?

8.0.0.5 onTouch()、onTouchEvent()和onClick()關系是怎樣的,哪一個先執行?如果設置了onClickListener, 但是onClick()沒有調用,可能產生的原因?

8.0.0.6 View滑動有哪些方法?這些方法分別是如何實現滑動的?分別有什么優缺點?

8.0.0.7 事件的傳遞規則是什么?View處理事件的優先級?點擊事件傳遞過程遵循如下順序?事件傳遞規則要點?

8.0.0.8 Scroller的作用?Scroller的要點有哪些?Scroller的使用步驟?Scroller工作原理?

8.0.0.9 Activity事件分發的過程?Window事件分發?DecorView的事件分發?根View的事件分發?

8.0.1.0 GestureDetector是干什么用的?GestureDetector作用和注意點?有哪些常用的監聽方法?

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

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

8.0.1.6 SurfaceView和View的區別,說一下SurfaceView的工作原理,為何不會導致頁面卡頓?

好消息

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

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

如果覺得好,可以star一下,謝謝!當然也歡迎提出建議,萬事起于忽微,量變引起質變!

8.0.0.1 簡述Android的事件分發機制?dispatchTouchEvent方法的作用是什么?說下View和ViewGroup分發事件?

簡述Android的事件分發機制?技術博客大總結

事件分發順序:Activty->ViewGroup->View

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

1.父View調用dispatchTouchEvent開啟事件分發。

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

3.如果父View進行攔截,父View調用onTouchEvent進行處理。

4.如果父View不進行攔截,會調用子View的dispatchTouchEvent進行事件的層層分發。

dispatchTouchEvent方法的作用是什么?

用于進行事件的分發

只要事件傳給當前View,該方法一定會被調用

返回結果受到當前View的onTouchEvent和下級View的dispatchTouchEvent影響

表示是否消耗當前事件

ViewGroup事件分發偽代碼

View事件分發偽代碼

View和ViewGroup在dispatchTouchEvent上的區別

ViewGroup在dispatchTouchEvent()中會進行事件的分發。

View在dispatchTouchEvent()中會對該事件進行處理。技術博客大總結

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

onInterceptTouchEvent方法作用是什么?

在dispatchTouchEvent的內部調用,用于判斷是否攔截某個事件

View和ViewGroup在onInterceptTouchEvent上的區別:

View沒有該方法,View會處理所有收到的事件,但不一定會消耗該事件。

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

onTouchEvent的方法的作用是什么?技術博客大總結

在dispatchTouchEvent的中調用,用于處理點擊事件

返回結果表示是否消耗當前事件

8.0.0.4 滑動沖突有哪些場景?滑動沖突處理原則是什么?滑動沖突解決辦法有哪些?分別是如何解決的?

滑動沖突有哪些場景?

內層和外層滑動方向不一致:一個垂直,一個水平。比如輪播圖ViewPager和ScrollView

內存和外層滑動方向一致:均垂直or水平。比如scrollView和RecyclerView

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

滑動沖突處理原則

對于內外層滑動方向不同,只需要根據滑動方向來給相應控件攔截

對于內外層滑動方向相同,需要根據業務來進行事件攔截,規定何時讓外部View攔截事件何時由內部View攔截事件。

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

滑動沖突解決辦法有哪些?技術博客大總結

外部攔截法:指點擊事件都先經過父容器的攔截處理,如果父容器需要此事件就攔截,否則就不攔截。具體方法:需要重寫父容器的onInterceptTouchEvent方法,在內部做出相應的攔截。

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

外部攔截解決滑動沖突法

外部攔截法要點

父容器的onInterceptTouchEvent方法中處理

ACTION_DOWN不攔截,一旦攔截會導致后續事件都直接交給父容器處理。

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

ACTION_UP不攔截,如果父控件攔截UP,會導致子元素接收不到UP進一步會讓onClick方法無法觸發。此外UP攔截也沒什么用。

onClick方法生效的兩個條件?

View可以點擊

接收到了DOWN和UP事件

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

8.0.0.5 onTouch()、onTouchEvent()和onClick()關系是怎樣的,哪一個先執行?如果設置了onClickListener, 但是onClick()沒有調用,可能產生的原因?

onTouch()、onTouchEvent()和onClick()關系是怎樣的,哪一個先執行?

onTouch->onTouchEvent->onClick

當一個View需要處理事件時,如果它設置了OnTouchListener,那么OnTouchListener的onTouch方法會被回調。

這時事件如何處理還得看onTouch的返回值,如果返回false,則當前View的onTouchEvent方法會被調用;如果返回true,那么onTouchEvent方法將不會被調用。由此可見,給View設置的onTouchListener,其優先級比onTouchEvent要高。

如果當前方法中設置了onClickListener,那么它的onClick方法會被調用。可以看出,常用的OnClickListener,其優先級別最低。

如果設置了onClickListener, 但是onClick()沒有調用,可能產生的原因? 技術博客大總結

父View攔截了事件,沒有傳遞到當前View

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

View的Clickable = false(setClickablesetLongClickable(false)):view不可以點擊,不會執行onClick

View設置了onTouchListener,且消耗了事件。會提前返回。

View設置了TouchDelegate,且消耗了事件。會提前返回。

8.0.0.6 View滑動有哪些方法?這些方法分別是如何實現滑動的?分別有什么優缺點?

View滑動有哪些方法?

layout:對View進行重新布局定位。在onTouchEvent()方法中獲得控件滑動前后的偏移。然后通過layout方法重新設置。

offsetLeftAndRight和offsetTopAndBottom:系統提供上下/左右同時偏移的API。onTouchEvent()中調用

LayoutParams: 更改自身布局參數

scrollTo/scrollBy: 本質是移動View的內容,需要通過父容器的該方法來滑動當前View

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

屬性動畫: 動畫對View進行滑動技術博客大總結

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

Layout實現滑動

offsetLeftAndRight和offsetTopAndBottom實現滑動

LayoutParams實現滑動

通過父控件設置View在父控件的位置,但需要指定父布局的類型,不好

用ViewGroup的MariginLayoutParams的方法去設置margin

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

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

scrollToscrollBy實現滑動

都是View提供的方法。

scrollTo-直接到新的x,y坐標處。

scrollBy-基于當前位置的相對滑動。

scrollBy-內部是調用scrollTo.

scrollToscrollBy, 效果是移動View的內容,因此需要在View的父控件中調用。

scrollTo/By內部的mScrollX和mScrollY的意義

mScrollX的值,相當于手機屏幕相對于View左邊緣向右移動的距離,手機屏幕向右移動時,mScrollX的值為正;手機屏幕向左移動(等價于View向右移動),mScrollX的值為負。

mScrollY和X的情況相似,手機屏幕向下移動,mScrollY為+正值;手機屏幕向上移動,mScrollY為-負值。

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

動畫實現滑動的方法

可以通過傳統動畫或者屬性動畫的方式實現

傳統動畫需要通過設置fillAfter為true來保留動畫后的狀態(但是無法在動畫后的位置進行點擊操作,這方面還是屬性動畫好)

屬性動畫會保留動畫后的狀態,能夠點擊。技術博客大總結

ViewDragHelper

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

8.0.0.7 事件的傳遞規則是什么?View處理事件的優先級?點擊事件傳遞過程遵循如下順序?事件傳遞規則要點?

事件的傳遞規則是什么?

點擊事件產生后,會先傳遞給根ViewGroup,并調用dispatchTouchEvent

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

如果不攔截,則當前事件會傳遞給子元素,調用子元素的dispatchTouchEvent,如此反復直到事件被處理

View處理事件的優先級?

在View需要處理事件時,會先調用OnTouchListener的onTouch方法,并判斷onTouch的返回值

返回true,表示處理完成,不會調用onTouchEvent方法

返回false,表示未完成,調用onTouchEvent方法進行處理

可見,onTouchEvent的優先級沒有OnTouchListener高

onTouchEvent沒有消耗的話就會交給TouchDelegate的onTouchEvent去處理。

如果最后事件都沒有消耗,會在onTouchEvent中執行performClick()方法,內部會執行OnClickListener的onClick方法,優先級最低,屬于事件傳遞尾端

點擊事件傳遞過程遵循如下順序?技術博客大總結

Activity->Window->View->分發

如果View的onTouchEvent返回false,則父容器的onTouchEvent會被調用,最終可以傳遞到Activity的onTouchEvent

事件傳遞規則要點?

View一旦攔截事件,則整個事件序列都由它處理(ACTION_DOWNUP等),onInterceptTouchEvent不會再調用(因為默認都攔截了)

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

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

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

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

View沒有onInterceptTouchEvent方法,一旦有事件傳遞給View,onTouchEvent就會被調用

View的onTouchEvent默認都會消耗事件return true, 除非該View不可點擊(clickable和longClickable同時為false)

View的enable屬性不影響onTouchEvent的默認返回值。即使是disable狀態。

onClick的發生前提是當前View可點擊,并且收到了down和up事件

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

8.0.0.8 Scroller的作用?Scroller的要點有哪些?Scroller的使用步驟?Scroller工作原理?

Scroller的作用?

用于封裝滑動

提供了基于時間的滑動偏移值,但是實際滑動需要我們去負責。

Scroller的要點有哪些?

調用startScroll方法時,Scroller只是單純的保存參數

之后的invalidate方法導致的View重繪

View重繪之后draw方法會調用自己實現的computeScroll(),才真正實現了滑動

Scroller的使用步驟?

Scroller工作原理?技術博客大總結

Scroller本身不能實現View的滑動,需要配合View的computeScroll方法實現彈性滑動

不斷讓View重繪,每一次重繪距離滑動的開始時間有一個時間間隔,通過該時間可以得到View當前的滑動距離

View的每次重繪都會導致View的小幅滑動,多次小幅滑動就組成了彈性滑動

8.0.0.9 Activity事件分發的過程?Window事件分發?DecorView的事件分發?根View的事件分發?

Activity事件分發的過程?

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

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

返回true:事件全部結束

返回false:所有View都沒有處理(onTouchEvent返回false),則調用Activity的onTouchEvent

Window事件分發?

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

Window的實現類是PhoneWindow

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

DecorView的事件分發?

DecorView繼承自FrameLayout

DecorView的superDispatchTouchEvent()會調用super.dispatchTouchEvent()——也就是ViewGroup的dispatchTouchEvent方法,之后就會層層分發下去。

根View的事件分發?技術博客大總結

頂層View調用dispatchTouchEvent

調用onInterceptTouchEvent方法

返回true,事件由當前View處理。如果有onTouchiListener,會執行onTouch,并且屏蔽掉onTouchEvent。沒有則執行onTouchEvent。如果設置了onClickListener,會在onTouchEvent后執行onClickListener

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

8.0.1.0 GestureDetector是干什么用的?GestureDetector作用和注意點?有哪些常用的監聽方法?

GestureDetector作用和注意點?

探測手勢和事件,需要通過提供的MotionEvent

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

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

可以在View的setOnTouchListener的onTouch中將點擊事件交給GestureDetector接管。

有哪些常用的監聽方法?

OnGestureListener

OnDoubleTapListener

OnContextClickListener

SimpleOnGestureListener

OnGestureListener

OnGestureListener作用技術博客大總結

用于在手勢產生時,去通知監聽者。

該監聽器會監聽所有的手勢,如果只需要監聽一部分可以使用SimpleOnGestureListener

OnGestureListener能監聽哪些手勢

按下操作。

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

抬起操作。

滑動操作(由Down MotionEvent e1觸發,當前是Move MotionEvent e2)

長按操作。

猛扔操作。

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

OnDoubleTapListener

OnDoubleTapListener作用

監聽“雙擊操作”

監聽“確認的單擊操作”—該單擊操作之后的操作無法構成一次雙擊。

OnDoubleTapListener能監聽哪些手勢?

單擊操作。

雙擊操作.

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

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

View的滑動方式?

三種方式:

a. 通過View本身提供的scrollTo/scrollBy方法

移動的是View的內容,View本身不移動

b. 通過動畫給View施加平移效果實現滑動

通過補間動畫移動的View的影像,View本身位置不發生改變。通過屬性動畫移動view的影像,view本身位置會發生改變。

c. 通過改變View的LayoutParams使View重新布局實現滑動

改變布局參數,代碼如下:

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

三種方法的使用對比

scrollTo/scrollBy:操作簡單,適合對View內容的滑動;

動畫:操作簡單,主要適合于沒有交互的View和實現復雜的動畫效果;

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

scrollTo()和scrollBy()技術博客大總結

scrollBy內部調用了scrollTo,它是基于當前位置的相對滑動;而scrollTo是絕對滑動,因此如果利用相同輸入參數多次調用scrollTo()方法,由于View初始位置是不變只會出現一次View滾動的效果而不是多次。

引申:兩者都只能對view內容進行滑動,而不能使view本身滑動,且非平滑,可使用Scroller有過渡滑動的效果。

Scroller實現滑動的具體過程:

在MotionEvent.ACTION_UP事件觸發時調用startScroll()方法,該方法并沒有進行實際的滑動操作,而是記錄滑動相關量

馬上調用invalidate/postInvalidate()方法,請求View重繪,導致View.draw方法被執行

緊接著會調用View.computeScroll()方法,此方法是空實現,需要自己處理邏輯。具體邏輯是:先判斷computeScrollOffset(),若為true(表示滾動未結束),則執行scrollTo()方法,它會再次調用postInvalidate(),如此反復執行,直到返回值為false。

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

View工作流程

View工作流程簡單來說就是,先measure測量,用于確定View的測量寬高,再 layout布局,用于確定View的最終寬高和四個頂點的位置,最后 draw繪制,用于將View 繪制到屏幕上。

ViewRoot對應于ViewRootImpl類,它是連接WindowManager和DecorView的紐帶。

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

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

其中,performMeasure()會調用measure(),measure()中又調用onMeasure(),實現對其所有子元素的measure過程,這樣就完成了一次measure過程;接著子元素會重復父容器的measure過程,如此反復至完成整個View樹的遍歷。layout和draw同理。

MeasureSpec作用技術博客大總結

通過寬測量值widthMeasureSpec和高測量值heightMeasureSpec決定View的大小

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

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

SpecMode有三類:

UNSPECIFIED 表示父容器不對View有任何限制,一般用于系統內部,表示一種測量狀態;

EXACTLY 父容器已經檢測出view所需的精確大小,這時候view的最終大小SpecSize所指定的值,相當于match_parent或指定具體數值。

AT_MOST 父容器指定一個可用大小即SpecSize,view的大小不能大于這個值,具體多大要看view的具體實現,相當于wrap_content。

8.0.1.6 SurfaceView和View的區別,說一下SurfaceView的工作原理,為何不會導致頁面卡頓?

SurfaceView是從View基類中派生出來的顯示類,他和View的區別有:

View需要在UI線程對畫面進行刷新,而SurfaceView可在子線程進行頁面的刷新

View適用于主動更新的情況,而SurfaceView適用于被動更新,如頻繁刷新,這是因為如果使用View頻繁刷新會阻塞主線程,導致界面卡頓技術博客大總結

SurfaceView在底層已實現雙緩沖機制,而View沒有,因此SurfaceView更適用于需要頻繁刷新、刷新時數據處理量很大的頁面

關于其他內容介紹 01.關于博客匯總鏈接

1.技術博客匯總

2.開源項目匯總

3.生活博客匯總

4.喜馬拉雅音頻匯總

5.其他匯總

02.關于我的博客

我的個人站點:www.yczbj.org, www.ycbjie.cn

github:https://github.com/yangchong211

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

簡書:http://www.jianshu.com/u/b7b2...

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

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

開源中國:https://my.oschina.net/zbj161...

泡在網上的日子:http://www.jcodecraeer.com/me...

郵箱:yangchong211@163.com

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

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

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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/73267.html

相關文章

發表評論

0條評論

lavnFan

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<