android(基于回调)的事件处理


    基于回调的事件模型:事件源与事件监听是统一的,事件由事件源自己处理。
java

    基于回调的事件处理适合于应付那种事件处理逻辑比较固定的VIew。
android

    Android最早触发控件上绑定的事件监听器。
ide


    使用回调机制处理GUI组件上所发生的事件,须要自定义组件类继承GUI组件类,并重写该类的事件处理方法来实现。而且在XML文件中使用自定义组件类。
布局


    Android为全部GUI组件都提供了一些事件处理的回调方法,如View类:
ui

     1.boolean onKeyDown(int keyCode,keyEvent event):当用户在该组件上按下某个按键时触发该方法。            //键码、事件   对于有键盘的适用xml

    2.boolean onKeyLongPress(int keyCode,keyEvent event):当用户在该组件上长按某个按键时触发该方法。
继承

    3.boolean onKeyShortcut(int keyCode,KeyEvent event):当一个键盘快捷键事件发生时触发该方法。
事件

    4.boolean onKeyUp(int keyCode,KeyEvent event):当用户在该组件上松开某个按键时触发该方法。
it

    5.boolean onTouchEvent(MotionEvent event):当用户在该组件上触发触摸屏事件时触发该方法。                //对于触屏的适用
io

    6.boolean onTrackballEvent(MotionEvent event):当用户在该组件上触发轨迹球屏事件时触发该方法。


    当回调方法返回true时,代表该处理方法已经彻底处理该事件,该事件不会传播出去。

    当回调方法返回false时,代表该处理方法并未彻底处理该事件,该事件会传播出去。

    对于基于回调的事件传播而言,某组件上所发生的事情不只会激发该组件上的回调方法,也会触发该组件所在Activity的回调方法——只要时间能传播到该Activity。

    

示例:

activity_main

<LinearLayout 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:orientation="vertical" >

    <com.example.huidiao.MyButton
        android:id="@+id/bn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="按钮上的触屏" />

</LinearLayout>


MyButton.java

package com.example.huidiao;

public class MyButton extends Button {

	// AttributeSet是接收xml中定义的属性信息,这不必定是自定义布局,不是自定义布局也有该属性,要不xml中定义的属性信息就没法接收了。
	public MyButton(Context context, AttributeSet set) {
		super(context, set);
	}

	// 重写触屏事件的回调方法
	public boolean onTouchEvent(MotionEvent event) {
		// 事件
		super.onTouchEvent(event);
		Log.v("按钮上触屏事件", "在按钮上的触屏,事件源本身处理");
		return false; // ②
	}
}



MainActivity.java

package com.example.huidiao;

public class MainActivity extends Activity {

	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	// 重写onTouchEvent方法,该方法可监听它所包含的全部控件被触屏事件
	public boolean onTouchEvent(MotionEvent event) {
		// 事件
		super.onTouchEvent(event);
		Log.v("触屏事件传递到Activity", "在自定义按钮上触屏,事件在按钮所在Activity处理");
		return true; // ③
	}
}
相关文章
相关标签/搜索