當前位置:首頁 » 安卓系統 » android事件分發

android事件分發

發布時間: 2022-01-24 23:22:57

① 面試怎麼回到android 事件分發

自己去看一下事件分發和View的繪制唄,這些都是基礎。可以去看《Android開發藝術探索》從源碼角度分析,或者郭霖、鴻洋大神的csdn博客。

② android中事件分發ontouch跟ontouchevent的區別

可以看這里——
http://blog.csdn.net/huiguixian/article/details/22193977

③ android 事件分發用在哪

decorView是window中的最頂層view,如果在不幹預子控制項的touch或click事件的前提下捕捉touch事件,建議重寫antivity中dispatchTouchEvent(event)方法(保留其中的super.dispatchTouchEvent),然後對event進行處理。 建議網上搜索「android觸摸事件的分發機制」,先進行具體的了解。

④ android事件分發機制怎麼寫

ViewGroup就是一組View的集合,它包含很多的子View和子VewGroup,是Android中所有布局的父類或間接父類,像LinearLayout、RelativeLayout等都是繼承自ViewGroup的。
但ViewGroup實際上也是一個View,只不過比起View,它多了可以包含子View和定義布局參數的功能。

⑤ android 事件分發方法怎麼走

當一個Touch事件(觸摸事件為例)到達根節點,即Acitivty的ViewGroup時,它會依次下發,下發的過程是調用子View(ViewGroup)的dispatchTouchEvent方法實現的。簡單來說,就是ViewGroup遍歷它包含著的子View,調用每個View的dispatchTouchEvent方法,而當子View為ViewGroup時,又會通過調用ViwGroup的dispatchTouchEvent方法繼續調用其內部的View的dispatchTouchEvent方法。上述例子中的消息下發順序是這樣的:①-②-⑤-⑥-⑦-③-④。dispatchTouchEvent方法只負責事件的分發,它擁有boolean類型的返回值,當返回為true時,順序下發會中斷。在上述例子中如果⑤的dispatchTouchEvent返回結果為true,那麼⑥-⑦-③-④將都接收不到本次Touch事件。來個簡單版的代碼加深理解:

/**
* ViewGroup
* @param ev
* @return
*/
public boolean dispatchTouchEvent(MotionEvent ev){
....//其他處理,在此不管
View[] views=getChildView();
for(int i=0;i<views.length;i++){
//判斷下Touch到屏幕上的點在該子View上面
if(...){
if(views[i].dispatchTouchEvent(ev))
return true;
}
}
...//其他處理,在此不管
}
/**
* View
* @param ev
* @return
*/
public boolean dispatchTouchEvent(MotionEvent ev){
....//其他處理,在此不管
return false;
}

⑥ android怎麼主動分發事件

Android中,所有的操作類型事件都由如下三個部分作為基礎:


按下(ACTION_DOWN)

移動(ACTION_MOVE)

抬起(ACTION_UP)

這三部分都寄生於onTouch事件中,由MontionEvent類中定義的三個常量進行區分。


Android中與Touch事件相關的方法為:

removeTapCallback();
removeLongPressCallback();
break;

case MotionEvent.ACTION_MOVE:
final int x = (int) event.getX();
final int y = (int) event.getY();

// Be lenient about moving outside of buttons
if (!pointInView(x, y, mTouchSlop)) {
// Outside button
removeTapCallback();
if ((mPrivateFlags & PFLAG_PRESSED) != 0) {
// Remove any future long press/tap checks
removeLongPressCallback();

setPressed(false);
}
}
break;
}
return true;
}

return false;
}

⑦ Android事件分發機制是怎麼判斷手勢類型,並決定分發給哪個view的

可以參考如下內容:
dispatchTouchEvent -> onTouch -> onTouchEvent
等上述的up事件分發完結後,再調用onClick
看起來一目瞭然,事實上,我只是用了默認的調用,在TextView的dispatchTouchEvent和onTouchEvent都是讓它返回super.xxx。而且在onTouch監聽里返回的是false。
所以,實際的情況更多,基於此,為了更清晰地熟悉事件分發機制,我們只能通過看源碼了。
源碼分析
我目前查看的源碼是API 22環境下的。這部分關於View的事件分發的源碼和之前的有很大的區別,但是,萬變不如其中,有些根本的邏輯流程一般是不會改變的。
我們直接看View的代碼,因為控制項都繼承自View。

⑧ android事件分發機制 什麼意思

android事件分發機制 就是一個觸摸事件發生了,從一個窗口傳遞到一個視圖,再傳遞到另外一個視圖,最後被消費的過程,在android中還是比較復雜的傳遞流程如下:

(1) 事件從Activity.dispatchTouchEvent()開始傳遞,只要沒有被停止或攔截,從最上層的View(ViewGroup)開始一直往下(子View)傳遞。子View可以通過onTouchEvent()對事件進行處理。

(2) 事件由父View(ViewGroup)傳遞給子View,ViewGroup可以通過onInterceptTouchEvent()對事件做攔截,停止其往下傳遞。

(3) 如果事件從上往下傳遞過程中一直沒有被停止,且最底層子View沒有消費事件,事件會反嚮往上傳遞,這時父View(ViewGroup)可以進行消費,如果還是沒有被消費的話,最後會到Activity的onTouchEvent()函數。

(4) 如果View沒有對ACTION_DOWN進行消費,之後的其他事件不會傳遞過來。

(5) OnTouchListener優先於onTouchEvent()對事件進行消費。

上面的消費即表示相應函數返回值為true。

⑨ android事件分發中 怎麼確定點擊自己想點擊的界面

android監聽事件添加動作的三種方式:
第一種也是最開始就接觸的方式,通常在activity組件的oncreate事件中直接定義,直接動作。這種方式每個控制項都定義一次,通常不方便.
Button btn = (Button) findViewById(R.id.myButton);

btn .setOnClickListener(new View.OnClickListener() {

public void onClick(View v) {

//do something

}

});
第二種通常是在activity組件實現其介面,這樣可以多外控制項共享一個介面,這樣相對方便
public class TestMedia extends Activity implements View.OnClickListener{

Button btn1 = (Button) findViewById(R.id.myButton1);
Button btn2 = (Button) findViewById(R.id.myButton2);

btn1 .setOnClickListener();
btn2 .setOnClickListener();

}

public void onClick(View v) {

switch (v.getId()) {

case R.id. myButton1:

//do something

break;

case R.id. myButton2:

//do something

break;

}

第三種類似第二種,這樣的好處在於如果需要實現多個監聽介面,這樣更清晰

public class TestMedia extends Activity {

Button btn1 = (Button) findViewById(R.id.myButton1);
Button btn2 = (Button) findViewById(R.id.myButton2);

btn1 .setOnClickListener(new ClickEvent());

btn2 .setOnClickListener(new ClickEvent());

}
class ClickEvent implements View.OnClickListener

public void onClick(View v) {

switch (v.getId()) {

case R.id. myButton1:

//do something

break;

case R.id. myButton2:

//do something

break;

}

⑩ android 事件分發中 為什麼down事件不消費 後續事件也得不到消費

事件都是從dispatchTouchEvent開始的, 如果down事件不消費, 那麼在dispatchTouchEvent源碼中的mFirstTouchTarget就是空的. mFirstTouchTarget這個變數是記錄消費down事件的. 沒有消費down 那麼mFirstTouchTarget就是空. 其他事件進入dispatchTouchEvent後 會先判斷mFirstTouchTarget為空, 就判定事件被攔截了. 就不會繼續事件分發了. 也不會去執行onTouchEvent方法了.
至於Android這樣設計的道理? 因為如果down事件不接受, 就默認其他事件也不要了. 這也是為了提高性能, 畢竟move是一大串的. 如果不在down中這樣設計. 每個move都去判斷, 勢必會影響觸摸響應性能.

熱點內容
吃雞配置太低怎麼調高畫質 發布:2024-11-15 19:58:19 瀏覽:734
王者怎麼設置來電屏蔽安卓 發布:2024-11-15 19:56:08 瀏覽:449
伺服器如何搭建多個ip 發布:2024-11-15 19:42:10 瀏覽:102
價錢低高配置的有哪些車 發布:2024-11-15 19:34:53 瀏覽:380
androidgps定位開發 發布:2024-11-15 19:34:52 瀏覽:334
如何掃碼添加伺服器地址 發布:2024-11-15 19:31:48 瀏覽:278
sql語句復制資料庫 發布:2024-11-15 19:28:02 瀏覽:837
演算法的薪資 發布:2024-11-15 19:15:22 瀏覽:322
ubuntu可以重新編譯嗎 發布:2024-11-15 19:09:10 瀏覽:649
access資料庫表的創建 發布:2024-11-15 18:51:18 瀏覽:141