首先感谢提供了一些思路 http://www.cnblogs.com/popfisher/p/5608436.html

在adapter中 给Item设置触摸监听,记录触点距离屏幕左上方原点的位置,然后在item的长按监听时间中根据记录的位置计算弹出框在触点的那个方位。然后以item的view为popwindow弹出位置,并且设置偏移量。
主要还有一个问题,不知道微信怎么做到的弹出pop之后限制不滑动listview。
我这边就简单的判断了下popwindow弹出来之后不截取触摸事件。

代码下载地址

效果图如下

主要代码先贴一下

public class MainActivity extends AppCompatActivity {private PopupWindow mPopupWindow;private ListView mListView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_custom_pos_window);initView();}private View getPopupWindowContentView() {// 一个自定义的布局,作为显示的内容int layoutId = R.layout.popup_content_layout;   // 布局IDView contentView = LayoutInflater.from(this).inflate(layoutId, null);View.OnClickListener menuItemOnClickListener = new View.OnClickListener() {@Overridepublic 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);return contentView;}private void showPopupWindow(View anchorView) {View contentView = getPopupWindowContentView();mPopupWindow = new PopupWindow(contentView,ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, true);// 如果不设置PopupWindow的背景,有些版本就会出现一个问题:无论是点击外部区域还是Back键都无法dismiss弹框mPopupWindow.setBackgroundDrawable(new ColorDrawable());// 设置好参数之后再showint windowPos[] = PopupWindowUtil.calculatePopWindowPos(anchorView, contentView, x, y);mPopupWindow.showAtLocation(anchorView, Gravity.TOP | Gravity.START, windowPos[0], windowPos[1]);}private void initView() {mListView = (ListView) findViewById(R.id.listview);mListView.setAdapter(new CustomAdapter());mListView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {if (mPopupWindow != null && mPopupWindow.isShowing())return true;return false;}});}class CustomAdapter extends BaseAdapter {@Overridepublic int getCount() {return 20;}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {final ViewHolder viewHolder;final View finalConvertView;if (convertView == null) {convertView = LayoutInflater.from(getBaseContext()).inflate(R.layout.listview_item, null);viewHolder = new ViewHolder();convertView.setTag(viewHolder);} else {viewHolder = (ViewHolder) convertView.getTag();}finalConvertView = convertView;convertView.setOnLongClickListener(new View.OnLongClickListener() {@Overridepublic boolean onLongClick(View v) {showPopupWindow(finalConvertView);return false;}});convertView.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {x = (int) event.getRawX();y = (int) event.getRawY();return false;}});convertView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {//点击事件}});return convertView;}}int x;int y;class ViewHolder {View moreRoot;View moreImgv;}
}
public class PopupWindowUtil {/*** 计算popwindow在长按view 的什么位置显示** @param anchorView 长按锚点的view* @param popView    弹出框* @param onScreenx  锚点距离屏幕左边的距离* @param onScreeny  锚点距离屏幕上方的距离* @return popwindow在长按view中的xy轴的偏移量*/public static int[] calculatePopWindowPos(final View anchorView, final View popView, int onScreenx, int onScreeny) {final int windowPos[] = new int[2];final int anchorLoc[] = new int[2];// 获取触点在屏幕上相对左上角坐标位置anchorLoc[0] = onScreenx;anchorLoc[1] = onScreeny;//当前item的高度final int anchorHeight = anchorView.getHeight();// 获取屏幕的高宽final int screenHeight = getScreenHeight(anchorView.getContext());final int screenWidth = getScreenWidth(anchorView.getContext());// 测量popView 弹出框popView.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);// 计算弹出框的高宽final int popHeight = popView.getMeasuredHeight();final int popWidth = popView.getMeasuredWidth();// 判断需要向上弹出还是向下弹出显示// 屏幕高度-触点距离左上角的高度 < popwindow的高度// 如果小于弹出框的高度那么说明下方空间不够显示 popwindow,需要放在触点的上方显示final boolean isNeedShowUp = (screenHeight - anchorLoc[1] < popHeight);// 判断需要向右边弹出还是向左边弹出显示//判断触点右边的剩余空间是否够显示popwindow 大于就说明够显示final boolean isNeedShowRight = (screenWidth - anchorLoc[0] > popWidth);if (isNeedShowUp) {//如果在上方显示 则用 触点的距离上方的距离 - 弹框的高度windowPos[1] = anchorLoc[1] - popHeight;} else {//如果在下方显示 则用 触点的距离上方的距离windowPos[1] = anchorLoc[1];}if (isNeedShowRight) {windowPos[0] = anchorLoc[0];} else {//显示在左边的话 那么弹出框的位置在触点左边出现,则是触点距离左边距离 - 弹出框的宽度windowPos[0] = anchorLoc[0] - popWidth;}return windowPos;}/*** 获取屏幕高度(px)*/public static int getScreenHeight(Context context) {return context.getResources().getDisplayMetrics().heightPixels;}/*** 获取屏幕宽度(px)*/public static int getScreenWidth(Context context) {return context.getResources().getDisplayMetrics().widthPixels;}
}

仿微信消息根据长按位置显示置顶删除功能菜单栏相关推荐

  1. 高仿微信聊天界面长按弹框样式

    效果图 背景 在公司做的项目里面,刚好有需要用到微信聊天界面长按弹框样式这种UI的. 网上找了一下,没找到. Android现成的 ListPopupWindow又不能满足需求. 因此在非上班时间撸一 ...

  2. 仿微信拍照,长按录视频的拍照控件

    CameraView 项目地址:CJT2325/CameraView  简介:仿微信拍照,长按录视频的拍照控件 更多:作者   提 Bug    标签: Camera- 使用方法 Gradle 依赖: ...

  3. android点击加号,Android仿微信图片上传带加号且超过最大数隐藏功能

    1.仿照微信空间上传图片,显示图片数量以及超过最大,上传按钮隐藏功能 2.上效果图 3.上代码,主要是Adapter类 /** * Created by zhangyinlei on 2018/3/2 ...

  4. html评论置顶功能,微信公众号精选留言评论怎么置顶显示?功能在哪里设置?...

    微信公众号精选留言怎么置顶?微信公众号留言功能新增了置顶精选留言的设置,那么微信公众号留言功能在哪里设置呢?下文小乐哥给大家介绍一下! 微信公众号精选留言怎么置顶? 微信公众平台悄然上线了一个新功能, ...

  5. 模仿微信,实现会话置顶折叠功能

    [代码编写中,待完善] 简介 微信的会话置顶折叠,看上去,挺不错的,产品要求也搞一个. 方案一:采用即时数据更新,刷新界面 方案二: 首页更新流程: 使用 LoaderManager 更新缺点: 1. ...

  6. 如何在项目中实现类似于微信的置顶与取消置顶的功能?

    - 借鉴微信的置顶与取消置顶的实现思路: 会看到这个微信的聊天记录的排序规则是以时间降序来进行排序的,如果要实现置顶与取消置顶? 一下子是想不到的,需要思路 由此可以确信的是,我们平时使用微信时,最新 ...

  7. 用startSmoothScroll实现RecyclerView滚动到指定位置并置顶,含有动画。

    RecyclerView滚动到指定位置并置顶 RecyclerView本身提供了几个定位的方法,除了手动滑动的scrollTo,smootScrollTo和scrollBy,smoothScrollB ...

  8. dux修改index.php,DUX主题首页显示置顶文章

    之前有网友跟我要这个功能,实在是忙于生计一直没有时间写这方面的文章,最近这两天闲暇下来总算是有些时间了,其实这个功能说简单也简单,基本思路就是通过 get_option('sticky_posts') ...

  9. 代码实现网页右侧固定的qq客服,微信,手机号,置顶的功能

    实现网页右侧固定的qq客服,微信,手机号,置顶的功能 html代码部分 图片路径改成自己的 <!--网页右侧浮动代码--><div id="right">& ...

最新文章

  1. CentOS7 扩容 / 目录
  2. CSP认证201712-4 行车路线[C++题解]:单源最短路变型、拆点、好题!
  3. 有一部分文章设置了私密,论文完成后会公开~
  4. 2020CCPC(长春) - Ragdoll(启发式合并+带权并查集)
  5. Guava RateLimiter限流原理解析
  6. 用until编写一段shell程序,计算1~10的平方
  7. 大神云集!2019年谷歌博士奖学金获得者重磅问世,清华、上交大、港中文入选最多!...
  8. 刚装的系统没有sql server(mssqlserver)_数据库与SQL学习
  9. 剑指Offer_42_和为S的两个数字
  10. 【三维路径规划】基于matlab粒子群算法无人机山地三维路径规划【含Matlab源码 1831期】
  11. 程序员的奋斗史(三十)——近期微信公众平台更新文章集锦
  12. bandizip关闭自动更新提示的方法步骤
  13. MATLAB ttest和ttest2的区别
  14. HTTP Live Streaming(HLS)详解
  15. 万能DOS启动盘制作全攻略(转)
  16. Android11.0(R) MTK6771 平板横屏方案修改(强制app横屏 + 开机logo/动画+关机充电横屏 + RecoveryUI 横屏)
  17. 玩转用户身份权益——详解闲鱼身份权益体系的实现
  18. 巴别时代2017校园招聘宣讲+笔试
  19. ng2 绑定输出html,Angular2的数据绑定
  20. Ubuntu安装Eclipse,maven

热门文章

  1. 在考研/考博复试时【导师的权力】有多大?
  2. som神经网络聚类简单例子_ICML 2020:6篇必读图神经网络(GNN)论文 | 附下载
  3. 设置JAVA环境设置_Java为什么要设置环境变量、JAVA_HOME
  4. Raspberry Pi: WiFi设置
  5. 经验:从ppt复制到word中的图片在导出成PDF后出现黑框怎么解决
  6. 单因素方差分析——R语言实战
  7. access如何去重_如何在 1 秒内做到大数据精准去重?
  8. f4v格式视频转换成MP4格式的方法
  9. html天气预报插件透明,宁国生活网精美天气预报插件,透明图标,昼夜有别
  10. 【工业物联网】如何假装很懂工业物联网?