直接上代码,就一个简单的自定义View:
public class Love extends RelativeLayout {
private Context mContext;
float[] num = {-30, -20, 0, 20, 30};//随机心形图片角度
//记录上一次的点击时间
private long lastClickTime = 0;
//点击的时间间隔
private long INTERVAL = 300;
private static final long SINGLE_CLICK_DELAY = 300; // 单击延时时间
private OnClickListener clickListener; // 外部点击事件监听器
private Handler handler = new Handler();
private boolean singleClickPending = false;
private float downX, downY;
public interface OnLoveClickListener {
void onSingleClick(); // 单击事件回调
void onDoubleClick(); // 双击事件回调
}
private OnLoveClickListener loveClickListener;
public void setOnLoveClickListener(OnLoveClickListener listener) {
this.loveClickListener = listener;
}
public Love(Context context) {
super(context);
initView(context);
}
public Love(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
initView(context);
}
public Love(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context);
}
private void initView(Context context) {
mContext = context;
clickListener = new OnClickListener() {
@Override
public void onClick(View v) {
// 默认单击事件处理,可以自行替换为你的逻辑
if (loveClickListener != null) {
if (singleClickPending) {
handler.removeCallbacksAndMessages(null);
singleClickPending = false;
} else {
loveClickListener.onSingleClick();
}
}
}
};
}
@Override
protected void dispatchDraw(Canvas canvas) {
super.dispatchDraw(canvas);
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = event.getX();
downY = event.getY();
// 获取点击时间
long currTime = System.currentTimeMillis();
// 判断点击之间的时间差
long interval = currTime - lastClickTime;
lastClickTime = currTime;
if (interval > 0 && interval < INTERVAL) {
final ImageView imageView = new ImageView(mContext);
//设置展示的位置,需要在手指触摸的位置上方,即触摸点是心形的右下角的位置
LayoutParams params = new LayoutParams(300, 300);
params.leftMargin = (int) event.getX() - 150;
params.topMargin = (int) event.getY() - 300;
//设置图片资源
ImgLoader.displayWebp(getContext(),R.drawable.main_webp_dianzanhou,imageView);
imageView.setLayoutParams(params);
//把IV添加到父布局当中
addView(imageView);
startDelayedRemoval(imageView,1500);
L.e("Love", "------------onSingleClick--------------");
if (loveClickListener != null) {
handler.removeCallbacksAndMessages(null);
singleClickPending = false;
loveClickListener.onDoubleClick(); // 双击事件回调
return true; // 拦截双击事件,不传递到子视图
}
} else {
// 单击事件
if (loveClickListener != null) {
singleClickPending = true;
handler.postDelayed(new Runnable() {
@Override
public void run() {
// 如果延时期间没有第二次点击,则执行单击事件
loveClickListener.onSingleClick();
singleClickPending = false;
}
}, SINGLE_CLICK_DELAY);
return true; // 拦截单击事件,不传递到子视图
}
}
break;
case MotionEvent.ACTION_CANCEL:
// 如果移动距离超过阈值,取消单击事件的执行
handler.removeCallbacksAndMessages(null);
singleClickPending = false;
break;
}
return super.dispatchTouchEvent(event);
}
// 设置点击事件监听器
@Override
public void setOnClickListener(OnClickListener l) {
this.clickListener = l;
}
private void startDelayedRemoval(final ImageView imageView, long delayMillis) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// 当动画结束以后,需要把控件从父布局移除
ImgLoader.display(getContext(), 0, imageView);
removeViewInLayout(imageView);
}
}, delayMillis);
}
}
其中main_webp_dianzanhou是一个webp图片。当用户点击后直接播放就行了