編輯:關於Android編程
一基礎知識
android的事件處理分為3步。
1)public booleandispatchTouchEvent(MotionEvent ev) 這個方法用來分發TouchEvent
2)public boolean onInterceptTouchEvent(MotionEvent ev) 這個方法用來攔截TouchEvent
3)public boolean onTouchEvent(MotionEvent ev) 這個方法用來處理TouchEvent
二事件探析
場景:本想實現ttdt那種滑動頁面結束activity的效果,摸索了好久終於實現,流暢效果很滿意,但是activity布局上添加其他控件,比如giriView\listView等,會出現等層自己寫的那個View獲取不到焦點,導致滑動事件失效。
分析:當在頂層View上加其他View,默認情況都是頂層的事件要傳給最上面的view處理,導致為處理情況下,我做的效果失效了;
下圖為一個正常的View點擊效果圖:
<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHByZSBjbGFzcz0="brush:java;">1、ViewGroup3的dispatchTouchEvent()方法會被調用。
2、ViewGroup3調用ViewGroup2的dispatchTouchEvent()方法。
3、ViewGroup2調用ViewGroup1的dispatchTouchEvent()方法。
4、ViewGroup1會調用View1的dispatchTouchEvent()方法。
5、View1的dispatchTouchEvent()方法調用自己的onTouchEvent()方法。在onTouchEvent方法中處理點擊事件。處理完了後會返回一個true給調用它的dispatchTouchEvent()方法。
6、ViewGroup1的dispatchTouchEvent()方法會返回一個true值給ViewGroup2的dispatchTouchEvent()方法。這樣一直將則個true值返回到ViewGroup3的dispatchTouchEvent()方法。ViewGroup3在將這個值返回給調用它的方法。這樣一個事件分發過程結束。
三問題解決
想到這裡,基本上我們就可以利用View的分發攔截機制,將我們需要的Event攔截,不需要的轉發。
在自己寫的view重寫onInterceptTouchEvent()在裡面做下操作:
@Override public boolean onInterceptTouchEvent(MotionEvent ev) { // TODO Auto-generated method stub switch (ev.getAction()) { case MotionEvent.ACTION_MOVE: mLastDownX = (int) ev.getX(); System.err.println("ACTION_DOWN=" + mLastDownX); return true; } return super.onInterceptTouchEvent(ev); }
四驗證效果
運行程序,看效果,完美實現,流暢滑動,可以達到ttdt效果!
介紹 做項目到一定龐大的時候就會發現方法數太多,安裝包根本就裝不上去了,這個也不足為奇,我們都知道當方法數目超過65536這個數目限制的時候,擋在2.x的系統上面就會出現
在閻宏博士的《JAVA與模式》一書中開頭是這樣描述狀態(State)模式的: 狀態模式,又稱狀態對象模式(Pattern of Objects for States)
方案一:PreLollipopTransition首先在 build.gradle 配置文件添加這個庫依賴dependencies { compile
與Service相似,在android中還有一種運行在後台的4大組件之一,他就是broadCcast,但是他不用考慮是否有接受的對象,只需要考慮發送即可。