一、事件监听涉及到三个类对象
1、EventSource(事件源)事件发生的场所
2、Event(事件):事件封装界面组件上面发生的特定事件
3、EventListener(事件监听器):负责监听事件源发生的事件
二、监听器就是程序中的MyClickListenner类,监听器类必须要程序员自己实现,关键在于实现处理。通常事件监听器必须实现的监听接口有:
1、View.OnClickListener: 单击事件的监听器必须实现的接口
2、View.OnCreateContextMenuListener: 创建上下文菜单事件的事件监听器必须要实现的的接口
3、View.onFocusChangeListener: 焦点改变事件监听器必须实现的接口
4、View.OnkeyListener: 按键事件监听器必须要实现的接口
5、View.OnLongClickListener: 长按事件监听器必须实现的接口
6、View.OnTouchListener: 触摸事件监听器必须实现的接口
三、注册监听器,只需要调用事件源的 setXxxListener(XxxListener)方法就可以了。也可以在xml中用Android:onClick属性指定监听
四、基于回调事件处理
GUI提供一些事件的处理回调方法,以View为例
1、boolean onKeyDown(int keyCode ,keyEvent event): 当用户在该组件上按下一个键,触发该方法
2、boolean onKeyLongPress(int keyCode,KeyEvent evnt): 当用户在组件上长按键时触发该方法
3、boolean onKeyShortcut(int keyCode,KeyEvent evnt): 当用户在组件上快捷键事件时,触发该方法
4、boolean onKeyUp(int keyCode,KeyEvent evnt): 当用户在组件上松开按键事件时,触发该方法
5、boolean onTouchEvent(MotionEvent event): 当用户触摸触摸屏时,触发该方法
6、boolean onTrackballEvent(MotionEvent event): 当用户触发轨迹球事件时,触发该方法
5、总的来说事件发生时,首先触发的是绑定在组件上的监听器,其次才触发该组件上面的回调方法,最后才是传播到该组件所在的Activity上。
在一些情况下,基于回调事件处理机制会更好地提高程序地内聚性
6、通过回调方法实现跟随手指地小球(重写boolean onTouchEvent(MotionEvent event))
1、自定一个DrawView,继承View
public class DrawView extends View { public float currentX=40; public float currentY=50; Paint paint=new Paint();//创建画笔 public DrawView(Context context) { super(context); } public DrawView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } //重写onDraw public void onDraw(Canvas canvas){ super.onDraw(canvas); paint.setColor(Color.RED); canvas.drawCircle(currentX,currentY,20,paint); } //重写onTouchEvent(MotionEvent event) 当发生触摸屏事件的时候发生 public boolean onTouchEvent(MotionEvent event){ currentX=event.getX(); //获取触摸事件的x currentY=event.getY(); //获取触摸事件的y //通知当前的组件重化自己 invalidate(); return true; } }
二、有两种用法
1.1、可直接在xml中使用
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal"> <com.example.asus.summary.view.DrawView android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout>
1.2、Activity
public class DrawActivity extends AppCompatActivity { protected void onCreate(Bundle saveInstanceSate) { super.onCreate(saveInstanceSate); setContentView(R.layout.draw_activity); } }
2、Activity
public class DrawActivity extends AppCompatActivity { protected void onCreate(Bundle saveInstanceSate) { super.onCreate(saveInstanceSate); LinearLayout linearLayout=new LinearLayout(this); //线性布局管理器 DrawView drawView=new DrawView(this); //自定义view drawView.setMinimumHeight(300); drawView.setMinimumWidth(500); linearLayout.addView(drawView); //布局容器中加入自定义view setContentView(linearLayout); //设置布局 } }