效果

PopWinLayout

package com.coral3.common_module.components;import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.PopupWindow;
import androidx.annotation.Nullable;
import com.coral3.common_module.R;
import com.coral3.common_module.adapter.PopWindowAdapter;
import com.coral3.common_module.model.PopModel;
import java.util.ArrayList;
import java.util.List;public class PopWinLayout extends LinearLayout {private Context mContext;private ListView lv;private ImageView asDropDownView;private PopupWindow window;private List data = new ArrayList<>();private View view;private PopWindowAdapter adapter;// 定义window的宽度private int windowWidth = 363;private Boolean popWinIsShow = false;private ICallback mICallback;private Handler handler = new Handler(new Handler.Callback(){@Overridepublic boolean handleMessage(Message message) {if(message.what == 0x00) popWinIsShow = false;return false;}});public PopWinLayout(Context context, @Nullable AttributeSet attrs) {super(context, attrs);mContext = context;initView();initLocalData();initPop();initLisener();}private void initView(){view = LayoutInflater.from(mContext).inflate(R.layout.layout_pop_window, this);}private void initLisener(){//消失监听听window.setOnDismissListener(new PopupWindow.OnDismissListener() {@Overridepublic void onDismiss() {handler.sendEmptyMessageDelayed(0x00, 100);}});lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {mICallback.onItemClick(i, ((PopModel)data.get(i)).getText());hidePopView();}});}private void initLocalData(){data.add(new PopModel(R.mipmap.msg, "发起群聊"));data.add(new PopModel(R.mipmap.msg, "添加好友"));data.add(new PopModel(R.mipmap.msg, "扫一扫"));data.add(new PopModel(R.mipmap.msg, "收付款"));data.add(new PopModel(R.mipmap.msg, "帮助与反馈"));}private void initPop(){//获取其中的ListViewlv = view.findViewById(R.id.lv_pop_list);//设置适配adapter = new PopWindowAdapter(mContext, R.layout.custom_spinner_dropdown_item, data);lv.setAdapter(adapter);//创建PopupWindow对象window = new PopupWindow(this);//给PopupWindow设置一个Viewwindow.setContentView(view);//设置宽和高window.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);window.setWidth(windowWidth);//点击窗口意外  窗口消失window.setOutsideTouchable(true);}public void setDropDownBtn(ImageView v){asDropDownView = v;}public void showPopView(){//显示在某个控件的下方if(null != asDropDownView) {window.showAsDropDown(asDropDownView, 0, 33, Gravity.RIGHT);popWinIsShow = true;}}public void hidePopView(){//显示在某个控件的下方if(null != asDropDownView) {window.dismiss();popWinIsShow = false;}}public void setData(List data){this.data = data;adapter.notifyDataSetChanged();}public Boolean getPopWinStatus(){return popWinIsShow;}public void setPopWinStatus(Boolean status){popWinIsShow = status;}public void setICallback(ICallback iCallback){mICallback = iCallback;}public interface ICallback{void onItemClick(int pos, String name);}
}

## PopModel

package com.coral3.common_module.model;public class PopModel {private int imageId;private String text;public int getImageId() {return imageId;}public void setImageId(int imageId) {this.imageId = imageId;}public String getText() {return text;}public void setText(String text) {this.text = text;}public PopModel(int imageId, String text) {this.imageId = imageId;this.text = text;}public PopModel() {}
}

TitleLayout

package com.coral3.common_module.components;import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.Nullable;
import com.coral3.common_module.R;public class TitleLayout extends LinearLayout {private TextView title;private Context mContext;private View view;private TextView back;private ImageView btnRight;private PopWinLayout popLayout;public TitleLayout(Context context, @Nullable AttributeSet attrs) {super(context, attrs);mContext = context;initView();initListener();}private void initView(){view = LayoutInflater.from(mContext).inflate(R.layout.layout_title, this);back = view.findViewById(R.id.btn_back);btnRight = view.findViewById(R.id.btn_right);title = view.findViewById(R.id.tv_title);title.setText("标题");popLayout = new PopWinLayout(mContext, null);popLayout.setDropDownBtn(btnRight);}private void initListener(){back.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View view) {}});btnRight.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View view) {if(popLayout.getPopWinStatus()){popLayout.hidePopView();} else{popLayout.showPopView();}}});}@Overridepublic boolean onTouchEvent(MotionEvent arg0) {getParent().requestDisallowInterceptTouchEvent(true);return true;}public void showRightView(){btnRight.setVisibility(View.VISIBLE);}public void setTitle(String v){title.setText(v);}public void setRightItemCallback(PopWinLayout.ICallback iCallback){if(null != popLayout) popLayout.setICallback(iCallback);}
}

Triangle

package com.coral3.common_module.components;import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.View;
import androidx.annotation.Nullable;
import com.coral3.common_module.utils.DensityUtils;/*** 绘制三角形* Update by WTY on 2021/8/4/63*/public class Triangle extends View {private int mWidth = 0; //三角形的宽度private int mHeight = 0; //三角形的高度private Context mContext;public Triangle(Context context, @Nullable AttributeSet attrs) {super(context, attrs);this.mContext = context;initView();}public Triangle(Context context) {super(context);}private void initView() {mWidth = DensityUtils.dp2px(10);mHeight = DensityUtils.dp2px(6);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);setMeasuredDimension(mWidth,mHeight);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//创建画笔Paint paint = new Paint();paint.setColor(Color.parseColor("#434343"));paint.setAntiAlias(true); //抗锯齿paint.setStyle(Paint.Style.FILL);//实线//创建路径Path path = new Path();path.moveTo(0,mHeight);path.lineTo(mWidth,mHeight);path.lineTo(mWidth/2,0);path.close();//闭合路径//画在画布上canvas.drawPath(path,paint);}
}

PopWindowAdapter

package com.coral3.common_module.adapter;import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.coral3.common_module.R;
import com.coral3.common_module.model.PopModel;
import java.util.List;public class PopWindowAdapter extends ArrayAdapter<PopModel> {private int resource;private Context context;public PopWindowAdapter(@NonNull Context context, int resource, @NonNull List<PopModel> objects) {super(context, resource, objects);this.resource = resource;this.context = context;}@NonNull@Overridepublic View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {PopModel popModel = getItem(position);MyHolder myHolder = new MyHolder();if(null == convertView){convertView = LayoutInflater.from(context).inflate(resource, parent, false);myHolder.ivFruit = convertView.findViewById(R.id.iv_fruit);myHolder.tvFruit = convertView.findViewById(R.id.tv_fruit);convertView.setTag(myHolder);}else{myHolder = (MyHolder) convertView.getTag();}myHolder.ivFruit.setImageResource(popModel.getImageId());myHolder.tvFruit.setText(popModel.getText());return convertView;}class MyHolder {ImageView ivFruit;TextView tvFruit;}
}

DensityUtils

package com.coral3.common_module.utils;import android.util.TypedValue;/*** 常用单位转换类* @author WTY*/
public class DensityUtils {private DensityUtils() {throw new UnsupportedOperationException("cannot be instantiated");}/*** dp转px* @param dpVal* @return*/public static int dp2px(float dpVal) {return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,dpVal, InitUtil.getContext().getResources().getDisplayMetrics());}/*** sp转px* @param spVal* @return*/public static int sp2px(float spVal) {return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,spVal, InitUtil.getContext().getResources().getDisplayMetrics());}/*** px转dp* @param pxVal* @return*/public static float px2dp(float pxVal) {final float scale = InitUtil.getContext().getResources().getDisplayMetrics().density;return (pxVal / scale);}/*** px转sp* @param pxVal* @return*/public static float px2sp(float pxVal) {return (pxVal / InitUtil.getContext().getResources().getDisplayMetrics().scaledDensity);}
}

ToastUtil

package com.coral3.common_module.utils;import android.content.Context;
import android.view.Gravity;
import android.widget.Toast;public class ToastUtil {public static Toast toast;public static void showMsg(Context context, String msg){if(toast != null) toast.cancel();toast = Toast.makeText(context, msg, Toast.LENGTH_SHORT);toast.setGravity(Gravity.CENTER, 0, 0);toast.show();}
}

DetailActivity

package com.coral3.ah.ui;import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.coral3.ah.R;
import com.coral3.common_module.components.PopWinLayout;
import com.coral3.common_module.components.TitleLayout;
import com.coral3.common_module.utils.ToastUtil;public class DetailActivity extends AppCompatActivity implements PopWinLayout.ICallback{private TitleLayout titleLayout;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_detail);initView();initListener();}private void initView(){titleLayout = findViewById(R.id.tl_title);titleLayout.showRightView();titleLayout.setTitle("详情");}private void initListener(){titleLayout.setRightItemCallback(this);}@Overridepublic void onItemClick(int pos, String name) {ToastUtil.showMsg(DetailActivity.this, name);}
}

layout_pop_window.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:orientation="vertical"android:layout_height="wrap_content"><com.coral3.common_module.components.Triangleandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="33dp"android:layout_gravity="center_horizontal"/><LinearLayoutandroid:background="@drawable/bg_radius"android:layout_width="wrap_content"android:layout_height="wrap_content"><ListViewandroid:id="@+id/lv_pop_list"android:divider="#434343"android:dividerHeight="0.1dp"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout>
</LinearLayout>

bg_radius

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:orientation="vertical"android:layout_height="wrap_content"><com.coral3.common_module.components.Triangleandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="33dp"android:layout_gravity="center_horizontal"/><LinearLayoutandroid:background="@drawable/bg_radius"android:layout_width="wrap_content"android:layout_height="wrap_content"><ListViewandroid:id="@+id/lv_pop_list"android:divider="#434343"android:dividerHeight="0.1dp"android:layout_width="wrap_content"android:layout_height="wrap_content"/></LinearLayout>
</LinearLayout>

android popWindow组件微信式实现(较完整版)相关推荐

  1. (转载)7 .24张小龙内部讲座《通过微信谈产品》完整版

     7 .24张小龙内部讲座<通过微信谈产品>完整版 benimaru zhang 2012-08-01 22:26 18条评论  编者按:7月24日微信之父张小龙在腾讯内部的一次讲座, ...

  2. Android版的疯狂猜图游戏源码完整版分享

    这个游戏源码是在安装教程网那么分享过来的,Android版的疯狂猜图游戏源码完整版分享,也是本人之前很早以前发的一款游戏源码的,大家如果想了解一下,可以看看吧,不说多了,上一个图先吧.   > ...

  3. Android掌中游斗地主游戏源码完整版

    源码大放送-掌中游斗地主(完整版),集合了单机斗地主.网络斗地主.癞子斗地主等,有史以来最有参考价值的源码,虽然运行慢了一点但是功能正常,用的是纯java写的. 项目详细说明:http://andro ...

  4. 鹅厂流出两份Android Framework技术宝典火了,完整版 PDF 限时开放下载

    前言 最近互联网大厂的"裁员潮"愈演愈烈-- 如何破局?我想最重要的一点:不断提升个人价值. Android Framework的重要性 Android Framework 开发虽 ...

  5. 魅蓝2 刷 android,魅蓝2全系列-解锁BootLoader完整版+刷入第三方recovery+刷入第三方ROM教程...

    本教程适合于魅族魅蓝2手机,由于魅族解锁BL门槛较高,如果你真的是小白,不敢折腾 请不要往下看,如何你是敢于动手,那么就继续往下看,跟着教程走,百分百可以成功 文件下载: 也可以关注微信公众号:ROM ...

  6. 完结!《沉浸式线性代数》完整版正式发布,全交互式体验

    点击上方"AI有道",选择"星标"公众号 重磅干货,第一时间送达 两个月前,红色石头发文介绍过一本非常棒的在线线性代数教程,名为<Immersive Li ...

  7. 字节大佬封神之作《Android Framework高级开发笔记》,完整版开放下载

    在现阶段的Android开发工作中,无论是底层,还是应用层,Framework都至关重要.Framework的火热程度,相信我也不必再赘述. 为帮助大家深度学习Framework背景及它的巨大作用,这 ...

  8. Java SpringMVC实现PC端网页微信扫码支付完整版

    一:前期微信支付扫盲知识 前提条件是已经有申请了微信支付功能的公众号,然后我们需要得到公众号APPID和微信商户号,这个分别在微信公众号和微信支付商家平台上面可以发现.其实在你申请成功支付功能之后,微 ...

  9. 高仿精仿微信客户端源码完整版

    给大家分享一款现在非常流行,又受欢迎的源码,该源码十分难得,希望大家下载学习一下,升级功能一下. 源码下载: http://android.662p.com/thread-47-1-1.html

  10. 著名的海龟式期货交易系统完整版来了!值得收藏!

    导读: 著名的交易大师理查德·丹尼斯想弄清伟大的交易员是天生造就的还是后天培养的,为此,在1983年他招募了13个人,教授给他们期货交易的基本概念,以及他自己的交易方法和原则,学员们被称为" ...

最新文章

  1. java别踩白块_java别踩白块(基础功能)
  2. 更新假设raw file(audio file format) How to convert endianness
  3. BUUCTF-WEB:[极客大挑战 2019]Havefun 1
  4. SecureCRT 或者 超级终端 始终无法ping通主机
  5. 转adb Shell root 权限
  6. 数组对象常用处理方案(算法思路)
  7. LeetCode 783二叉搜索树节点最小距离-简单
  8. jsp mysql优点_asp、php、asp.net、jsp的介绍和各自的优缺点
  9. python全套完整教程-Python全套教程
  10. 为什么我们公司强制弃坑Fastjson了?主推...
  11. 基于R语言绘制BBC风格图表
  12. 一些学习的网址和资料
  13. 关于MyBatis一级缓存、二级缓存那些事
  14. 【BottomBar】Android炫酷的底部切换
  15. 前端实现很哇塞的浏览器端扫码功能
  16. 【贪玩巴斯】无线传感器网络(二)「无线传感器网络中物理层的五点详解」 2021-09-24
  17. php和ar的关系,vr与ar的区别
  18. 服务器之间如何实现网络共享
  19. 编写类A2, 定义方法find, 实现查找某字符串数组中的元素查找,并返回索引,如果找不到,返回-1
  20. 基于python的语料库数据处理_基于Python的语料库数据处理(三)

热门文章

  1. 【Python讲义】WEEK 4
  2. java 项目骨架,maven项目中骨架
  3. 读完这篇文章,你就是下一个时间管理大师。
  4. ABOUTCG发布Maya 刚体特效完全教程
  5. Windows10 如何禁用或删除大的Hiberfil.sys和Pagefile.sys文件
  6. 云更新网吧系统服务器,网吧云更新系统使用图文教程
  7. Enchanted —— Taylor Swift
  8. vs下活动解决方案管理器中x86 x64 win32 anycpu arm的区别
  9. 网页全屏的代码实现要不要了解一下(最全)
  10. 压缩包修改所属目录Linux,linux文件/目录/压缩解压 操作指令