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);
			}
		});
	}
}

打印消息

說明我們自定義的監聽器已經起作用瞭。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *