在最近的工作中,有一个需求,就是需要自定义一个按钮,在点击的时候进行拍照,在长按的时候进行视频的录制模式,所以想到了继承ImageView,或者其他的Button也OK,在事件拦截中去处理该操作。具体的思路是在MotionEvent.ACTION_DOWN方法中去启动一个线程去进行计时操作,如果在指定时间段内,比如500毫秒,没有将手指抬起来,则认为用户进行了长按的操作,否则用户就是进行了点击按钮的操作,就可以当作拍照处理。以下是具体的代码实现,注释比较清楚:
package com.example.cretin.previoustesttwo;
import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.ImageView;
/**
* Created by cretin on 15/12/15.
*/
public class TakePhotoView extends ImageView {
//是否释放了
private boolean isReleased;
//计数器,防止多次点击导致最后一次形成longpress的时间变短
private int mCounter;
//长按的runnable
private Runnable mLongPressRunnable;
//定义相应时间 以此为依据判断是长按还是短按 默认为300毫秒
private int minTime = 300;
public int getMinTime() {
return minTime;
}
public void setMinTime(int minTime) {
this.minTime = minTime;
}
public OnTakePhotoClickListener getShortClickListener() {
return shortClickListener;
}
public void setShortClickListener(OnTakePhotoClickListener shortClickListener) {
this.shortClickListener = shortClickListener;
}
private OnTakePhotoClickListener shortClickListener;
private OnLongTakePhotoClickListener longClickListener;
public OnLongTakePhotoClickListener getLongClickListener() {
return longClickListener;
}
public void setLongClickListener(OnLongTakePhotoClickListener longClickListener) {
this.longClickListener = longClickListener;
}
public TakePhotoView(Context context) {
this(context, null,0);
}
public TakePhotoView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public TakePhotoView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mLongPressRunnable = new Runnable() {
@Override
public void run() {
mCounter--;
//计数器大于0,说明当前执行的Runnable不是最后一次down产生的 判断为短按。
if(mCounter>0 || isReleased) {
if (shortClickListener != null) {
shortClickListener.onClick();
}
return;
}
//否则判断为长按操作
if(longClickListener!=null){
longClickListener.onLongClick();
}
}
};
}
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
public TakePhotoView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
this(context, attrs, defStyleAttr);
}
public boolean dispatchTouchEvent(MotionEvent event) {
switch(event.getAction()) {
case MotionEvent.ACTION_DOWN:
mCounter++;
isReleased = false;
postDelayed(mLongPressRunnable, minTime);
break;
case MotionEvent.ACTION_UP:
//释放了
isReleased = true;
break;
}
return true;
}
/**
* 为长按拍照设置一个监听事件
*/
public interface OnLongTakePhotoClickListener {
void onLongClick();
}
/**
* 为短按拍照设置一个监听事件
*/
public interface OnTakePhotoClickListener {
void onClick();
}
}
----------------------------
如果您觉得这篇文章对您有所帮助,请打赏我一杯咖啡的钱,谢谢