編輯:關於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
最近忙找實習,加上實驗室在推新項目,需要學習新知識。所以很長一段時間沒去整理了官博客了,github也蠻久沒更新,很慚愧。接下來還是要堅持寫。今天就簡單的寫一下我在項目中
Fragment是activity的界面中的一部分或一種行為。你可以把多個Fragment們組合到一個activity中來創建一個多面界面並且你可以在多個activity
android中對weight的學習可以說是必須的,如果UI布局僅僅使用dp與sp等等,會讓布局顯得極度不靈活,畢竟各個手機屏幕大小不同,更別說是還有ipad之類的了,所
前言前面兩篇博客分別介紹了Android進程間通信之AIDL的使用,以及使用AIDL傳遞復雜對象以及Bitmap對象。所謂AIDL:Android Interface D