先看效果图:

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. multipart/form-data 文件上传表单中 传递参数无法获取的原因!

    1.什么是multipart/form-data 首先我们需要明白在html中的enctype属性, enctype:规定了form表单在发送到服务器时候编码方式.他有如下的三个值. ①applica ...

  2. Orleans在.net core的开发

    Goods 服务 启动 using System; using System.Collections.Generic; using System.Linq; using System.Net; usi ...

  3. 【性能优化】404- 从 12.67s到1.06s 性能优化实战

    作者:jerryOnlyZRJ 来源:https://juejin.im/post/5b6fa8c86fb9a0099910ac91 本文是对之前同名文章的修正,将所有webpack3的内容更新为we ...

  4. Java做成Zip文件,Java实现压缩文件

    import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import ...

  5. Ubuntu修改时间

    Ubuntu修改时区和更新时间 先查看当前系统时间 date -R 结果时区是:+0000 我需要的是东八区,这儿显示不是,所以需要设置一个时区 运行 tzselect 在这里我们选择亚洲 Asia, ...

  6. eclipse设置护眼模式,就是设置为黑色背景,

    效果如上图 首先下载jar包,然后放到下面的目录,然后打开eclipse然后选择哪个dark的那个主题就可以了 然而这里只是设置软件部分的, 代码的背景和高亮显示,是在另外一个地方设置, 一般是下载e ...

  7. CCF-CSP题解 201609-3 炉石传说

    模拟. 注意随从的编号在\(summon\)和\(attack\)随从死亡时都可能改变. #include <bits/stdc++.h> using namespace std; str ...

  8. C#写入(覆盖形式)数据到CSV文件 和 读取CSV文件

    /// <summary> /// 写入数据到CSV文件,覆盖形式 /// </summary> /// <param name="csvPath"& ...

  9. 四步实现在一台电脑上使用多个github账号

    四步实现在一台电脑上同时使用多个GitHub账号 今天和大家聊一下如何在一台电脑上同时使用多个GitHub账号,通过以下四个步骤就可以实现,其中第二个步骤为了便于叙述分成了几个小步骤. 1. 取消全局 ...

  10. Linux系统入门简介<1>

    linux系统入门简介 我们为什么要学习Linux? 在介绍Linux的历史前,我想先针对大家如何对Linux的发音说一下.我发现我身边的朋友对Linux的发音大致有这么几种: "里那克斯& ...