需求:按住按钮,每100ms执行一次命令。
public class LongClickButton extends Button {
long lastTimeStamp;
boolean isPress;
ClickListener listener;
public LongClickButton(Context context) {
super(context);
}
public LongClickButton(Context context, AttributeSet attrs) {
super(context, attrs);
}
public LongClickButton(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@SuppressLint("ClickableViewAccessibility")
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
//按下时设置select为true 变换selector状态
setPressed(true);
setSelected(true);
isPress = true;
lastTimeStamp = System.currentTimeMillis();
//一直执行
new Thread(() -> {
while (isPress) {
//判断按压时间超过100毫秒视为长按
if ((System.currentTimeMillis() - lastTimeStamp) > 100) {
listener.onClick();
try {
Thread.sleep(100);//间隔100毫秒这里决定长按时 执行点击方法的频率
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}).start();
break;
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_UP:
//抬起设置select为false
setPressed(false);
setSelected(false);
//判断按压时间小于100毫秒视为单击
if ((System.currentTimeMillis() - lastTimeStamp) <= 100) {
//触发单击事件
//listener.onClick();
}
isPress = false;
break;
default:
break;
}
return true;
}
public void setClickListener(ClickListener listener) {
this.listener = listener;
}
public interface ClickListener {
void onClick();
}
}