<span style="font-size:18px;">//如下为本demo的布局文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<Button
android:id="@+id/button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<ImageView
android:layout_below="@id/button"
android:id="@+id/imageview"
android:src="@drawable/ic_launcher"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<com.example.ontouch.MyLinearLayout
android:layout_below="@id/imageview"
android:id="@+id/MyLinearLayout"
android:layout_height="wrap_content"
android:layout_width="wrap_content">
<Button
android:id="@+id/my_button"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</com.example.ontouch.MyLinearLayout>
</RelativeLayout>
//简单的自定义视图
ublic class MyLinearLayout extends LinearLayout{
public MyLinearLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
//若该方法返回值为true,则屏蔽了其子控件的事件触发,false则不影响
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return true;
}
}
//主类,事件的分发机制:由父视图传递给子视图
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button=(Button)this.findViewById(R.id.button);
ImageView imageView=(ImageView)this.findViewById(R.id.imageview);
//MyLinearLayout中的Button
Button myButton=(Button)this.findViewById(R.id.my_button);
//如果返回值为true,则表示该控件消费了该事件,不会向下传递
button.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.i("onTouch----->", event.getAction()+"");
return false;
}
});
//由Ontouch传递给OnClick,若Ontouch返回true,则Onclick不会响应
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.i("----Onclick", "excute");
}
});
//对与默认为不可点击的控件,如果动作返回false,后面的动作将不会响应(ImageVeiw默认不可点击)
//打印结果:0
imageView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
Log.i("------imageview", event.getAction()+"");
return false;
}
});
myButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Log.i("tag---------->", "MyButton");
}
});
}
//控件事件处理之前会先调用该方法,不管该方法返回false还是true,控件的事件都将屏蔽
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
Log.i("------>dispatchTouchEvent", "dispatchTouchEvent");
return super.dispatchTouchEvent(ev);
}
}
</span>
/***************************************************************************************************/