編輯:關於Android編程
package cn.c;
import android.os.Bundle;
import android.app.Activity;
import android.view.MotionEvent;
/**
* Demo描述:
* 分析Android事件分發和處理機制
*
* 在該示例中涉及到三個自定義的View.分別是:
* 最外層的布局MyFrameLayout
* 內層的布局MyLinearLayout
* 最裡層的自定義按鈕MyButton
*
* 在dispatchTouchEvent()源碼分析中提到一個很重要的東西:
* 如果一個View沒有處理ACTION_DOWN事件,即對於該事件返回了false(沒有消費該事件)
* 那麼後續的ACTION_MOVE和ACTION_UP均不會再傳遞到該View;也就是說該View沒有了
* 處理ACTION_MOVE和ACTION_UP的資格.
* 對於該問題,在此予以驗證.
*
*
* MyButton的onTouchEvent()方法中直接返回false.
* 那麼可以看到MyButton只處理了ACTION_DOWN.
* 類似的MyFrameLayout和MyLinearLayout對於Touch事件也直接返回了false;他們也就處理不到
* ACTION_MOVE和ACTION_UP
*
*/
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
System.out.println(===> MainActivity 中調用 onCreate());
System.out.println(--------------------------------------------------);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
System.out.println(===> MainActivity 中調用 dispatchTouchEvent());
System.out.println(===> super.dispatchTouchEvent()默認返回true);
System.out.println(--------------------------------------------------);
return super.dispatchTouchEvent(ev);
}
@Override
public void onUserInteraction() {
System.out.println(===> MainActivity 中調用 onUserInteraction());
System.out.println(--------------------------------------------------);
super.onUserInteraction();
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
System.out.println(===> MainActivity 中調用 onTouchEvent()--->ACTION_DOWN);
break;
case MotionEvent.ACTION_MOVE:
System.out.println(===> MainActivity 中調用 onTouchEvent()--->ACTION_MOVE);
break;
case MotionEvent.ACTION_UP:
System.out.println(===> MainActivity 中調用 onTouchEvent()--->ACTION_UP);
default:
break;
}
System.out.println(super.onTouchEvent()默認返回false 表示未消費事件);
System.out.println(--------------------------------------------------);
return super.onTouchEvent(event);
}
}
package cn.c;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.FrameLayout;
public class MyFrameLayout extends FrameLayout{
public MyFrameLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
super.dispatchTouchEvent(ev);
System.out.println(外層MyFrameLayout 中調用 dispatchTouchEvent());
System.out.println(super.dispatchTouchEvent()默認返回true 表示繼續分發);
System.out.println(--------------------------------------------------);
return super.dispatchTouchEvent(ev);
//return false;
}
//覆寫自ViewGroup
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
System.out.println(外層MyFrameLayout 中調用 onInterceptTouchEvent());
System.out.println(super.onInterceptTouchEvent()默認返回false 表示不攔截);
System.out.println(--------------------------------------------------);
return super.onInterceptTouchEvent(ev);
}
//注意:
//1 ViewGroup是View的子類
//2 ViewGroup中onTouchEvent()方法默認返回的是false
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
System.out.println(外層MyFrameLayout 中調用 onTouchEvent()--->ACTION_DOWN);
break;
case MotionEvent.ACTION_MOVE:
System.out.println(外層MyFrameLayout 中調用 onTouchEvent()--->ACTION_MOVE);
break;
case MotionEvent.ACTION_UP:
System.out.println(外層MyFrameLayout 中調用 onTouchEvent()--->ACTION_UP);
default:
break;
}
System.out.println(super.onTouchEvent()默認返回false 表示未消費事件);
System.out.println(--------------------------------------------------);
return super.onTouchEvent(event);
//return true;
}
}
MyLinearLayout如下:
package cn.c;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.LinearLayout;
public class MyLinearLayout extends LinearLayout {
public MyLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
super.dispatchTouchEvent(ev);
System.out.println(內層MyLinearLayout 中調用 dispatchTouchEvent());
System.out.println(super.dispatchTouchEvent()默認返回true 表示繼續分發);
System.out.println(--------------------------------------------------);
return super.dispatchTouchEvent(ev);
//return false;
}
//覆寫自ViewGroup
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
super.onInterceptTouchEvent(ev);
System.out.println(內層MyLinearLayout 中調用 onInterceptTouchEvent());
System.out.println(super.onInterceptTouchEvent()默認返回false 表示不攔截);
System.out.println(--------------------------------------------------);
return super.onInterceptTouchEvent(ev);
}
//注意:
//1 ViewGroup是View的子類
//2 ViewGroup中onTouchEvent()方法默認返回的是false
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
System.out.println(內層MyLinearLayout 中調用 onTouchEvent()--->ACTION_DOWN);
break;
case MotionEvent.ACTION_MOVE:
System.out.println(內層MyLinearLayout 中調用 onTouchEvent()--->ACTION_MOVE);
break;
case MotionEvent.ACTION_UP:
System.out.println(內層MyLinearLayout 中調用 onTouchEvent()--->ACTION_UP);
default:
break;
}
System.out.println(super.onTouchEvent()默認返回false 表示未消費事件);
System.out.println(--------------------------------------------------);
return super.onTouchEvent(event);
}
}
MyButton如下:
package cn.c;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.Button;
public class MyButton extends Button{
public MyButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
System.out.println(自定義Button 中調用 dispatchTouchEvent());
System.out.println(super.dispatchTouchEvent默認返回true);
System.out.println(--------------------------------------------------);
return super.dispatchTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
System.out.println(自定義Button 中調用 onTouchEvent()--->ACTION_DOWN);
break;
case MotionEvent.ACTION_MOVE:
System.out.println(自定義Button 中調用 onTouchEvent()--->ACTION_MOVE);
break;
case MotionEvent.ACTION_UP:
System.out.println(自定義Button 中調用 onTouchEvent()--->ACTION_UP);
break;
default:
break;
}
System.out.println(--------------------------------------------------);
//return false;
return true;
}
}
上一篇/kf/201412/365609.html
Android learning Starting!
In recent years,mobile platform become more and more popular!At present,the flourishi
Android實現界面左右滑動切換功能
相信大家一定都使用過手機QQ和微信之類的軟件,當我們使用時不難發現其界面的切換不僅可以通過點擊頁標簽來實現,還可以通過左右滑動來實現的,耗子君剛開始學Android時就覺
android中反射技術使用實例
在計算機科學領域,反射是指一類應用,它們能夠自描述和自控制。也就是說,這類應用通過采用某種機制來實現對自己行為的描述(self-representation)和監測(ex
AndroidStudio中使用Git上傳項目到github
今天這篇文章教給大家解決這幾個問題:1、如何通過AndroidStudio的git上傳項目到github2、如何通過AndroidStudio的git將存在的項目增加的類