Android 模仿小红书双击点赞动画

 直接上代码,就一个简单的自定义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图片。当用户点击后直接播放就行了

  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值