[Android Tips] 模仿微信消息长按菜单

Android 技巧系列

[Android Tips] 模仿微信消息长按菜单

一、实现步骤

1.布局文件 popup_content_layout.xml

效果:

代码如下(示例):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="1dp">


    <RelativeLayout
        android:layout_width="200dp"
        android:layout_height="50dp"
        android:background="#3c3f41">

        <RelativeLayout
            android:id="@+id/menu1_item1"
            android:layout_width="50dp"
            android:layout_height="40dp"
            android:layout_centerVertical="true">

            <ImageView
                android:id="@+id/img_copy"
                android:layout_width="18dp"
                android:layout_height="18dp"
                android:layout_centerHorizontal="true"
                android:layout_marginTop="4dp"
                android:src="@drawable/copy" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/img_copy"
                android:layout_centerHorizontal="true"
                android:gravity="center"
                android:text="复制"
                android:textColor="#fff"
                android:textSize="12sp" />
        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/menu1_item2"
            android:layout_width="50dp"
            android:layout_height="40dp"
            android:layout_centerVertical="true"
            android:layout_toRightOf="@+id/menu1_item1">

            <ImageView
                android:id="@+id/img_share"
                android:layout_width="18dp"
                android:layout_height="18dp"
                android:layout_centerHorizontal="true"
                android:layout_marginTop="4dp"
                android:src="@drawable/share" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/img_share"
                android:layout_centerHorizontal="true"
                android:gravity="center"
                android:text="转发"
                android:textColor="#fff"
                android:textSize="12sp" />
        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/menu1_item3"
            android:layout_width="50dp"
            android:layout_height="40dp"
            android:layout_centerVertical="true"
            android:layout_toRightOf="@+id/menu1_item2">

            <ImageView
                android:id="@+id/img_delete"
                android:layout_width="18dp"
                android:layout_height="18dp"
                android:layout_centerHorizontal="true"
                android:layout_marginTop="4dp"
                android:src="@drawable/delete" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/img_delete"
                android:layout_centerHorizontal="true"
                android:gravity="center"
                android:text="删除"
                android:textColor="#fff"
                android:textSize="12sp" />
        </RelativeLayout>

        <RelativeLayout
            android:id="@+id/menu1_item4"
            android:layout_width="50dp"
            android:layout_height="40dp"
            android:layout_centerVertical="true"
            android:layout_toRightOf="@+id/menu1_item3">

            <ImageView
                android:id="@+id/img_more"
                android:layout_width="18dp"
                android:layout_height="18dp"
                android:layout_centerHorizontal="true"
                android:layout_marginTop="4dp"
                android:src="@drawable/more_white" />

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/img_more"
                android:layout_centerHorizontal="true"
                android:gravity="center"
                android:text="更多"
                android:textColor="#fff"
                android:textSize="12sp" />
        </RelativeLayout>
    </RelativeLayout>
</LinearLayout>

2.结构开发

代码如下(示例):

  • 首先是通过XY轴来实现popwindow位置确定;
  • 点击事件实现复制 和 转发

WSAdapter

public class WSAdapter extends BaseAdapter {

    private String mMessage = null;
    private PopupWindow mPopupWindow;
    
    private int downX;
    private int downY;
    
    //点击转发按钮,需要通过回调方法实现
    public interface OnItemShareListener {
        void onItemShare(String text);
    }

    private OnItemShareListener onItemShareListener;

    public void setOnItemShareListener(OnItemShareListener onItemShareListener) {
        this.onItemShareListener = onItemShareListener;
    }
    


    @SuppressLint("ClickableViewAccessibility")
    @Override
    public View getView(final int position, View v, ViewGroup parent) {

        //  ~ 省略

        holder.tv_content.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent motionEvent) {
                if(motionEvent.getAction() == MotionEvent.ACTION_UP) {
                    view.performClick();
                }
                    downX = (int) motionEvent.getRawX();
                    downY = (int) motionEvent.getRawY();
                    return false;
                }
        });

        holder.tv_content.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                mMessage = holder.tv_chatcontent.getText().toString();
                showPopupWindow(holder.tv_chatcontent);
                return false;
            }
        });
        holder.tv_content.performClick();
       
        }

        return v;
    }

    static class ViewHolder {
        TextView tv_chatcontent;
        RelativeLayout layout_content;
    }

    private void showPopupWindow(final View anchorView) {
        View contentView = LayoutInflater.from(ArixoChatApplication.getAppContext()).inflate(R.layout.popup_content_layout, null);
        int screenHeight = ArixoChatApplication.getAppContext().getResources().getDisplayMetrics().heightPixels;
        int screenWidth = ArixoChatApplication.getAppContext().getResources().getDisplayMetrics().widthPixels;
        View.OnClickListener menuItemOnClickListener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(v.getContext(), "Click ", Toast.LENGTH_SHORT).show();
                if (mPopupWindow != null) {
                    mPopupWindow.dismiss();
                }
            }
        };
        contentView.findViewById(R.id.menu1_item1).setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View view) {
                // 获取剪切板管理器:
                ClipboardManager clipboard = (ClipboardManager) ArixoChatApplication.getAppContext().getSystemService(Context.CLIPBOARD_SERVICE);
                // 创建普通字符型ClipData
                ClipData clipData = ClipData.newPlainText("Label", mMessage);
                // 将ClipData内容放到系统剪贴板里。
                clipboard.setPrimaryClip(clipData);
                Toast.makeText(view.getContext(), "内容已复制", Toast.LENGTH_SHORT).show();
            }
        });

        contentView.findViewById(R.id.menu1_item2).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (onItemShareListener != null) {
                    onItemShareListener.onItemShare("Arixo share :" +  mMessage);
                }
            }
        });
        contentView.findViewById(R.id.menu1_item3).setOnClickListener(menuItemOnClickListener);
        contentView.findViewById(R.id.menu1_item4).setOnClickListener(menuItemOnClickListener);

        mPopupWindow = new PopupWindow(contentView,
                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);
        mPopupWindow.setBackgroundDrawable(new ColorDrawable());
        //计算View位置
        final int windowPos[] = new int[2];
        // 获取锚点View在屏幕上的左上角坐标位置
        contentView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
        // 计算contentView的高宽
        final int popuHeight = contentView.getMeasuredHeight();
        final int popuWidth = contentView.getMeasuredWidth();
        // 判断Y坐标
        if (downY > screenHeight / 2) {
            //向上弹出
            windowPos[1] = downY - popuHeight;
        } else {
            //向下弹出
            windowPos[1] = downY;
        }
        // 判断X坐标
        if (downX > screenWidth / 2) {
            //向左弹出
            windowPos[0] = downX - popuWidth;
        } else {
            //向右弹出
            windowPos[0] = downX;
        }
        int xOff = -20; // 调整偏移
        windowPos[0] -= xOff;
        mPopupWindow.showAtLocation(anchorView, Gravity.TOP | Gravity.START, windowPos[0], windowPos[1]);
    }

}

MainActivity

在这里面实现转发

   private void initListView() {
        mWSAdapter = new WSAdapter(this, mChatData, getOnChatItemClickListener());
        mRealListView.setAdapter(mWSAdapter);

        mWSAdapter.setOnItemShareListener(new WSAdapter.OnItemShareListener() {
            @Override
            public void onItemShare(String text) {
                shareText(text);
            }
        });
    }

    private void shareText(String text) {
        Intent shareIntent = new Intent();
        shareIntent.setAction(Intent.ACTION_SEND);
        shareIntent.putExtra(Intent.EXTRA_TEXT, text);
        shareIntent.setType("text/plain");

        if (shareIntent.resolveActivity(getPackageManager()) != null) {
            startActivity(Intent.createChooser(shareIntent, "Share text via"));
        }
    }

总结

以上就是今天要讲的内容,本文仅仅简单介绍了模仿微信开发

技术支持(3条消息) android仿微信消息长按根据触摸位置弹出对话框_DreamFollowerM的博客-CSDN博客

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昕玄

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值