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中的定义

<?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;

	@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);
			}
		});
	}
}
打印消息

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


展开阅读全文

没有更多推荐了,返回首页