欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Android自定义控件】一个简单的长按控件,用以解决长按多次触发点击事件

程序员文章站 2022-06-08 17:23:15
...

项目中需要实现长按view多次一直触发点击事件,直到手指抬起;

开始是在业务层实现这些功能的,做完发觉是否可以自定义控件的形式,与业务分离,就写了个控件,简单重构了代码

import android.content.Context;
import android.os.Handler;
import android.os.Looper;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;

/**
 * 该控件用以实现长按触发多次点击事件的效果
 * 
 * @author Sanji.Shen
 *
 */
public class LongClickImageView extends ImageView {

	/**
	 * 长按事件触发频率
	 */
	private long mDelayMillis = 100;

	private boolean isMotionEventUp = true;

	public LongClickImageView(Context context, AttributeSet attrs) {
		super(context, attrs);
		intiListener();
	}

	public LongClickImageView(Context context) {
		super(context);
		intiListener();
	}

	public LongClickImageView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		intiListener();
	}

	public void intiListener() {
		this.setOnLongClickListener(new OnLongClickListener() {

			@Override
			public boolean onLongClick(View v) {
				isMotionEventUp = false;
				mHandler.sendEmptyMessage(0);
				return false;
			}
		});
		this.setOnTouchListener(new OnTouchListener() {

			@Override
			public boolean onTouch(View v, MotionEvent event) {
				if (event.getAction() == MotionEvent.ACTION_UP) {
					isMotionEventUp = true;
				}
				return false;
			}
		});
	}

	/**
	 * 用以处理click事件
	 */
	Handler mHandler = new Handler(Looper.getMainLooper()) {
		public void handleMessage(android.os.Message msg) {
			if (!isMotionEventUp && isEnabled()) {
				// 调用click事件
				performClick();
				mHandler.sendEmptyMessageDelayed(0, mDelayMillis);
			}
		};
	};

	/**
	 * 设置触发时间间隔
	 * 
	 * @param delayMillis
	 */
	public void setmDelayMillis(long delayMillis) {
		this.mDelayMillis = delayMillis;
	}

}