1:View的事件響應機制(控件:如TextView,ImageView,Button等)
成都創(chuàng)新互聯(lián)公司專注于中大型企業(yè)的成都網(wǎng)站設計、做網(wǎng)站和網(wǎng)站改版、網(wǎng)站營銷服務,追求商業(yè)策劃與數(shù)據(jù)分析、創(chuàng)意藝術(shù)與技術(shù)開發(fā)的融合,累計客戶上千,服務滿意度達97%。幫助廣大客戶順利對接上互聯(lián)網(wǎng)浪潮,準確優(yōu)選出符合自己需要的互聯(lián)網(wǎng)運用,我們將一直專注品牌網(wǎng)站建設和互聯(lián)網(wǎng)程序開發(fā),在前進的路上,與客戶一起成長!
在執(zhí)行onTouchListener方法時候,(view這里代表為控件)
view.setOnTouchListener (new OnTouchListener() {
@Override
public boolean onTouch( View v, MotionEvent event) {
return false ;
}
});
事件分發(fā)的時候會執(zhí)行publicboolean dispatchTouchEvent(MotionEvent event)
a:先進行if判斷
if (li != null && li .mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED
&& li .mOnTouchListener .onTouch (this, event)) {
return true ;
}
return onTouchEvent(event) ;
li就是OnTouchListener的實現(xiàn)類,不為null,第二個條件判斷控件是否可用,一般恒成立,主要就看第三個條件了。
return true:就代表響應所有事件。
return false:就會執(zhí)行onTouchEvent方法了。
b:setOnTouchListener方法返回了false
在onTouchEvent方法中,如果控件具備點擊事件,在action_up中回調(diào)執(zhí)行onClick的點擊事件,并且返回true,響應所有事件。如果控件不具備點擊事件,就會返回false,也進入不了switch中。
2:ViewGroup的事件響應機制
ViewGroup的事件響應機制主要分為2部分:1:ViewGroup攔截了事件,2:ViewGroup沒有攔截事件
/*
* return true 攔截了事件
* return false 沒有攔截事件,往內(nèi)部傳遞
*/
@Override
public boolean onInterceptTouchEvent( MotionEvent ev) {
return true ;
}
1:攔截了事件:
那么ViewGroup就會去處理事件,在源碼中最后還是調(diào)用View的dispatchTouchEvent方法,由其決定是否響應,onTouchEventListener中return了true,就響應了事件,return了false,那么就去判斷當前控件(布局)是不是可以被點擊,測試了一次ListView,ListView點擊的時候響應了事件。ListView無論是不是中斷,都會由View的dispatchTouchEvent方法決定,ListView可以被點擊。
2:沒有攔截事件:
最外層的ViewGroup先捕獲到事件,計算出點擊的位置,遍歷自己的孩子,傳遞給對應的ViewGroup,然后第二層是不是攔截?。坎粩r截,繼續(xù)遍歷,找到具體點擊的地方的控件view。
控件view會去通過View的dispatchTouchEvent方法的返回值判斷是不是響應了點擊事件,return true;響應了,那么結(jié)束了。如果return false;了沒有響應,那么事件會向回傳遞,自己的父親回去嘗試響應了。同樣,通過dispatchTouchEvent來進行決定是不是響應了事件。
示例代碼:
1:攔截事件
自定義控件
public class MyLinearLayout extends LinearLayout {
public MyLinearLayout (Context context , AttributeSet attrs ) {
super(context , attrs );
}
@Override
public boolean onInterceptTouchEvent( MotionEvent ev) {
return true ;
}
}
MainActivity
public class MainActivity extends Activity {
private LinearLayout my_ll;
private Button button;
private TextView textView;
@Override
protected void onCreate( Bundle savedInstanceState) {
super.onCreate (savedInstanceState );
setContentView (R .layout .activity_main);
my_ll = (LinearLayout ) findViewById (R .id .my_ll);
button = (Button ) findViewById (R .id .button);
textView = (TextView ) findViewById (R .id .text);
my_ll. setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch( View v, MotionEvent event) {
System .out.println( "Linearlayout:"+event .getAction ());
return true ;
}
});
textView. setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch( View v, MotionEvent event) {
System .out.println( "TextView:"+event .getAction ());
return false ;
}
});
button. setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch( View v, MotionEvent event) {
System .out.println( "Button:"+event .getAction ());
return false ;
}
});
// my_ll.setOnClickListener(new OnClickListener() {
//
// @Override
// public void onClick(View v) {
// System.out.println(" Linearlayout");
// }
// });
}
}
分析:my_ll不再向里面的Button和TextView傳遞了,自己處理,自己在my_ll.setOnTouchListener中返回了false,my_ll又不具備點擊事件,當然就只能打印出LineraLayout::0了,如果我們給其設置了點擊事件,那么當然會打印出down,up,click三者了。my_ll.setOnTouchListener中返回了true,自己也進行了處理,不過就只能打印出down,up了。
2:不攔截事件
分析:點擊button,響應了事件,其可以點擊,肯定會響應。點擊TextView時候,其默認沒有點擊事件,只能打印down了,然后不響應,往回傳遞,my_ll去響應,my_ll又會通過View的dispatchTouchEvent去處理了。我們這里在my_ll.setOnTouchListener中返回了true的話,肯定會打印如下:TextView的down,MyLinearlayout的down,up了。
文章名稱:Android的事件響應機制
網(wǎng)站網(wǎng)址:http://jinyejixie.com/article14/ijjide.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、網(wǎng)站收錄、建站公司、網(wǎng)站內(nèi)鏈、網(wǎng)站建設、網(wǎng)站導航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)