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博客