編輯:關於Android編程
上一篇文章主要講述了Android的TouchEvent的分發過程,其中有兩個重要的函數:onInterceptTouchEvent和onTouchEvent,這兩個函數可被重裝以完成特定的邏輯。onInterceptTouchEvent的定義為於ViewGroup中,默認返回值為false,表示不攔截TouchEvent。onTouchEvent的定義位於View中,當ViewGroup要調用onTouchEvent時,會利用super.onTouchEvent。ViewGroup調用onTouchEvent默認返回false,表示不消耗touch事件,View調用onTouchEvent默認返回true,表示消耗了touch事件。考慮到onInterceptTouchEvent與onTouchEven在寫UI的時候經常會用到,下面以一個例子來講解一下。
先創建一個類MyView,繼承自View
public class MyView extends Button { private static final String TAG = MyView.class.getName(); public MyView(Context context){ super(context); } public MyView(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean onTouchEvent(MotionEvent event) { Log.d(TAG, "onTouchEvent."); LogUtil.logAction(event, TAG); return super.onTouchEvent(event); } }
public class MyLayout extends FrameLayout{ private static final String TAG = MyLayout.class.getName(); public MyLayout(Context context) { super(context); } public MyLayout(Context context, AttributeSet attributeSet) { super(context, attributeSet); } @Override public boolean onInterceptTouchEvent(MotionEvent ev) { Log.d(TAG, "onInterceptTouchEvent"); return super.onInterceptTouchEvent(ev); } @Override public boolean onTouchEvent(MotionEvent event) { Log.d(TAG, "onTouchEvent."); LogUtil.logAction(event, TAG); return super.onTouchEvent(event); } }LogUtil.logAction()函數是用來打印MotionEvent的動作類型,代碼如下:
public class LogUtil { public static void logAction(MotionEvent event, final String tag) { int action = event.getAction(); switch(action) { case MotionEvent.ACTION_DOWN: Log.d(tag, "action down"); break; case MotionEvent.ACTION_CANCEL: Log.d(tag, "action cancel"); break; case MotionEvent.ACTION_UP: Log.d(tag, "action up"); break; case MotionEvent.ACTION_MOVE: Log.d(tag, "action move"); break; default: Log.d(tag, "unknow action"); } } }
MainActivity的代碼如下:
public class MainActivity extends Activity { public static final String TAG = "TouchDemoActivity"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } }
下面分情況討論程序的運行結果。
1、MyLayout的onInterceptTouchEvent返回false,MyView的onTouchEvent返回true<喎?/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjwvcD4KPHA+x+m/9jGjurWxteO798C2yau/8sTatcTIztLizrvWw6Os1rvT0E15TGF5b3V0u+G908rVysK8/qOsyuSz9rXETG9nyOfPwqO6PC9wPgo8cD48aW1nIHNyYz0="/uploadfile/Collfiles/20140522/20140522091501145.jpg" alt="\">
可以看出,touch事件最後會被MyLayout的onTouchEvent接收到。
情況2: 點擊紅色框內的黑色區域,由於onInterceptTouchEvent()返回false,故MyView也能接收到touchEvent事件,輸出的Log如下:
可以看出,由於MyView的onTOuchEvent默認返回True,消耗了touch事件,MyLayout中的onTOuchEvent將不會被調用。
當我們的手指按下黑色區域,停留幾秒再抬起,得到的Log如下圖:
可以看出,第一個事件的類型為action down,最後一個為action up,中間的都是action move的類型,這正好符合上一篇文章介紹的Android的手勢定義。
2、MyLayout的onInterceptTouchEvent返回false,MyView的onTouchEvent返回false
改寫MyView中onTouchEvent的代碼,令其返回false
@Override public boolean onTouchEvent(MotionEvent event) { Log.d(TAG, "onTouchEvent."); LogUtil.logAction(event, TAG); return false; }
可以看出,touch的類型只為action down。
3、MyLayout的onInterceptTouchEvent返回true
改寫MyLayout中的onInterceptTouchEvent代碼,令其返回true
@Override public boolean onInterceptTouchEvent(MotionEvent ev) { Log.d(TAG, "onInterceptTouchEvent"); return true; }由於MyLayout攔截了touch事件,MyView中的onTouchEvent將不會被調用,log如下:
以上對Android的onInterceptTouchEvent和onTouchEvent的描述若有不妥之處,歡迎指正。
本文參考的代碼出自:兩分鐘徹底讓你明白Android中onInterceptTouchEvent與onTouchEvent(圖文)!,感謝作者的無私分享。
這裡講一下React Native中的一個組件——ActivityIndicator,這是一個加載指示器,俗稱菊花,很常見的,效果如下所示:imp
1 背景大家都知道Android View提供了scrollTo()與scrollBy()方法來供我們進行View的滾動,但是有個問題就是他的滾動很蛋疼,疼在是瞬時挪動到
第一步,需要修改service1項目中aidl,增加一個方法。package com.example.service1.aidl; interface IM
本文實例講述了Android編程實現canvas繪制餅狀統計圖功能。分享給大家供大家參考,具體如下:本例的目的是實現一個簡單的餅狀統計圖,效果如下: