先看效果图:

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. luogu P5002 专心OI - 找祖先

    题目描述 这个游戏会给出你一棵树,这棵树有NN个节点,根结点是RR,系统会选中MM个点P_1,P_2...P_MP 1 ​ ,P 2 ​ ...P M ​ ,要Imakf回答有多少组点对(u_i,v_ ...

  2. 蓝牙5.0芯片NRF52810和NRF52832可进行mesh组网

    提供智能化mesh照明解决方案,在现有传统灯具的基础上,插入NRF52832/52810的照明Mesh模块,可以迅速升级现有的传统灯具,配合手机APP和服务器系统,使每一盏灯成为物联网的一个智能节点, ...

  3. IOS UIAlertView(警告框)方法总结

    转自:my.oschina.net/u/2340880/blog/408873?p=1 IOS中UIAlertView(警告框)常用方法总结 一.初始化方法 - (instancetype)initW ...

  4. go基础之服务退出问题

    最近学习公司微服务的代码,看到每一个微服务的main函数都阻塞在那里,然后里面起的goroutine一直在哪里运行. package main import( "fmt" &quo ...

  5. 18.DjangoRestFramework学习一之restful规范、APIview、解析器组件、Postman等

    一 预备知识 预备知识:django的CBV和FBV CBV(class based view):多用,简单回顾一下 FBV(function based view): CBV模式的简单操作:来个登陆 ...

  6. CodeForces845G-Shortest PathProblem?

    You are given an undirected graph with weighted edges. The length of some path between two vertices ...

  7. 记录一些实用的小技巧-CSS篇

    1.单行文本截断 .text{ width: 200px; text-overflow: ellipsis; white-space: nowrap; overflow: hidden; } 2.多行 ...

  8. 菜鸟系列docker——docker网络(8)

    Docker网络 Docker在容器内部运行应用,这些应用之间的交互依赖于大量不同的网络,这意味着Docker需要强大的网络功能. Docker 网络从覆盖范围可分为单个 host 上的容器网络和跨多 ...

  9. 【Koa】385- koa框架的快速入门与使用

    点击上方"前端自习课"关注,学习起来~ 简介 Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小. ...

  10. 基于Pact的契约测试

    背景 如今,契约测试已经逐渐成为测试圈中一个炙手可热的话题,特别是在微服务大行其道的行业背景下,越来越多的团队开始关注服务之间的契约及其契约测试. 什么是契约测试     关于什么是契约测试这个问题, ...