Android实现微信表情长按显示效果

转载请注明原创出处,谢谢!

ps:产品说我们的IM要致敬微信!产品说我们的IM要致敬微信!产品说我们的IM要致敬微信!

就这个效果

核心代码

    @Override
    public boolean onItemLongClick(BaseQuickAdapter baseQuickAdapter, View view, int position) {
        if (baseQuickAdapter instanceof EmojiAdapter) {
            String item = ((EmojiAdapter) baseQuickAdapter).getItem(position);
            if (item != null) {
                llEmojiBig.setVisibility(View.VISIBLE);
                rvEmojiHistoryV.setScrollEnabled(false);  // 禁止滚动
                rvEmojiAllV.setScrollEnabled(false);  // 禁止滚动
                isEmojiLongTouch = true;
                upEmojiBig(view, item);
            }
        }
        // 返回true,不触发点击事件
        return true;
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_UP) {
            // 手指抬起,表情触摸状态取消
            llEmojiBig.setVisibility(View.GONE);
            isEmojiLongTouch = false;
            rvEmojiHistoryV.setScrollEnabled(true);  // 允许滚动
            rvEmojiAllV.setScrollEnabled(true);  // 允许滚动
        } else if (ev.getAction() == MotionEvent.ACTION_MOVE) {
            if (isEmojiLongTouch) {
                View childView = null;
                if (flEmojiV.getVisibility() == View.VISIBLE) {
                    if (isViewTouch(rvEmojiHistoryV, ev)) { // 最近使用
                        childView = getTouchItemView(rvEmojiHistoryV, ev);
                    } else if (isViewTouch(rvEmojiAllV, ev)) { // 所有表情
                        childView = getTouchItemView(rvEmojiAllV, ev);
                    }
                }
                if (childView != null) {
                    llEmojiBig.setVisibility(View.VISIBLE);
                    ImageView ivEmoji = childView.findViewById(R.id.iv_emoji);
                    upEmojiBig(childView, ivEmoji.getTag().toString());
                } else {
                    llEmojiBig.setVisibility(View.GONE);
                }
            }
        }
        return super.dispatchTouchEvent(ev);
    }

    /**
     * 获取触摸的item
     */
    private View getTouchItemView(RecyclerView rv, MotionEvent ev) {
        if (rv != null) {
            Rect rect = new Rect();
            rv.getGlobalVisibleRect(rect);
            return rv.findChildViewUnder(ev.getRawX() - rv.getLeft(), ev.getRawY() - rect.top);
        }
        return null;
    }

    /**
     * 判断触摸的是否是View
     */
    private boolean isViewTouch(View view, MotionEvent ev) {
        if (view != null) {
            Rect viewRect = new Rect();
            view.getGlobalVisibleRect(viewRect);
            return viewRect.contains((int) ev.getRawX(), (int) ev.getRawY());
        }
        return false;
    }

    /**
     * 更新触摸的大表情
     */
    private void upEmojiBig(View view, String key) {
        if (view != null) {
            // 更新图片和文案
            if (!key.equals(tvEmojiBig.getText().toString())) {
                ivEmojiBig.setImageResource(EmojiUtils.getEmojiId(key));
                tvEmojiBig.setText(key);
            }
            // 设置view的位置
            Rect rect = new Rect();
            view.getGlobalVisibleRect(rect);
            // 14 = (64 - 36) / 2 = (大图片宽度 - 小图片宽度) / 2
            llEmojiBig.setX(rect.left - dip2px(14));
            // 120 大图片高度
            llEmojiBig.setY(rect.top - dip2px(120));
        }
    }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容