先看效果图:

BasePopupWindowWithMask.class

 package com.example.popupwindowwithmask;

 import android.content.Context;
import android.graphics.PixelFormat;
import android.graphics.drawable.ColorDrawable;
import android.os.IBinder;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.PopupWindow; /**
* Created by kk on 2017/7/22.
*/ public abstract class BasePopupWindowWithMask extends PopupWindow {
protected Context context;
private WindowManager windowManager;
private View maskView; public BasePopupWindowWithMask(Context context) {
super(context);
this.context = context;
windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
setContentView(initContentView());
setHeight(initHeight());
setWidth(initWidth());
setOutsideTouchable(true);
setFocusable(true);
setTouchable(true);
setBackgroundDrawable(new ColorDrawable());
} protected abstract View initContentView(); protected abstract int initHeight(); protected abstract int initWidth(); @Override
public void showAsDropDown(View anchor) {
addMask(anchor.getWindowToken());
super.showAsDropDown(anchor);
} private void addMask(IBinder token) {
WindowManager.LayoutParams wl = new WindowManager.LayoutParams();
wl.width = WindowManager.LayoutParams.MATCH_PARENT;
wl.height = WindowManager.LayoutParams.MATCH_PARENT;
wl.format = PixelFormat.TRANSLUCENT;//不设置这个弹出框的透明遮罩显示为黑色
wl.type = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;//该Type描述的是形成的窗口的层级关系
wl.token = token;//获取当前Activity中的View中的token,来依附Activity
maskView = new View(context);
maskView.setBackgroundColor(0x7f000000);
maskView.setFitsSystemWindows(false);
maskView.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
removeMask();
return true;
}
return false;
}
});
/**
* 通过WindowManager的addView方法创建View,产生出来的View根据WindowManager.LayoutParams属性不同,效果也就不同了。
* 比如创建系统顶级窗口,实现悬浮窗口效果!
*/
windowManager.addView(maskView, wl);
} private void removeMask() {
if (null != maskView) {
windowManager.removeViewImmediate(maskView);
maskView = null;
}
} @Override
public void dismiss() {
removeMask();
super.dismiss();
}
}

TestPopupWindow.class

 package com.example.popupwindowwithmask;

 import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager; /**
* Created by kk on 2017/7/22.
*/ public class TestPopupWindow extends BasePopupWindowWithMask {
private int[] mIds;
private View contentView;
private OnItemClickListener listener; public interface OnItemClickListener {
void OnItemClick(View v);
} public void setOnItemClickListener(OnItemClickListener listener) {
this.listener = listener;
} public TestPopupWindow(Context context, int[] mIds) {
super(context);
this.mIds = mIds; initListener();
} @Override
protected View initContentView() {
contentView = LayoutInflater.from(context).inflate(R.layout.pop_layout, null, false);
return contentView;
} private void initListener() {
for (int i = ; i < mIds.length; i++) {
contentView.findViewById(mIds[i]).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (null != listener) {
listener.OnItemClick(v);
}
dismiss();
}
});
}
}
@Override
protected int initHeight() {
return WindowManager.LayoutParams.WRAP_CONTENT;
}
@Override
protected int initWidth() {
return (int) (0.5 * UIUtils.getScreenWidth(context));
}
}
MainActivity.class
? package com.example.popupwindowwithmask; import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast; public class MainActivity extends AppCompatActivity {
private TextView textView; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = (TextView) findViewById(R.id.tv_popup); final TestPopupWindow testPopupWindow = new TestPopupWindow(this, new int[]{R.id.pop_location, R.id.pop_group, R.id.pop_list}); textView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
testPopupWindow.showAsDropDown(textView);
}
}); testPopupWindow.setOnItemClickListener(new TestPopupWindow.OnItemClickListener() {
@Override
public void OnItemClick(View v) {
switch (v.getId()) {
case R.id.pop_location:
Toast.makeText(MainActivity.this, "地址", Toast.LENGTH_SHORT).show();
break;
case R.id.pop_group:
Toast.makeText(MainActivity.this, "分组", Toast.LENGTH_SHORT).show();
break;
case R.id.pop_list:
Toast.makeText(MainActivity.this, "清单", Toast.LENGTH_SHORT).show();
break;
}
}
});
}
}

pop_layout.xml

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"> <RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"> <RelativeLayout
android:id="@+id/rl_indicator"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"> <ImageView
android:layout_width="wrap_content"
android:layout_height="12dp"
android:scaleType="fitCenter"
android:src="@drawable/filter_arrow_up" />
</RelativeLayout> <LinearLayout
android:layout_width="wrap_content"
android:layout_height="150dp"
android:layout_below="@+id/rl_indicator"
android:background="@drawable/pop_background"
android:gravity="center_horizontal"
android:orientation="vertical"
android:paddingLeft="15dp"
android:paddingRight="15dp"> <TextView
android:id="@+id/pop_location"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight=""
android:drawableLeft="@mipmap/fault_equipment_location_icon"
android:drawablePadding="12dp"
android:gravity="center_vertical"
android:text="地址"
android:textColor="#000"
android:textSize="16sp" /> <View
android:layout_width="match_parent"
android:layout_height="0.3dp"
android:background="#D2D2D2" /> <TextView
android:id="@+id/pop_group"
android:layout_width="match_parent"
android:layout_height="0dp" android:layout_weight=""
android:drawableLeft="@mipmap/fault_equipment_grouping_icon"
android:drawablePadding="12dp"
android:gravity="center_vertical"
android:text="分组"
android:textColor="#000"
android:textSize="16sp" /> <View
android:layout_width="match_parent"
android:layout_height="0.3dp"
android:background="#D2D2D2" /> <TextView
android:id="@+id/pop_list"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight=""
android:drawableLeft="@mipmap/fault_equipment_list_icon"
android:drawablePadding="12dp"
android:gravity="center_vertical"
android:text="清单"
android:textColor="#000"
android:textSize="16sp" /> </LinearLayout>
</RelativeLayout>
</RelativeLayout>

pop_background.xml

 <?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#ffffff" />
<corners
android:radius="5dp" />
</shape>

UIUtils.class

 package com.example.popupwindowwithmask;

 import android.content.Context;

 /**
* Created by kk on 2017/7/22.
*/ public class UIUtils {
/**
* 获得屏幕宽度
*
* @param context
* @return
*/
public static int getScreenWidth(Context context) {
return context.getResources().getDisplayMetrics().widthPixels;
} /**
* 获得屏幕高度
*
* @param context
* @return
*/
public static int getScreenHeight(Context context) {
return context.getResources().getDisplayMetrics().heightPixels;
} }

https://github.com/ganchuanpu/AndroidPopupWindowWithMask.git

 
 
 
 

Android PopupWindow增加半透明蒙层的更多相关文章

  1. iOS开发之实现半透明蒙层背景效果[用于下拉菜单页和分享页]

    郝萌主倾心贡献.尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助.欢迎给作者捐赠.支持郝萌主,捐赠数额任意.重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 游戏官方下 ...

  2. 在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务(老罗学习笔记5)

    在数字科技日新月异的今天,软件和硬件的完美结合,造就了智能移动设备的流行.今天大家对iOS和Android系统的趋之若鹜,一定程度上是由于这两个系统上有着丰富多彩的各种应用软件.因此,软件和硬件的关系 ...

  3. 在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6578352 在数字科技日新月异的今天,软件和硬 ...

  4. 为Android系统的Application Frameworks层增加硬件访问服务

    在数字科技日新月异的今天,软件和硬件的完美结合,造就了智能移动设备的流行.今天大家对iOS和Android系统的趋之若鹜,一定程度上是由于这两 个系统上有着丰富多彩的各种应用软件.因此,软件和硬件的关 ...

  5. 在Ubuntu上为Android系统的Application Frameworks层增加硬件访问服务【转】

    本文转载自:http://blog.csdn.net/luoshengyang/article/details/6578352 在数字科技日新月异的今天,软件和硬件的完美结合,造就了智能移动设备的流行 ...

  6. Android开发如何定制framework层服务

    刚刚跨完年,新年第一篇文章,那么今天将对Android开发framework中间层的服务定制使用作个总结.首先我们先导入Android平台源码framework层的代码到开发工具eclipse中,代码 ...

  7. C# Winform 实现自定义半透明遮罩层介绍

    在网页中通过div+css实现半透明效果不难,今天我们看看一种在winfrom中实现的方法: 效果图如下,正常时: 显示遮罩层时: 自定义遮罩层控件的源码如下: View Row Code 1 usi ...

  8. web页面弹出遮罩层,通过js或css禁止蒙层底部页面跟随滚动

    场景概述 弹窗是一种常见的交互方式,而蒙层是弹窗必不可少的元素,用于隔断页面与弹窗区块,暂时阻断页面的交互.但是,在蒙层元素中滑动的时候,滑到内容的尽头时,再继续滑动,蒙层底部的页面会开始滚动,显然这 ...

  9. Android PopupWindow Dialog 关于 is your activity running 崩溃详解

    Android PopupWindow Dialog 关于 is your activity running 崩溃详解 [TOC] 起因 对于 PopupWindow Dialog 需要 Activi ...

随机推荐

  1. 智能家居CC2530功率放大组网RFX2401C和AT2401C的区别

    两者最大的区别就是RFX2401C的增益为12dbmAT2401C的增益为14dbm这就会导致AT2401C的功耗会比RFX2401C大一点点,但距离也会相对更远,并且增加了EDS防静电等级,多出2个 ...

  2. Python基础第一课

    Python基础 安装软件并配置环境变量 1.第一句python --初学后缀名可以是任何数 --后期学习需要导入模块时不是py后缀名会报错 2.两种执行方式 Python解释器 py文件路径 Pyt ...

  3. BGA256芯片植球全过程体验(原创)

    今天工具到位,迫不亟待,需要对手上的BGA256的FPGA芯片进行植球, 该芯片买来的时候是有球的,只是在焊接后,由于电路板故障或焊接问题,需要拆下来芯片,导致球损失,需要重新植球. 一般植球都是将所 ...

  4. [vue]数据来源

    1.组件data函数return的数据 作用域是组件本身 可以在模板template及计算属性computed和方法methods中使用 2.父传子,props数据 来自父级:可以是写死的,或者是来自 ...

  5. NAT(地址解析协议)

    第七部分,也是本次更新的最后一部分,NAT(Network Address Translation),即地址解析协议.通俗理解,地址解析协议就是当一个单位只拥有一个公网ip地址,当内网中的主机想要访问 ...

  6. 使用Vim编辑器,如何退出

    我们输入“冒号”,即":"(不需双引号),在下方会出现冒号,等待输入命令,我输入的是WQ.功能如下. W:write,写入 Q:quit,退出 再回车,就保存退出了 其实,保存退出 ...

  7. 你不会还在用这8个错误的SQL写法吧?

    1.LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如对于下面简单的语句,一般 DBA 想到的办法是在 type, name, create_time 字段上加组合索引 ...

  8. Runtime - 关联对象使用方法及注意点

    大家都知道在分类里,可以间接的添加属性,运用runtime关联对象. 如下图,只是声明了btnClickedCount的set, get方法而已 并没有生成_btnClickedCount 成员变量, ...

  9. .NET Core环境变量和用户秘钥实现开发中的数据安全

    目录 一.注入 IConfiguration 二.从配置文件 appsettings.json 中获取环境变量 三.从项目中获取环境变量 四.用户秘钥设置环境变量 前言:有很多人将秘钥,数据库连接字符 ...

  10. idea 几个常用的设置

    一.主题的背景