我们在工作中肯定需要用到许多工具类下面我们介绍的是popWindow的Base类
代码如下

@SuppressLint("UseSparseArrays")
public abstract class BasePopupWindow implements OnClickListener {protected PopupWindow mPop;protected View mContentView;protected Activity mAct;protected int mWidth = -2;protected int mHeight = -2;private String mTag;protected boolean mDismiss = true;protected Map<Integer, Integer> mViewDrawableSelectCache;protected boolean openAnimation;public BasePopupWindow(Activity act, int width, int height) {//宽高充满屏幕mAct = act;mWidth = width;mHeight = height;init();}private void init() {onCreate();findViews();setListenerNative();initViewDrawableSelectCache();loadData();initPopAnimationStyle();}protected void initPopAnimationStyle() {if (openAnimation) {mPop.setAnimationStyle(R.style.listPopAnimation);//设置弹窗出现的动画效果}}private void setListenerNative() {mPop.setOnDismissListener(new OnDismissListener() {@Overridepublic void onDismiss() {if (mAct instanceof ICoveringLayer) {ICoveringLayer layout = (ICoveringLayer) mAct;// 影藏activity的覆盖层layout.hideCoveringLayer();}}});setListener();}protected void loadData() {}protected abstract void setListener();protected abstract void findViews();protected void onCreate() {mViewDrawableSelectCache = new HashMap<Integer, Integer>();PopupWindow pop = mPop = createPopWindow();mPop.setAnimationStyle(R.style.listPopAnimation);// 设置窗口显示的动画效果pop.setBackgroundDrawable(new ColorDrawable(0));// 点击窗口外消失pop.setFocusable(true);pop.setTouchable(true);pop.setOutsideTouchable(true);// 点击窗口外消失,需要设置背景、焦点、touchable、update}protected PopupWindow createPopWindow() {if (mContentView == null) {int id = getContentViewLayoutId();mContentView = inflate(id, null, true);}return new PopupWindow(mContentView, mWidth, mHeight);}@SuppressWarnings("unchecked")protected <T> T findViewById(int id) {return (T) mContentView.findViewById(id);}protected abstract int getContentViewLayoutId();protected ViewGroup inflate(int id, ViewGroup root, boolean attachToRoot) {return (ViewGroup) mAct.getLayoutInflater().inflate(id, root, attachToRoot);}@SuppressWarnings("unused")private String getTag() {if (TextUtils.isEmpty(mTag)) {mTag = getClass().getCanonicalName();}return mTag;}public View getContentView() {return mContentView;}public boolean isShow() {return mPop.isShowing();}/*** 初始化view在点击时的图片集合 key view的id value view所对应被点击时的背景图片** @return*/protected abstract void initViewDrawableSelectCache();@Overridepublic void onClick(View v) {Integer resid = mViewDrawableSelectCache.get(v.getId());if (resid != null) {v.setBackgroundResource(resid);} else {int color = getDefaultBackgroundColor();if (color != -1) {v.setBackgroundColor(color);}}onItemClick(v);}protected int getDefaultBackgroundColor() {return -1;}private void onItemClick(final View v) {v.postDelayed(new Runnable() {@Overridepublic void run() {if (mDismiss) {mPop.dismiss();}onItemClick(v, mPop);}}, 100);}protected abstract void onItemClick(View view, PopupWindow pop);public void show() {onShowPre();ShowLocation location = getShowLocation();if (mAct instanceof ICoveringLayer) {ICoveringLayer layout = (ICoveringLayer) mAct;// 显示activity的覆盖层(遮盖)layout.showCoveringLayer();}location.parent = location.parent == null ? mAct.getWindow().getDecorView() : location.parent;PopupWindow pop = mPop;pop.showAtLocation(location.parent, location.gravity, location.x, location.y);pop.setFocusable(false);pop.update();location.parent.post(new Runnable() {@Overridepublic void run() {onShowPost();}});}protected void startShowAnimition() {}public void dismiss() {startDismissAnimationAndDismiss();}protected void startDismissAnimationAndDismiss() {mPop.dismiss();}/*** PopupWindow显示之前调用*/protected void onShowPre() {}/*** PopupWindow显示之后调用*/protected void onShowPost() {startShowAnimition();}protected ShowLocation getShowLocation() {return new ShowLocation(mAct.getWindow().getDecorView(), Gravity.CENTER, 0, 0);}protected class ShowLocation {public int x;public int y;public int gravity = Gravity.NO_GRAVITY;public View parent;public ShowLocation(int x, int y) {this.x = x;this.y = y;}public ShowLocation(int gravity, int x, int y) {this(x, y);this.gravity = gravity;}public ShowLocation(View parent, int gravity, int x, int y) {this(gravity, x, y);this.parent = parent;}}public void setAnimationStyle(int animationStyle){mPop.setAnimationStyle(animationStyle);}}

之后我们需要添加开始出去的动画

<!-- popWindow 动画 --><style name="listPopAnimation"><item name="android:windowEnterAnimation">@anim/tran_start_pop_in</item><item name="android:windowExitAnimation">@anim/tran_finish_pop_out</item></style>

开始动画

<set xmlns:android="http://schemas.android.com/apk/res/android"><alpha
        android:duration="20"android:fromAlpha="0.0"android:interpolator="@android:anim/decelerate_interpolator"android:toAlpha="1.0" />
</set>

结束动画

<set xmlns:android="http://schemas.android.com/apk/res/android"><alpha
            android:duration="20"android:fromAlpha="1.0"android:interpolator="@android:anim/decelerate_interpolator"android:toAlpha="0.0" /></set>

基本工具类就完成了下面是具体子类实现

public class AlertPopuWindow extends BasePopupWindow {private LinearLayout delete_pop_layout;private TextView queding_text;private TextView title_text;private String title;public AlertPopuWindow(Activity act) {this(act ,null);}public AlertPopuWindow(Activity act, String title) {super(act, ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.FILL_PARENT);this.title = title;}@Overrideprotected void setListener() {delete_pop_layout.setOnClickListener(this);queding_text.setOnClickListener(this);title_text.setOnClickListener(new MyClickListener());}@Overrideprotected void findViews() {delete_pop_layout = (LinearLayout) findViewById(R.id.delete_pop_layout);title_text = (TextView) findViewById(R.id.title_text);queding_text = (TextView) findViewById(R.id.queding_text);}@Overrideprotected int getContentViewLayoutId() {return R.layout.popu_warn_item;}@Overrideprotected void initViewDrawableSelectCache() {}@Overrideprotected void onShowPre() {super.onShowPre();title_text.setText(title);}@Overridepublic boolean isShow() {return super.isShow();}@Overrideprotected void onItemClick(View view, PopupWindow pop) {switch (view.getId()) {case R.id.delete_pop_layout:Log.e("点击了布局", "1111111");break;case R.id.queding_text:Log.e("点击了确定按钮","1111111");break;}}class MyClickListener implements View.OnClickListener{//@Overridepublic void onClick(View v) {switch (v.getId()){case R.id.title_text:Log.e("点击了标题","1111111");break;}}}
}

子类界面代码

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/delete_pop_layout"android:layout_width="match_parent"android:layout_height="match_parent"android:background="#40000000"android:gravity="center"android:layout_gravity="center"android:orientation="vertical" ><TextView
            android:id="@+id/title_text"android:background="@drawable/popu_background"android:paddingLeft="21dp"android:paddingRight="27px"android:paddingTop="27px"android:paddingBottom="27px"android:layout_width="450px"android:layout_height="wrap_content"android:textSize="27px"android:text="该牛为公牛不能进行妊时光说按时发生发上的方法反反复复反复发的说法是否问问问大水发暗室逢灯"android:textColor="#333333" /><TextView
                android:id="@+id/queding_text"android:textSize="24px"android:layout_width="450px"android:layout_height="72px"android:layout_marginLeft="0.5dp"android:background="@drawable/popu_background"android:gravity="center"android:text="确定"android:textColor="#0089e1" /></LinearLayout>

ok最后一步就是调用了代码如下

   new AlertPopuWindow(MainActivity.this,"哈哈").show();

工具类-BasePopupWindow相关推荐

  1. java日期转化工具类

    package com.rest.ful.utils;import java.text.DateFormat; import java.text.ParseException; import java ...

  2. java数据类型相互转换工具类

    package com.rest.ful.utils;import java.util.ArrayList; import java.util.HashMap; import java.util.Li ...

  3. 客快物流大数据项目(五十六): 编写SparkSession对象工具类

    编写SparkSession对象工具类 后续业务开发过程中,每个子业务(kudu.es.clickhouse等等)都会创建SparkSession对象,以及初始化开发环境,因此将环境初始化操作封装成工 ...

  4. [JAVA EE] Thymeleaf 常用工具类

    Thymeleaf 提供了丰富的表达式工具类,例如: #strings:字符串工具类 #dates:时间操作和时间格式化 #numbers:格式化数字对象的方法 #bools:常用的布尔方法 #str ...

  5. httpclient工具类,post请求发送json字符串参数,中文乱码处理

    在使用httpclient发送post请求的时候,接收端中文乱码问题解决. 正文: 我们都知道,一般情况下使用post请求是不会出现中文乱码的.可是在使用httpclient发送post请求报文含中文 ...

  6. spring boot 文件上传工具类(bug 已修改)

    以前的文件上传都是之前前辈写的,现在自己来写一个,大家可以看看,有什么问题可以在评论中提出来. 写的这个文件上传是在spring boot 2.0中测试的,测试了,可以正常上传,下面贴代码 第一步:引 ...

  7. SharePreference工具类

    安卓开发一般都需要进行数据缓存,常用操作老司机已为你封装完毕,经常有小伙伴问怎么判断缓存是否可用,那我告诉你,你可以用这份工具进行存储和查询,具体可以查看源码,现在为你开车,Demo传送门. 站点 S ...

  8. java录排名怎么写_面试官:Java排名靠前的工具类你都用过哪些?

    你知道的越多,不知道的就越多,业余的像一棵小草! 你来,我们一起精进!你不来,我和你的竞争对手一起精进! 编辑:业余草 推荐:https://www.xttblog.com/?p=5158 在Java ...

  9. 【转】 Android快速开发系列 10个常用工具类 -- 不错

    原文网址:http://blog.csdn.net/lmj623565791/article/details/38965311 转载请标明出处:http://blog.csdn.net/lmj6235 ...

  10. 兼容Silverlight4的实用的Silverlight可拖放工具类源代码

    开发日常的Silverlight应用程序时,常常要对一个域多个控件实现可拖放的MOUSE操作,在Silverlight中实现拖放的功能其实非常简单,但是为了提高程序功能代码的可复用性,程序员常常喜欢把 ...

最新文章

  1. linux下类似chkconfig的命令,Linux系统下chkconfig命令使用详解
  2. 图像中值处理MATLAB实现
  3. python参数化建模 书_Python 中如何实现参数化测试?
  4. python实现数字时钟_Python 写的全屏数字时钟软件,看看还有什么改进的地方
  5. linux中项目部署和日志查看
  6. 【php-laravel框架】第二节:laravel常用的扩展包汇总及安装教程
  7. spring + hibernate + 实体类 注解配置代码
  8. 虚拟机nfs服务器的安装,linux 安装nfs服务器
  9. 【电商系统】—项目梳理(一)
  10. nyoj 269 VF 动规
  11. markdown 流程图js_五分钟学会markdown基本语法
  12. Kali无线渗透获取宿舍WiFi密码(WPA)
  13. 全国计算机一级WORD第三套,全国计算机等级考试一级WPSOffice练习题及答案第三套.docx...
  14. 制作一个简单HTML电影网页设计(HTML+CSS)
  15. 基于UDP的效劳器端和客户端
  16. python基于机器学习的姓名预测性别网页app开发
  17. css+html实现倒三角
  18. 3dmax可编辑多边形的点对齐和线对齐方法
  19. C语言:任意从键盘输入一个三位整数,要求正确分离它的个位,十位和百位数,并分别在屏幕上输出。
  20. linux下访问windows分区,[浅议Linux中如何对Windows分区进行访问]Windows分区

热门文章

  1. Spring学习传送门
  2. CarbonData源码浅析一:Create Table
  3. 厦门大学信息计算机学院,厦门大学信息科学与技术学院计算机科学系导师介绍:刘向荣...
  4. Micro LED 巨量转移技术
  5. 大数据基础概念(一)
  6. 找不到或无法加载主类怎么办
  7. 内卷机器下的自我救赎
  8. Win11声卡驱动怎么更新?Win11声卡驱动更新方法
  9. 吴恩达机器学习课后作业6——使用支持向量机(svm)构建一个垃圾邮件分类器
  10. 移动中兴服务器地址,一中国移动宽带各地dns服务器地址.doc