編輯:關於Android編程
package com.cn;
import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
/**
* Demo描述:
* Android事件傳遞基礎
*
* 背景知識:
* 事件的傳遞方向為:從最外層(Activity)傳遞至最內層(某個View)
* 事件的消費方向為:從最內層(某個View)傳遞至最外層(Activity)
*
*
*
* Demo構成:
* 1 一個普通的Activity中包含一個自定義Button.
* 2 覆寫Activity的dispatchTouchEvent和onTouchEvent
* 3 自定義Button中覆寫dispatchTouchEvent和onTouchEvent
* 兩者的返回值均為默認值(true).
* 4 在Activity中為自定義Button注冊TouchListener,
* 覆寫裡面的onTouch(),該方法默認返回false表示事件未消耗.
* 5 在Activity中為自定義Button注冊ClickListener,
*
*
* 點擊屏幕上的Button進行測試
*
*
* Touch事件的處理順序為:
* 1 Activity的dispatchTouchEvent()方法
* 如果它返回false表示不分發事件,則2,3,4不會執行
* 2 自定義Button的dispatchTouchEvent()方法
* 如果它返回false表示不分發事件,則3,4不會執行
* 3 Activity中自定義Button的TouchListener執行
* 如果它返回true表示事件已經消耗,則4不會執行
* 4 自定義Button的onTouchEvent()方法
* 如果它返回false(事件未被消費)即返回給自定義Button的dispatchTouchEvent()方法一個false.
* 所以自定義Button會中斷事件的分發,即每次只分發ACTION_DOWN事件,不分發ACTION_MOVE和ACTION_UP.
* 所以,每次自定義Button只會響應ACTION_DOWN,不會收到ACTION_MOVE和ACTION_UP.
* 也正因為這些事件沒有被消耗,所以事件會向上傳遞,於是Activity的onTouchEvent()方法
* 可以響應到一系列的ACTION_DOWN和ACTION_MOVE以及ACTION_UP.
* 如果它返回true(事件被消費),那麼事件就不會向上傳遞給Activity了.
* Activity自然也收到不到一系列的ACTION_DOWN和ACTION_MOVE以及ACTION_UP.
*
* 小結:
* (1) 每一次的ACTION_DOWN和ACTION_MOVE以及ACTION_UP都會引起每一層的dispatchTouchEvent()
* (2) 但是每一層的onTouchEvent()就不一定會執行了.比如下層已經消耗掉了事件,那麼上層就不會響應onTouchEvent()了.
*
* 5 自定義Button的ClickListener中的onClick()方法
*
*
* 小結:
* 1 因為自定義Button的onTouchEvent默認返回為true.
* 表示事件已經消耗,不會繼續向上層傳遞,所以Activity中的onTouchEvent方法不會調用
* 2 再次證明:
* View中onTouch()先於onTouchEvent()執行
* View中onTouchEvent()先於onClick()執行,或者說在onTouchEvent()中調用了onClick()
* 3 1和2代表的是:事件的傳遞方向-->從最外層(Activity)傳遞至最內層(某個View)
*
*
*
*
*
* 常量對應:
* ACTION_DOWN----->0
* ACTION_UP------->1
* ACTION_MOVE----->2
*
* 參考資料:
www.2cto.com
* Thank you very much
*
*/
public class MainActivity extends Activity {
private EventButton mEventButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
init();
}
private void init(){
mEventButton=(EventButton) findViewById(R.id.button);
mEventButton.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
System.out.println(---> 按鈕的OnTouchListener +event.getAction());
return false;
}
});
mEventButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
System.out.println(---> 按鈕的OnClickListener 點擊了Button);
}
});
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
System.out.println(---> Activity dispatchTouchEvent +ev.getAction()+ , it defaulst is true);
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
System.out.println(---> Activity onTouchEvent +event.getAction()+ , it defaulst is false);
return super.onTouchEvent(event);
}
}
package com.cn;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.Button;
public class EventButton extends Button {
public EventButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
System.out.println(---> 按鈕 dispatchTouchEvent , it defaulst is true);
return super.dispatchTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
System.out.println(---> 按鈕 onTouchEvent , it defaulst is true);
return super.onTouchEvent(event);
//return false;
}
}
上一篇/kf/201412/365603.html
android自定義進度值可拖動的seekbar
最近忙找實習,加上實驗室在推新項目,需要學習新知識。所以很長一段時間沒去整理了官博客了,github也蠻久沒更新,很慚愧。接下來還是要堅持寫。今天就簡單的寫一下我在項目中
淺談Android App開發中Fragment的創建與生命周期
Fragment是activity的界面中的一部分或一種行為。你可以把多個Fragment們組合到一個activity中來創建一個多面界面並且你可以在多個activity
詳解Android中weight的使用方法
android中對weight的學習可以說是必須的,如果UI布局僅僅使用dp與sp等等,會讓布局顯得極度不靈活,畢竟各個手機屏幕大小不同,更別說是還有ipad之類的了,所
初識Android進程間通信之----Binder機制
前言前面兩篇博客分別介紹了Android進程間通信之AIDL的使用,以及使用AIDL傳遞復雜對象以及Bitmap對象。所謂AIDL:Android Interface D