android popWindow组件微信式实现(较完整版)

效果

在这里插入图片描述

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>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1620369.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

前端学习第四周

目录 一.position定位1.1定位的用法&#xff08;写法&#xff09;1.2relative相对定位1.2.1特性1.2.2实际案例 1.3absolute绝对定位1.3.1特性1.3.2实际案例 1.4fixed&#xff1a;固定定位1.4.1特性1.4.2实际案例 1.5sticky粘性定位1.5.1特性1.5.2实际案例 1.6z-index定位层级1.…

Web前端4

一、relative相对定位 position定位 1.position特性 css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则决定了该元素的最终位置。 2.position取值 static(默认) relative absolute fixed sticky relative相对定位 1.如果没有定位偏移量&am…

Flutter 城市/通讯录列表字母索引联动效果实现

前言 在像通讯录&#xff0c;联系人列表&#xff0c;城市选择列表等数据量比较多的长列表页面中&#xff0c;我们经常会留意到产品设计会在页面的右侧区域提供一个竖向的字母索引列表&#xff0c;供用户点击选择快速定位到长列表中的指定索引位置&#xff0c;以便于用户快速定位…

快给你的Vue项目添加一个编辑图片组件吧

一款功能极其强大的图片编辑插件 tui.image-editor 快速体验 首选在你的前端项目中安装&#xff1a; npm i tui-image-editor // or yarn add tui-image-editor现在你就去新建一个.vue文件&#xff0c;复制进去下面这段代码&#xff1a; <template><div id"t…

QTableWidget表格控件的用法(非常详细)

QTableWidget表格控件的用法&#xff08;非常详细&#xff09; [1] QTableWidget表格控件的用法&#xff08;非常详细&#xff09;[2] QTableWidget详解1.常用API设置自动调整行高和列宽设置表格内容是否可编辑设置行表头、列表头是否显示 2.添加子项3.右键弹出菜单4.设置风格5…

如果你觉得自己对 CSS 变量不熟悉,那么可以补充这个!

作者&#xff1a; Ahmad Shadeed 译者&#xff1a;前端小智 来源&#xff1a;ishadeed 点赞再看&#xff0c;养成习惯 本文 GitHub https://github.com/qq449245884/xiaozhi 上已经收录&#xff0c;更多往期高赞文章的分类&#xff0c;也整理了很多我的文档&#xff0c;和教程资…

VMware中配置NAT方式上网 by.zyw

VMware中配置NAT方式上网 by.zyw 看了本站上众大神的VMware配置NAT方式上网的文章后&#xff0c;发现在本人电脑上并不能完全设置成功&#xff0c;在自己摸索后&#xff0c;虚拟机配置NAT方式上网成功&#xff0c;下列个人实际操作经验&#xff1a; NAT模式介绍&#xff1a; …

在线文档 - Google 文档的数据协议设计

在线文档 - Google 文档的数据协议设计 Google 文档作为 G Suite 重要的产品套件之一&#xff0c;作为优秀的在线协作文档而经常被开发者所讨论&#xff0c;在 Google 文档背后&#xff0c;有着一整套优秀的相关架构设计支撑&#xff0c;数据协议设计就是其中之一&#xff0c;非…

数仓--------简单了解

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

分类预测 | MATLAB实现SSA-CNN-SVM基于麻雀算法优化卷积支持向量机分类预测

分类预测 | MATLAB实现SSA-CNN-SVM基于麻雀算法优化卷积支持向量机分类预测 目录 分类预测 | MATLAB实现SSA-CNN-SVM基于麻雀算法优化卷积支持向量机分类预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 MATLAB实现SSA-CNN-SVM基于麻雀算法优化卷积支持向量机分类预测…

Prima Cartoonizer v3.1.4一键生成专属动漫头像,

不少小伙伴都想获取一个自己的专属动漫头像&#xff0c;但是要请画师帮忙画一张又不便宜。 今天小编就带来一款可以将图像一键转动漫效果的软件&#xff0c;内含了近40种不同的动漫模板&#xff0c;还有各种卡通眼睛、眼镜及漫画常用的贴图工具 满足你的各种漫画头像制作需求…

高中信息技术教资考试模拟卷(22下)

2022 年下半年全国教师资格考试模考卷一 &#xff08;高中信息技术&#xff09; 一、单项选择题&#xff08;本大题共 15 小题&#xff0c;每小题 3 分&#xff0c;共 45 分&#xff09; 1.2006 年 10 月 25 日&#xff0c;深圳警方成功解救出一名被网络骗子孙某…

RHCE——八、DNS域名解析服务器

RHCE 一、概述1、产生原因2、作用3、连接方式4、因特网的域名结构4.1 拓扑4.2 分类4.3 域名服务器类型划分 二、DNS域名解析过程1、分类2、解析图&#xff1a;2.1 图&#xff1a;2.2 过程分析 三、搭建DNS域名解析服务器1、概述2、安装软件3、/bind服务中三个关键文件4、配置文…

string类中的一些问题

前言&#xff1a;C中的string类是继承C语言的字符数组的字符串来实现的&#xff0c;其中包含许多C的字符串的相关知识的同时&#xff0c;也蕴含很多的类与对象的相关知识&#xff0c;在面试中&#xff0c;面试官总喜欢让学生自己来模拟实现string类&#xff0c;最主要是实现str…

select语句详细解释

SELECT 语句的基本格式为&#xff1a; SELECT 要查询的列名 FROM 表名字 WHERE 限制条件; SELECT 语句常常会有 WHERE 限制条件&#xff0c;用于达到更加精确的查询。WHERE 限制条件可以有数学符号 ( < > > <) select name,age from employee where salary>3500…

go中select语句

在golang语言中&#xff0c;select语句 就是用来监听和channel有关的IO操作&#xff0c;当IO操作发生时&#xff0c;触发相应的case动作。有了 select语句&#xff0c;可以实现 main主线程 与 goroutine线程 之间的互动。 select {case <-ch1 : // 检测有没有数据可读//…

SQL SELECT语句

SQL语句是由简单地英语单词构成的。这些单词称为关键字&#xff0c;每个SQL语句都是由一个或多个关键字构成的。最经常使用的SQL语句大概就是SELECT语句了&#xff0c;它的用途是从一个或多个表中检索信息 SELECT 语句用于从数据中选取数据。 结果被存储在一个结果表中&#…

权限提升-手工-系统权限提升

权限提升基础信息 1、具体有哪些权限需要我们了解掌握的&#xff1f; 后台权限&#xff0c;网站权限&#xff0c;数据库权限&#xff0c;接口权限&#xff0c;系统权限&#xff0c;域控权限等 2、以上常见权限获取方法简要归类说明&#xff1f; 后台权限&#xff1a;SQL注入,数…

5 群起集群

1.在启动集群之前&#xff0c;先配置workers,有几个节点就配置几个 [atguiguhadoop102 hadoop]$ vim /opt/module/hadoop-3.1.3/etc/hadoop/workers在该文件中增加如下内容&#xff1a; hadoop102 hadoop103 hadoop104 注意&#xff1a;该文件中添加的内容结尾不允许有空格&a…

K车模长得啥样?

根据 第十六届全国大学智能汽车竞赛竞速比赛规则-讨论稿 中的“单车拉力组”要求&#xff0c;车模使用K型车模&#xff0c;这是一个前后轮的电单车。那么究竟它长的啥样呢&#xff1f; 下面是由车模生产厂商提供的Solidwork车模3D模型截图。 ▲ 左上方的视图 ▲ 后上方的视图 …