`
benson37
  • 浏览: 17373 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

 
阅读更多

项目中需要实现长按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;
	}

}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics