Android PopupWindow增加半透明蒙層

来源:https://www.cnblogs.com/ganchuanpu/archive/2019/08/05/11301370.html
-Advertisement-
Play Games

先看效果圖: BasePopupWindowWithMask.class TestPopupWindow.class pop_layout.xml pop_background.xml 1 <?xml version="1.0" encoding="utf-8"?> 2 <shape xmlns:a ...


先看效果圖:

BasePopupWindowWithMask.class

 1 package com.example.popupwindowwithmask;
 2   
 3 import android.content.Context;
 4 import android.graphics.PixelFormat;
 5 import android.graphics.drawable.ColorDrawable;
 6 import android.os.IBinder;
 7 import android.view.KeyEvent;
 8 import android.view.View;
 9 import android.view.WindowManager;
10 import android.widget.PopupWindow;
11   
12 /**
13  * Created by kk on 2017/7/22.
14  */
15   
16 public abstract class BasePopupWindowWithMask extends PopupWindow {
17  protected Context context;
18  private WindowManager windowManager;
19  private View maskView;
20   
21  public BasePopupWindowWithMask(Context context) {
22   super(context);
23   this.context = context;
24   windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
25   setContentView(initContentView());
26   setHeight(initHeight());
27   setWidth(initWidth());
28   setOutsideTouchable(true);
29   setFocusable(true);
30   setTouchable(true);
31   setBackgroundDrawable(new ColorDrawable());
32  }
33   
34  protected abstract View initContentView();
35   
36  protected abstract int initHeight();
37   
38  protected abstract int initWidth();
39   
40  @Override
41  public void showAsDropDown(View anchor) {
42   addMask(anchor.getWindowToken());
43   super.showAsDropDown(anchor);
44  }
45   
46  private void addMask(IBinder token) {
47   WindowManager.LayoutParams wl = new WindowManager.LayoutParams();
48   wl.width = WindowManager.LayoutParams.MATCH_PARENT;
49   wl.height = WindowManager.LayoutParams.MATCH_PARENT;
50   wl.format = PixelFormat.TRANSLUCENT;//不設置這個彈出框的透明遮罩顯示為黑色
51   wl.type = WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;//該Type描述的是形成的視窗的層級關係
52   wl.token = token;//獲取當前Activity中的View中的token,來依附Activity
53   maskView = new View(context);
54   maskView.setBackgroundColor(0x7f000000);
55   maskView.setFitsSystemWindows(false);
56   maskView.setOnKeyListener(new View.OnKeyListener() {
57    @Override
58    public boolean onKey(View v, int keyCode, KeyEvent event) {
59     if (keyCode == KeyEvent.KEYCODE_BACK) {
60      removeMask();
61      return true;
62     }
63     return false;
64    }
65   });
66   /**
67    * 通過WindowManager的addView方法創建View,產生出來的View根據WindowManager.LayoutParams屬性不同,效果也就不同了。
68    * 比如創建系統頂級視窗,實現懸浮視窗效果!
69    */
70   windowManager.addView(maskView, wl);
71  }
72   
73  private void removeMask() {
74   if (null != maskView) {
75    windowManager.removeViewImmediate(maskView);
76    maskView = null;
77   }
78  }
79   
80  @Override
81  public void dismiss() {
82   removeMask();
83   super.dismiss();
84  }
85 }

TestPopupWindow.class

  1 package com.example.popupwindowwithmask;
  2   
  3 import android.content.Context;
  4 import android.view.LayoutInflater;
  5 import android.view.View;
  6 import android.view.WindowManager;
  7   
  8 /**
  9  * Created by kk on 2017/7/22.
 10  */
 11   
 12 public class TestPopupWindow extends BasePopupWindowWithMask {
 13  private int[] mIds;
 14  private View contentView;
 15  private OnItemClickListener listener;
 16   
 17  public interface OnItemClickListener {
 18   void OnItemClick(View v);
 19  }
 20   
 21  public void setOnItemClickListener(OnItemClickListener listener) {
 22   this.listener = listener;
 23  }
 24   
 25  public TestPopupWindow(Context context, int[] mIds) {
 26   super(context);
 27   this.mIds = mIds;
 28   
 29   initListener();
 30  }
 31   
 32  @Override
 33  protected View initContentView() {
 34   contentView = LayoutInflater.from(context).inflate(R.layout.pop_layout, null, false);
 35   return contentView;
 36  }
 37   
 38  private void initListener() {
 39   for (int i = 0; i < mIds.length; i++) {
 40    contentView.findViewById(mIds[i]).setOnClickListener(new View.OnClickListener() {
 41     @Override
 42     public void onClick(View v) {
 43      if (null != listener) {
 44       listener.OnItemClick(v);
 45      }
 46      dismiss();
 47     }
 48    });
 49   }
 50  }
 51  @Override
 52  protected int initHeight() {
 53   return WindowManager.LayoutParams.WRAP_CONTENT;
 54  }
 55  @Override
 56  protected int initWidth() {
 57   return (int) (0.5 * UIUtils.getScreenWidth(context));
 58  }
 59 }
 60 MainActivity.class
 61 ?
 62 1
 63 2
 64 3
 65 4
 66 5
 67 6
 68 7
 69 8
 70 9
 71 10
 72 11
 73 12
 74 13
 75 14
 76 15
 77 16
 78 17
 79 18
 80 19
 81 20
 82 21
 83 22
 84 23
 85 24
 86 25
 87 26
 88 27
 89 28
 90 29
 91 30
 92 31
 93 32
 94 33
 95 34
 96 35
 97 36
 98 37
 99 38
100 39
101 40
102 41
103 42
104 43
105 44
106 45
107 package com.example.popupwindowwithmask;
108   
109 import android.os.Bundle;
110 import android.support.v7.app.AppCompatActivity;
111 import android.view.View;
112 import android.widget.TextView;
113 import android.widget.Toast;
114   
115 public class MainActivity extends AppCompatActivity {
116  private TextView textView;
117   
118  @Override
119  protected void onCreate(Bundle savedInstanceState) {
120   super.onCreate(savedInstanceState);
121   setContentView(R.layout.activity_main);
122   textView = (TextView) findViewById(R.id.tv_popup);
123   
124   
125   final TestPopupWindow testPopupWindow = new TestPopupWindow(this, new int[]{R.id.pop_location, R.id.pop_group, R.id.pop_list});
126   
127   textView.setOnClickListener(new View.OnClickListener() {
128    @Override
129    public void onClick(View v) {
130     testPopupWindow.showAsDropDown(textView);
131    }
132   });
133   
134   testPopupWindow.setOnItemClickListener(new TestPopupWindow.OnItemClickListener() {
135    @Override
136    public void OnItemClick(View v) {
137     switch (v.getId()) {
138      case R.id.pop_location:
139       Toast.makeText(MainActivity.this, "地址", Toast.LENGTH_SHORT).show();
140       break;
141      case R.id.pop_group:
142       Toast.makeText(MainActivity.this, "分組", Toast.LENGTH_SHORT).show();
143       break;
144      case R.id.pop_list:
145       Toast.makeText(MainActivity.this, "清單", Toast.LENGTH_SHORT).show();
146       break;
147     }
148    }
149   });
150  }
151 }

pop_layout.xml

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3  android:layout_width="wrap_content"
 4  android:layout_height="wrap_content">
 5   
 6  <RelativeLayout
 7   android:layout_width="wrap_content"
 8   android:layout_height="wrap_content">
 9   
10   <RelativeLayout
11    android:id="@+id/rl_indicator"
12    android:layout_width="match_parent"
13    android:layout_height="wrap_content"
14    android:gravity="center_horizontal">
15   
16    <ImageView
17     android:layout_width="wrap_content"
18     android:layout_height="12dp"
19     android:scaleType="fitCenter"
20     android:src="@drawable/filter_arrow_up" />
21   </RelativeLayout>
22   
23   <LinearLayout
24    android:layout_width="wrap_content"
25    android:layout_height="150dp"
26    android:layout_below="@+id/rl_indicator"
27    android:background="@drawable/pop_background"
28    android:gravity="center_horizontal"
29    android:orientation="vertical"
30    android:paddingLeft="15dp"
31    android:paddingRight="15dp">
32   
33    <TextView
34     android:id="@+id/pop_location"
35     android:layout_width="match_parent"
36     android:layout_height="0dp"
37     android:layout_weight="1"
38     android:drawableLeft="@mipmap/fault_equipment_location_icon"
39     android:drawablePadding="12dp"
40     android:gravity="center_vertical"
41     android:text="地址"
42     android:textColor="#000"
43     android:textSize="16sp" />
44   
45    <View
46     android:layout_width="match_parent"
47     android:layout_height="0.3dp"
48     android:background="#D2D2D2" />
49   
50    <TextView
51     android:id="@+id/pop_group"
52     android:layout_width="match_parent"
53     android:layout_height="0dp"
54   
55     android:layout_weight="1"
56     android:drawableLeft="@mipmap/fault_equipment_grouping_icon"
57     android:drawablePadding="12dp"
58     android:gravity="center_vertical"
59     android:text="分組"
60     android:textColor="#000"
61     android:textSize="16sp" />
62   
63    <View
64     android:layout_width="match_parent"
65     android:layout_height="0.3dp"
66     android:background="#D2D2D2" />
67   
68    <TextView
69     android:id="@+id/pop_list"
70     android:layout_width="match_parent"
71     android:layout_height="0dp"
72     android:layout_weight="1"
73     android:drawableLeft="@mipmap/fault_equipment_list_icon"
74     android:drawablePadding="12dp"
75     android:gravity="center_vertical"
76     android:text="清單"
77     android:textColor="#000"
78     android:textSize="16sp" />
79   
80   </LinearLayout>
81  </RelativeLayout>
82 </RelativeLayout>

pop_background.xml

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

UIUtils.class

 1 package com.example.popupwindowwithmask;
 2   
 3 import android.content.Context;
 4   
 5 /**
 6  * Created by kk on 2017/7/22.
 7  */
 8   
 9 public class UIUtils {
10  /**
11   * 獲得屏幕寬度
12   *
13   * @param context
14   * @return
15   */
16  public static int getScreenWidth(Context context) {
17   return context.getResources().getDisplayMetrics().widthPixels;
18  }
19   
20  /**
21   * 獲得屏幕高度
22   *
23   * @param context
24   * @return
25   */
26  public static int getScreenHeight(Context context) {
27   return context.getResources().getDisplayMetrics().heightPixels;
28  }
29   
30 }

 

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

       
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Hadoop Shuffer     Hadoop 的shuffer主要分為兩個階段:Map、Reduce。 Map Shuffer:     這個階段發生在map階段之後,數據寫入記憶體之前,在數據寫入記憶體的過程就已經開 ...
  • mysql中的範式 範式 範式:Normal Format,是一種離散數學中的知識,是為瞭解決數據的存儲與優化的問題:保存數據的存儲之後,凡是能夠通過關係尋找出來的數據,堅決不再重覆存儲,終極目標是為了減少數據的冗餘。範式:是一種分層結構的規範,分為六層,每一層都比上一層更加嚴格,若要滿足下一層範式 ...
  • 講乾貨,不啰嗦,本教程主要基於Mysql資料庫,講解sql的基本使用。 資料庫主要包括增、刪、改、查等基本操作,以下為設計到的常用的sql語句: 一、查 1.select 語法查詢 SELECT column_name,column_name FROM table_name 其中column_nam ...
  • 10分鐘搞懂:億級用戶的分散式數據存儲解決方案https://www.cnblogs.com/lagou/p/11011682.html ...
  • 1.啟動hadoop之前,ssh免密登錄slave主機正常,使用命令start-all.sh啟動hadoop時,需要輸入slave主機的密碼,說明ssh文件許可權有問題,需要執行以下操作: 1)進入.ssh目錄下查看是否有公鑰私鑰文件authorized_keys、id_rsa、id_rsa.pub ...
  • 我們在建表的時候通常會在最後聲明引擎類型,這次我們就來看看存儲引擎都有哪些: 舉個例子: 銀行轉賬: 張三想給李四轉500元錢: 張三-500 李四+500 這兩步必須都完成,轉賬才完成 像這種,2步或N步必須都完成,從邏輯上講,是一個‘原子操作’,即要麼成功,要麼都不成功 那麼如何保障這種特性? ...
  • LDAP 服務 本文主要在debian配置,如果需要在CentOS上部署,需要修改大部分的路勁,這裡需要自行修改。 服務按照個人理解,也可使理解為一個資料庫,但是這個資料庫的讀寫性能不像 一樣擁有良好的讀寫性能,而 更偏向於讀取,而弱於寫入。並且 的數據類型屬於面向對象的數據類型,這和 的數據類型不 ...
  • 將一個圖片文件寫入到本地目錄,然後去相冊查看,會查找不到這個圖片文件,但是去文件目錄下查找,確確實實有該圖片文件。 問題在於相冊是一個獨立的app,它並不會去刷新本地圖片,所以需要在寫圖片文件成功之後,通知圖庫 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...