Android自定义View时添加自己的监听器

来源:互联网 发布:知乎匿名提问没人回答 编辑:程序博客网 时间:2024/05/11 05:59

监听器在Java中非常常用,在自定义控件时可能根据自己的需要去监听一些数据的改变,这时就需要我们自己去写监听器,Java中的监听器实际上就是C++中的回调函数,在初始化时设置了这个函数,由某个事件触发这个函数被调用,两个类之间的数据通信也可以通过监听器来实现。要定义监听器就要先定义一个接口,具体功能由设置监听器的类去实现

关键代码实现

package com.example.listviewitem.widgets;import android.content.Context;import android.graphics.Canvas;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.View;/** * 在自定义的View中定义三个监听器 */public class MyView extends View {private OnDownActionListener mDown = null;private OnMoveActionListener mMove = null;private OnUpActionListener mUp = null;public MyView(Context context) {super(context);}public MyView(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stub}@Overrideprotected void onDraw(Canvas canvas) {// TODO Auto-generated method stubsuper.onDraw(canvas);}@Overridepublic boolean onTouchEvent(MotionEvent event) {// TODO Auto-generated method stubint x, y;if (event.getAction() == MotionEvent.ACTION_DOWN) {x = (int) event.getX();y = (int) event.getY();if (mDown != null) {mDown.OnDown(x, y);}return true; // 只有返回true这个控件的move和up才会响应} else if (event.getAction() == MotionEvent.ACTION_MOVE) {x = (int) event.getX();y = (int) event.getY();if (mMove != null) {mMove.OnMove(x, y);}} else if (event.getAction() == MotionEvent.ACTION_UP) {x = (int) event.getX();y = (int) event.getY();if (mUp != null) {mUp.OnUp(x, y);}}return super.onTouchEvent(event);}// 为每个接口设置监听器public void setOnDownActionListener(OnDownActionListener down) {mDown = down;}public void setOnMoveActionListener(OnMoveActionListener move) {mMove = move;}public void setOnUpActionListener(OnUpActionListener up) {mUp = up;}// 定义三个接口public interface OnDownActionListener {public void OnDown(int x, int y);}public interface OnMoveActionListener {public void OnMove(int x, int y);}public interface OnUpActionListener {public void OnUp(int x, int y);}}
自定义View在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="vertical" >    <com.example.listviewitem.widgets.MyView        android:id="@+id/my_view"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:background="@drawable/area_point_bg" /></LinearLayout>
Activity中设置监听器

package com.example.listviewitem;import com.example.listviewitem.widgets.MyView;import com.example.listviewitem.widgets.MyView.OnDownActionListener;import com.example.listviewitem.widgets.MyView.OnMoveActionListener;import com.example.listviewitem.widgets.MyView.OnUpActionListener;import android.app.Activity;import android.os.Bundle;public class TestListener extends Activity {private MyView view;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.listener);view = (MyView) findViewById(R.id.my_view);view.setOnDownActionListener(new OnDownActionListener() {@Overridepublic void OnDown(int x, int y) {// TODO Auto-generated method stubSystem.out.println("down x = " + x + " y = " + y);}});view.setOnMoveActionListener(new OnMoveActionListener() {@Overridepublic void OnMove(int x, int y) {// TODO Auto-generated method stubSystem.out.println("move x = " + x + " y = " + y);}});view.setOnUpActionListener(new OnUpActionListener() {@Overridepublic void OnUp(int x, int y) {// TODO Auto-generated method stubSystem.out.println("up x = " + x + " y = " + y);}});}}
打印消息

说明我们自定义的监听器已经起作用了。


1 0
原创粉丝点击