转载请注明原创出处,谢谢!
- GitHub: @Ricco
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));
}
}