Android實(shí)現(xiàn)微信表情長按顯示效果

轉(zhuǎn)載請(qǐng)注明原創(chuàng)出處,謝謝!

ps:產(chǎn)品說我們的IM要致敬微信!產(chǎn)品說我們的IM要致敬微信!產(chǎn)品說我們的IM要致敬微信!

就這個(gè)效果

核心代碼

    @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);  // 禁止?jié)L動(dòng)
                rvEmojiAllV.setScrollEnabled(false);  // 禁止?jié)L動(dòng)
                isEmojiLongTouch = true;
                upEmojiBig(view, item);
            }
        }
        // 返回true,不觸發(fā)點(diǎn)擊事件
        return true;
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_UP) {
            // 手指抬起,表情觸摸狀態(tài)取消
            llEmojiBig.setVisibility(View.GONE);
            isEmojiLongTouch = false;
            rvEmojiHistoryV.setScrollEnabled(true);  // 允許滾動(dòng)
            rvEmojiAllV.setScrollEnabled(true);  // 允許滾動(dòng)
        } 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);
            }
            // 設(shè)置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));
        }
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容