android 按钮加上蒙层,Android PopupWindow增加半透明蒙层

本文实例为大家分享了Android PopupWindow增加半透明蒙层的具体代码,供大家参考,具体内容如下

先看效果图:

adf0d49c7fc36b33e68c90f6c0052a76.png

实现代码:

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 = 0; 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

android:layout_width="wrap_content"

android:layout_height="wrap_content">

android:layout_width="wrap_content"

android:layout_height="wrap_content">

android:id="@+id/rl_indicator"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:gravity="center_horizontal">

android:layout_width="wrap_content"

android:layout_height="12dp"

android:scaleType="fitCenter"

android:src="@drawable/filter_arrow_up" />

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">

android:id="@+id/pop_location"

android:layout_width="match_parent"

android:layout_height="0dp"

android:layout_weight="1"

android:drawableLeft="@mipmap/fault_equipment_location_icon"

android:drawablePadding="12dp"

android:gravity="center_vertical"

android:text="地址"

android:textColor="#000"

android:textSize="16sp" />

android:layout_width="match_parent"

android:layout_height="0.3dp"

android:background="#D2D2D2" />

android:id="@+id/pop_group"

android:layout_width="match_parent"

android:layout_height="0dp"

android:layout_weight="1"

android:drawableLeft="@mipmap/fault_equipment_grouping_icon"

android:drawablePadding="12dp"

android:gravity="center_vertical"

android:text="分组"

android:textColor="#000"

android:textSize="16sp" />

android:layout_width="match_parent"

android:layout_height="0.3dp"

android:background="#D2D2D2" />

android:id="@+id/pop_list"

android:layout_width="match_parent"

android:layout_height="0dp"

android:layout_weight="1"

android:drawableLeft="@mipmap/fault_equipment_list_icon"

android:drawablePadding="12dp"

android:gravity="center_vertical"

android:text="清单"

android:textColor="#000"

android:textSize="16sp" />

pop_background.xml

android:radius="5dp" />

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;

}

}

参考资料:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现该功能需要先创建一个按钮,然后在按钮的点击事件中创建一个 PopupWindow 对象。在 PopupWindow 中,可以设置一个布局文件,该文件会展示在弹窗中。接下来,可以为弹窗中的按钮设置一个点击事件,通过点击事件再创建一个 PopupWindow 对象,展示新的弹窗层。 具体实现步骤如下: 1. 创建一个按钮设置按钮的点击事件 2. 在点击事件中使用 PopupWindow 类创建一个弹窗对象,并且设置它的布局文件 3. 获取布局文件中的子视图,并在子视图中为按钮设置点击事件 4. 在按钮的点击事件中创建一个新的 PopupWindow 对象,然后为它设置另一个布局文件,展示新的弹窗层 关于具体的代码实现,你可以参考下面的示例代码: ``` kotlin // 创建一个按钮 val button = Button(this) button.text = "点击弹窗" button.setOnClickListener(View.OnClickListener { // 创建一个 PopupWindow 对象 val popupWindow = PopupWindow(this) // 设置弹窗的布局文件 val view = layoutInflater.inflate(R.layout.popup_window, null) popupWindow.contentView = view // 获取布局文件中的子视图 val popupButton = view.findViewById<Button>(R.id.popup_button) popupButton.setOnClickListener(View.OnClickListener { // 创建一个新的 PopupWindow 对象 val popupWindow2 = PopupWindow(this) // 设置弹窗的布局文件 val view2 = layoutInflater.inflate(R.layout.popup_window_2, null) popupWindow2.contentView = view2 // 显示弹窗 popupWindow2.showAsDropDown(popupButton) }) // 显示弹窗 popupWindow.showAsDropDown(button) }) ``` 在代码中,首先创建一个按钮,并设置它的点击事件。在点击事件中,创建了一个 PopupWindow 对象,然后为它设置了一个布局文件。接着,使用 findViewById() 方法获取布局文件中的子视图,并为它设置了一个点击事件。在点击事件中,又创建了一个新的 PopupWindow 对象,并设置了一个新的布局文件。最后,分别通过 showAsDropDown() 方法显示了两个弹窗层。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值