PopupWindow增加半透明蒙层

来源:互联网 发布:linux tail 100f 编辑:程序博客网 时间:2024/04/28 23:47

先看效果图:


实现代码:

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

<?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="1"                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="1"                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="1"                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;    }}

源码:http://download.csdn.net/detail/qq_33748378/9908042

参考资料:

https://developer.android.google.cn/reference/android/view/WindowManager.html

https://developer.android.google.cn/reference/android/view/WindowManager.LayoutParams.html




原创粉丝点击