简单记录控件事件的分发机制

来源:互联网 发布:幼儿园营养配餐软件 编辑:程序博客网 时间:2024/04/29 18:15

<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则不影响@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {return true;}}//主类,事件的分发机制:由父视图传递给子视图public class MainActivity extends Activity {@Overrideprotected 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中的ButtonButton myButton=(Button)this.findViewById(R.id.my_button);//如果返回值为true,则表示该控件消费了该事件,不会向下传递button.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {Log.i("onTouch----->", event.getAction()+"");return false;}});//由Ontouch传递给OnClick,若Ontouch返回true,则Onclick不会响应button.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Log.i("----Onclick", "excute");}});//对与默认为不可点击的控件,如果动作返回false,后面的动作将不会响应(ImageVeiw默认不可点击)//打印结果:0imageView.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {Log.i("------imageview", event.getAction()+"");return false;}});myButton.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {Log.i("tag---------->", "MyButton");}});}//控件事件处理之前会先调用该方法,不管该方法返回false还是true,控件的事件都将屏蔽@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {Log.i("------>dispatchTouchEvent", "dispatchTouchEvent");return super.dispatchTouchEvent(ev);}}</span>

/***************************************************************************************************/


0 0