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

监听器在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
	}

	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		super.onDraw(canvas);
	}

	@Override
	public boolean onTouchEvent(MotionEvent event) {
		// TODO Auto-generated method stub
		int 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中的定义




    

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;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.listener);
		view = (MyView) findViewById(R.id.my_view);
		view.setOnDownActionListener(new OnDownActionListener() {

			@Override
			public void OnDown(int x, int y) {
				// TODO Auto-generated method stub
				System.out.println("down x = " + x + " y = " + y);
			}
		});

		view.setOnMoveActionListener(new OnMoveActionListener() {

			@Override
			public void OnMove(int x, int y) {
				// TODO Auto-generated method stub
				System.out.println("move x = " + x + " y = " + y);
			}
		});

		view.setOnUpActionListener(new OnUpActionListener() {

			@Override
			public void OnUp(int x, int y) {
				// TODO Auto-generated method stub
				System.out.println("up x = " + x + " y = " + y);
			}
		});
	}
}
打印消息
Android自定义View时添加自己的监听器_第1张图片

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


你可能感兴趣的:(Android基础)