android仿微信消息长按根据触摸位置弹出对话框
来源:互联网 发布:瞻博网络工厂 编辑:程序博客网 时间:2024/05/21 22:54
package com.example.administrator.myapplication;
import android.graphics.drawable.ColorDrawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
PopupWindow mPopupWindow;
int screenHeight;
int screenWidth;
int downX;
int downY;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取屏幕的高宽
screenHeight = getResources().getDisplayMetrics().heightPixels;
screenWidth = getResources().getDisplayMetrics().widthPixels;
ListView mListView = (ListView) findViewById(R.id.listview);
mListView.setAdapter(new CustomAdapter());
}
private void showPopupWindow(final View anchorView) {
View contentView = LayoutInflater.from(this).inflate(R.layout.popup_content_layout, null);
View.OnClickListener menuItemOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(), "Click " + ((TextView) v).getText(), Toast.LENGTH_SHORT).show();
if (mPopupWindow != null) {
mPopupWindow.dismiss();
}
}
};
contentView.findViewById(R.id.menu_item1).setOnClickListener(menuItemOnClickListener);
contentView.findViewById(R.id.menu_item2).setOnClickListener(menuItemOnClickListener);
contentView.findViewById(R.id.menu_item3).setOnClickListener(menuItemOnClickListener);
contentView.findViewById(R.id.menu_item4).setOnClickListener(menuItemOnClickListener);
contentView.findViewById(R.id.menu_item5).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];
final int anchorLoc[] = 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]);
}
class CustomAdapter extends BaseAdapter {
@Override
public int getCount() {
return 20;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(getBaseContext()).inflate(R.layout.listview_item, null);
viewHolder = new ViewHolder();
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.Root = convertView.findViewById(R.id.root);
viewHolder.Root.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
downX = (int) motionEvent.getRawX();
downY = (int) motionEvent.getRawY();
return false;
}
});
viewHolder.Root.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
showPopupWindow(viewHolder.Root);
return false;
}
});
return convertView;
}
}
class ViewHolder {
View Root;
}
}
<?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:background="@drawable/button_normal_bg"
android:orientation="vertical"
android:padding="1dp">
<LinearLayout
android:layout_width="110dp"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/menu_item1"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center"
android:text="复制"
android:textColor="#000"/>
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="#ccc"/>
<TextView
android:id="@+id/menu_item2"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center"
android:text="撤回"
android:textColor="#000"/>
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="#ccc"/>
<TextView
android:id="@+id/menu_item3"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center"
android:text="转发"
android:textColor="#000"/>
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="#ccc"/>
<TextView
android:id="@+id/menu_item4"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center"
android:text="收藏"
android:textColor="#000"/>
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="#ccc"/>
<TextView
android:id="@+id/menu_item5"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center"
android:text="删除"
android:textColor="#000"/>
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="#ccc"/>
<TextView
android:id="@+id/menu_item6"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center"
android:text="更多"
android:textColor="#000"/>
</LinearLayout>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/root"
>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="15dp"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="标题标题"
android:textColor="@android:color/black"
android:textSize="18sp" />
<TextView
android:id="@+id/tv_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="内内容内容测试试内容测试测试"
android:textColor="@android:color/darker_gray"
android:textSize="14sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/more_root"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:gravity="center"
android:layout_marginRight="5dp"
android:layout_gravity="right|center_vertical">
<ImageView
android:id="@+id/more_imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@mipmap/ic_launcher" />
</LinearLayout>
</FrameLayout>
import android.graphics.drawable.ColorDrawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.PopupWindow;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
PopupWindow mPopupWindow;
int screenHeight;
int screenWidth;
int downX;
int downY;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 获取屏幕的高宽
screenHeight = getResources().getDisplayMetrics().heightPixels;
screenWidth = getResources().getDisplayMetrics().widthPixels;
ListView mListView = (ListView) findViewById(R.id.listview);
mListView.setAdapter(new CustomAdapter());
}
private void showPopupWindow(final View anchorView) {
View contentView = LayoutInflater.from(this).inflate(R.layout.popup_content_layout, null);
View.OnClickListener menuItemOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(), "Click " + ((TextView) v).getText(), Toast.LENGTH_SHORT).show();
if (mPopupWindow != null) {
mPopupWindow.dismiss();
}
}
};
contentView.findViewById(R.id.menu_item1).setOnClickListener(menuItemOnClickListener);
contentView.findViewById(R.id.menu_item2).setOnClickListener(menuItemOnClickListener);
contentView.findViewById(R.id.menu_item3).setOnClickListener(menuItemOnClickListener);
contentView.findViewById(R.id.menu_item4).setOnClickListener(menuItemOnClickListener);
contentView.findViewById(R.id.menu_item5).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];
final int anchorLoc[] = 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]);
}
class CustomAdapter extends BaseAdapter {
@Override
public int getCount() {
return 20;
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(getBaseContext()).inflate(R.layout.listview_item, null);
viewHolder = new ViewHolder();
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.Root = convertView.findViewById(R.id.root);
viewHolder.Root.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
downX = (int) motionEvent.getRawX();
downY = (int) motionEvent.getRawY();
return false;
}
});
viewHolder.Root.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
showPopupWindow(viewHolder.Root);
return false;
}
});
return convertView;
}
}
class ViewHolder {
View Root;
}
}
<?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:background="@drawable/button_normal_bg"
android:orientation="vertical"
android:padding="1dp">
<LinearLayout
android:layout_width="110dp"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/menu_item1"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center"
android:text="复制"
android:textColor="#000"/>
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="#ccc"/>
<TextView
android:id="@+id/menu_item2"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center"
android:text="撤回"
android:textColor="#000"/>
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="#ccc"/>
<TextView
android:id="@+id/menu_item3"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center"
android:text="转发"
android:textColor="#000"/>
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="#ccc"/>
<TextView
android:id="@+id/menu_item4"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center"
android:text="收藏"
android:textColor="#000"/>
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="#ccc"/>
<TextView
android:id="@+id/menu_item5"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center"
android:text="删除"
android:textColor="#000"/>
<View
android:layout_width="match_parent"
android:layout_height="0.5dp"
android:background="#ccc"/>
<TextView
android:id="@+id/menu_item6"
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center"
android:text="更多"
android:textColor="#000"/>
</LinearLayout>
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/root"
>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="15dp"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="标题标题"
android:textColor="@android:color/black"
android:textSize="18sp" />
<TextView
android:id="@+id/tv_content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:text="内内容内容测试试内容测试测试"
android:textColor="@android:color/darker_gray"
android:textSize="14sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/more_root"
android:layout_width="wrap_content"
android:layout_height="50dp"
android:gravity="center"
android:layout_marginRight="5dp"
android:layout_gravity="right|center_vertical">
<ImageView
android:id="@+id/more_imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@mipmap/ic_launcher" />
</LinearLayout>
</FrameLayout>
阅读全文
1 0
- android仿微信消息长按根据触摸位置弹出对话框
- android长按弹出对话框
- 仿微信消息根据长按位置显示置顶删除功能菜单栏
- Android 长按弹出菜单选项:ContextMenu(长按弹出标记消息、消息置顶、删除消息)
- easyui弹出对话框的位置根据某个控件元素改变
- android 对话框弹出位置和透明度详解
- phonegap 长按列表弹出对话框
- 长按listview弹出选项列表对话框
- Android精简小笔记(10):长按屏幕时弹出对话框
- 弹出消息对话框类
- android 对话框弹出位置和透明度的设置
- android 对话框弹出位置和透明度的设置
- android设置对话框背景透明度和弹出位置
- android 对话框弹出位置和透明度的设置
- Android 对话框弹出位置和透明度的设置
- Android 对话框弹出位置和透明度的设置
- 屏蔽EditText长按导致的弹出输入法的对话框
- 长按Power键默认会弹出对话框
- Bootstrap登录框自适应水平居中+垂直居中
- android studio提示Error:Unable to tunnel through proxy. Proxy returns "HTTP/1.1 400 Bad Reques
- 关于数据库备份
- POJ 3083 Children of the Candy Corn 笔记
- java中数组的定义及其基础应用
- android仿微信消息长按根据触摸位置弹出对话框
- 1032. Sharing (25)
- AJAX基础
- 170718 python3.x install PIL
- Crazy Learning for Day 19
- 一次关于ETCD客户端(ETCD4J)问题的定位
- 一分钟了解“c语言printf函数”
- TCP-IP学习笔记(三)——概述
- C语言32个关键字(分类)