PopupWindow 仿微信点赞和评论弹出

微信朋友圈的点赞和评论功能,有2个组成部分:左下角的“更多”按钮;点击该按钮后弹出的对话框;

PopupWindow,弹出框使用PopupWindow实现,这是点赞和评论的载体,具体要涉及 PopupWindow 点击非窗口位置和再次点击消失以及显示位置的问题(根据相应更多按钮的位置确定 PopupWindow 的显示位置

  1 package com.example.cmm.helloworld;
  2
  3 import android.app.AlertDialog;
  4 import android.content.Context;
  5 import android.graphics.drawable.BitmapDrawable;
  6 import android.support.v7.app.AppCompatActivity;
  7 import android.os.Bundle;
  8 import android.view.LayoutInflater;
  9 import android.view.View;
 10 import android.view.ViewGroup;
 11 import android.widget.BaseAdapter;
 12 import android.widget.ImageView;
 13 import android.widget.ListView;
 14 import android.widget.PopupWindow;
 15 import android.widget.TextView;
 16
 17 import java.util.ArrayList;
 18 import java.util.List;
 19
 20 public class MainActivity extends AppCompatActivity {
 21
 22     private PopupWindow mMorePopupWindow;
 23     private int mShowMorePopupWindowWidth;
 24     private int mShowMorePopupWindowHeight;
 25
 26     @Override
 27     protected void onCreate(Bundle savedInstanceState) {
 28
 29         super.onCreate(savedInstanceState);
 30
 31         setContentView(R.layout.activity_main);
 32
 33         ListView lv = (ListView) findViewById(R.id.listview);
 34
 35         lv.setAdapter(new MyAdapter(MainActivity.this, getData()));
 36
 37     }
 38
 39     private List<Data> getData() {
 40
 41         List<Data> data = new ArrayList<>();
 42
 43         data.add(new Data(R.drawable.xiaona, "薄荷栗", "我学过跆拳道,都给我跪下唱征服", "昨天"));
 44         data.add(new Data(R.drawable.xueyan, "欣然", "走遍天涯海角,唯有我家风景最好,啊哈哈", "昨天"));
 45         data.add(new Data(R.drawable.leishao, "陈磊_CL", "老子以后要当行长的,都来找我借钱吧,now", "昨天"));
 46         data.add(new Data(R.drawable.yuhong, "永恒依然", "房子车子都到碗里来", "昨天"));
 47         data.add(new Data(R.drawable.lanshan, "蓝珊", "你们这群傻×,我笑而不语", "昨天"));
 48
 49         return data;
 50     }
 51
 52     class MyAdapter extends BaseAdapter {
 53         private List<Data> listdata;
 54         private Context context;
 55
 56         public MyAdapter(Context context, List<Data> listdata) {
 57             this.context = context;
 58             this.listdata = listdata;
 59         }
 60
 61         @Override
 62         public int getCount() {
 63             return listdata.size();
 64         }
 65
 66         @Override
 67         public Object getItem(int arg0) {
 68             return listdata.get(arg0);
 69         }
 70
 71         @Override
 72         public long getItemId(int arg0) {
 73             return arg0;
 74         }
 75
 76         @Override
 77         public View getView(int position, View convertView, ViewGroup parent) {
 78
 79             LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
 80             convertView = inflater.inflate(R.layout.listview_item, null, false);
 81
 82             // 带赋值区域
 83             ImageView ivPortrait = (ImageView) convertView.findViewById(R.id.portrait);
 84             TextView tvNickName = (TextView) convertView.findViewById(R.id.nick_name);
 85             TextView tvContent = (TextView) convertView.findViewById(R.id.content);
 86             TextView tvCreatedAt = (TextView) convertView.findViewById(R.id.created_at);
 87             ImageView moreBtn = (ImageView) convertView.findViewById(R.id.more_btn);
 88
 89             // 赋值
 90             Data data = listdata.get(position);
 91             ivPortrait.setImageResource(data.getPortraitId());
 92             tvNickName.setText(data.getNickName());
 93             tvContent.setText(data.getContent());
 94             tvCreatedAt.setText(data.getCreatedAt());
 95
 96             // 更多按钮的点击事件
 97             moreBtn.setOnClickListener(new View.OnClickListener() {
 98                 @Override
 99                 public void onClick(View v) {
100                     showMore(v);
101                 }
102             });
103
104             return convertView;
105         }
106
107         /**
108          * 弹出点赞和评论框
109          *
110          * @param moreBtnView
111          */
112         private void showMore(View moreBtnView) {
113
114             if (mMorePopupWindow == null) {
115
116                 LayoutInflater li = (LayoutInflater) MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
117                 View content = li.inflate(R.layout.layout_more, null, false);
118
119                 mMorePopupWindow = new PopupWindow(content, ViewGroup.LayoutParams.WRAP_CONTENT,
120                         ViewGroup.LayoutParams.WRAP_CONTENT);
121                 mMorePopupWindow.setBackgroundDrawable(new BitmapDrawable());
122                 mMorePopupWindow.setOutsideTouchable(true);
123                 mMorePopupWindow.setTouchable(true);
124
125                 content.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);
126                 mShowMorePopupWindowWidth = content.getMeasuredWidth();
127                 mShowMorePopupWindowHeight = content.getMeasuredHeight();
128
129                 View parent = mMorePopupWindow.getContentView();
130
131                 TextView like = (TextView) parent.findViewById(R.id.like);
132                 TextView comment = (TextView) parent.findViewById(R.id.comment);
133
134                 // 点赞的监听器
135                 like.setOnClickListener(new View.OnClickListener() {
136                     @Override
137                     public void onClick(View v) {
138
139                         final AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
140                         alert.setTitle("点赞");
141                         alert.setNegativeButton("取消", null);
142                         alert.show();
143                     }
144                 });
145
146                 // 评论的监听器
147                 comment.setOnClickListener(new View.OnClickListener() {
148                     @Override
149                     public void onClick(View v) {
150                         final AlertDialog.Builder alert = new AlertDialog.Builder(MainActivity.this);
151                         alert.setTitle("评论");
152                         alert.setNegativeButton("取消", null);
153                         alert.show();
154                     }
155                 });
156             }
157
158             if (mMorePopupWindow.isShowing()) {
159                 mMorePopupWindow.dismiss();
160             } else {
161                 int heightMoreBtnView = moreBtnView.getHeight();
162
163                 mMorePopupWindow.showAsDropDown(moreBtnView, -mShowMorePopupWindowWidth,
164                         -(mShowMorePopupWindowHeight + heightMoreBtnView) / 2);
165             }
166         }
167     }
168
169     class Data {
170         private int portraitId; // 头像
171         private String nickName; // 昵称
172         private String content; // 说说
173         private String createdAt; // 发布时间
174
175         public Data(int portraitId, String nickName, String content, String createdAt) {
176             this.portraitId = portraitId;
177             this.nickName = nickName;
178             this.content = content;
179             this.createdAt = createdAt;
180         }
181
182         public int getPortraitId() {
183             return portraitId;
184         }
185
186         public String getNickName() {
187             return nickName;
188         }
189
190         public String getContent() {
191             return content;
192         }
193
194         public String getCreatedAt() {
195             return createdAt;
196         }
197     }
198
199 }
时间: 2024-10-25 18:27:22

PopupWindow 仿微信点赞和评论弹出的相关文章

Android PopupWindow 仿微信弹出效果

项目中,我需要PopupWindow的时候特别多,这个东西也特别的好使,所以我今天给大家写一款PopupWindow 仿微信弹出效果,这样大家直接拿到项目里就可以用了!首先让我们先看效果: 那么我首先先看下布局代码非常简单:如下 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/pop_layout" android:layout_

【转】swift实现ios类似微信输入框跟随键盘弹出的效果

swift实现ios类似微信输入框跟随键盘弹出的效果 为什么要做这个效果 在聊天app,例如微信中,你会注意到一个效果,就是在你点击输入框时输入框会跟随键盘一起向上弹出,当你点击其他地方时,输入框又会跟随键盘一起向下收回,二者完全无缝连接,那么这是怎么实现的呢,也许你会说直接在键盘弹出的时候把输入框也向上移动不就行了?但是我使用这种方法的时候,发现效果十分不理想,会有明显的滞后现象,原因有以下几点: 键盘弹出动画并不是匀速,键盘和输入框的时间曲线不完全一致,运动不同步 各种键盘的高度不一样(比如

【android开发】使用PopupWindow实现页面点击顶部弹出下拉菜单

没有太多花样,也没有很复杂的技术,就是简单的PopupWindow的使用,可以实现点击弹出一个自定义的view,view里可以随便设计,常用的可以放一个listview. demo中我只是一个点击展示,简单的使用了fade in out的动画效果,也没有精美的图片资源,看着也丑,不过这么短的时间,让你掌握一个很好用的技术,可以自己扩展,不很好么? 废话不说了,直接上代码: MainActivity.java [java] view plaincopy public class MainActiv

Android封装类似微信的顶部TitleBar弹出的PopupWindow代码

Android仿微信顶部titlebar,点击加号弹出的PopupWindow,是封装好的PopupWindow,直接拿来用即可,先看效果图:  调用代码非常简单,这是MainActivity的代码: public class MainActivity extends AppCompatActivity { private TitlePopup titlePopup; @Override protected void onCreate(Bundle savedInstanceState) { s

微信/QQ打开网址弹出遮罩提示用户在外部浏览器中打开

使用微信打开网址时,无法在微信内打开app的下载链接.网上流传的各种微信打开下载链接,微信已更新基本失效,下面分享目前还可用的方案. 解决方案:弹出一个遮罩,提示用户在浏览器中打开进行下载或者是打开网页 在微信/QQ中打开链接,判断如果是在微信/QQ中打开的,直接弹出一个遮罩,提示用户在浏览器中打开,然后下载app应用.这样子再也不用管微信如何的更新,都可以实现微信中打开浏览器并下载app应用了. 需要微信遮罩,可加我的QQ: 1747006063 备注一下(微信遮罩) 文章转自熊猫源码:htt

微信/QQ打开网址弹出引导页引导在外部浏览器中打开

使用微信打开网址时,无法在微信内打开app的下载链接.网上流传的各种微信打开下载链接,微信已更新基本失效,下面分享目前还可用的方案. 解决方案:弹出一个遮罩,提示用户在浏览器中打开进行下载或者是打开网页 在微信/QQ中打开链接,判断如果是在微信/QQ中打开的,直接弹出一个遮罩,提示用户在浏览器中打开,然后下载app应用.这样子再也不用管微信如何的更新,都可以实现微信中打开浏览器并下载app应用了. 需要微信遮罩,可加我的QQ: 1747006063 备注一下(微信遮罩) 文章转自熊猫源码:htt

IOS微信点击input弹出输入法,关闭后页面留白解决方案

场景:IOS用微信点击input框弹出输入法后 不管你是输入信息,还是不输入直接点完成关闭输入法,都会导致页面被挤上去后产生留白,从而改变页面布局             解决方法: 给input添加blur(失去焦点)事件,让页面强制回滚,距离为0,代码如下 $("input").blur(function(){ document.body.scrollTop = document.documentElement.scrollTop = 0; }); 原文出处:https://blo

微信小程序-自定义弹出框

<---------------------------------定义组建-------------------------------------------------------------------------> // components/component-tag-name.js Component({ options: { multipleSlots: true // 在组件定义时的选项中启用多slot支持 }, /** * 组件的属性列表 */ properties: {

仿微信右上角弹出菜单

使用PopupWindow实现仿微信右上角弹出菜单. 效果图如下: popupWindow代码如下: import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import com.stcyclub.e_community.R; import android.app.Activity; import android.content.Context; impo