zoukankan      html  css  js  c++  java
  • 弹出PopupWindow背景变暗的实现

           弹出PopuoWindow后 代码里设置的是PopupWindow默认获取焦点 所以PopupWindow显示的时候其它控件点击是没有反应的

    用到的方法是

    pwMyPopWindow.setFocusable(true);

    代码里还设置了

    pwMyPopWindow.setBackgroundDrawable(this.getResources().getDrawable(
    R.mipmap.ic_launcher));// 设置背景图片,不能在布局中设置,要通过代码来设置
    pwMyPopWindow.setOutsideTouchable(true);// 触摸popupwindow外部,popupwindow消失。这个要求你的popupwindow要有背景图片才可以成功
    这样点击PopupWindow外部就会自行消失

    当我们弹出PopupWindow的时候让背景变半透明 当PopuuWindow消失时让背景变回原样 这样就实现了多数app中PouupWindow的使用效果
    用到的方法是
    WindowManager.LayoutParams lp = getWindow().getAttributes();
    lp.alpha = bgAlpha; //0.0-1.0
    getWindow().setAttributes(lp);

    下面是代码
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity"
        android:background="#ffffff" >
    
        <LinearLayout
            android:id="@+id/ll_head_bar"
            android:layout_width="wrap_content"
            android:layout_height="400dp"
            android:orientation="vertical">
       <!--这个图片按钮按下时弹出PopupWindow-->
            <ImageButton
                android:id="@+id/ib_operate_more"
               android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:src="@mipmap/ic_launcher" />
    <!--这个按钮是测试当PoupWindow显示时点击此按钮没反应 因为此按钮没获取焦点--> <Button android:layout_marginTop="200dp" android:layout_gravity="bottom" android:id="@+id/ib_operate_more2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="测试按钮" /> </LinearLayout> </RelativeLayout>
    
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center"
        android:orientation="vertical" >
    
        <TextView
            android:id="@+id/tv_list_item"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:minHeight="40dp"
            android:minWidth="120dp"
            android:textSize="20sp"
            />
    </LinearLayout>
    list_item_popupwindow.xml
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:background="#d93c58b3"
        >"
    
        <ListView
            android:id="@+id/lv_popup_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:listSelector="#00000000"
            android:focusableInTouchMode="true"
            android:background="#d42a2a"
            />
    
    </LinearLayout>
    task_detail_popupwindow.xml
    package com.ceshi.popupwindow;
    
    import android.app.Activity;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.view.WindowManager;
    import android.widget.AdapterView;
    import android.widget.Button;
    import android.widget.ImageButton;
    import android.widget.ListView;
    import android.widget.PopupWindow;
    import android.widget.SimpleAdapter;
    import android.widget.Toast;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    public class MainActivity extends Activity {
    
        private ImageButton ibOperationMore;
        private Button ibOperationMore2;
    
        List<Map<String, String>> moreList;
        private PopupWindow pwMyPopWindow;// popupwindow
        private ListView lvPopupList;// popupwindow中的ListView
        private int NUM_OF_VISIBLE_LIST_ROWS = 3;// 指定popupwindow中Item的数量
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            iniData();
    
            iniPopupWindow();
    
            // 更多操作按钮
            ibOperationMore = (ImageButton) findViewById(R.id.ib_operate_more);
            //ibOperationMore2是用来测试焦点问题  这样popupwindow显示的时候其他的控件是不能点击的
            //换句话说其它控件点击时没反应
            ibOperationMore2 = (Button) findViewById(R.id.ib_operate_more2);
            ibOperationMore2.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
                Toast.makeText(MainActivity.this,"cao",Toast.LENGTH_SHORT).show();
                }
    
            });
    
            ibOperationMore.setOnClickListener(new View.OnClickListener() {
    
                @Override
                public void onClick(View v) {
    
                    if (pwMyPopWindow.isShowing()) {
                        pwMyPopWindow.dismiss();// 关闭
                    } else {
                        pwMyPopWindow.showAsDropDown(ibOperationMore);// 显示
                        backgroundAlpha(0.7f);
                    }
    
                }
            });
        }
    
        private void iniData() {
    
            moreList = new ArrayList<Map<String, String>>();
            Map<String, String> map;
            map = new HashMap<String, String>();
            map.put("share_key", "复制");
            moreList.add(map);
            map = new HashMap<String, String>();
            map.put("share_key", "删除");
            moreList.add(map);
            map = new HashMap<String, String>();
            map.put("share_key", "修改");
            moreList.add(map);
        }
    
        private void iniPopupWindow() {
    
            LayoutInflater inflater = (LayoutInflater) this
                    .getSystemService(LAYOUT_INFLATER_SERVICE);
            View layout = inflater.inflate(R.layout.task_detail_popupwindow, null);
            lvPopupList = (ListView) layout.findViewById(R.id.lv_popup_list);
            pwMyPopWindow = new PopupWindow(layout, ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            pwMyPopWindow.setFocusable(true);// 加上这个popupwindow中的ListView才可以接收点击事件
    
            lvPopupList.setAdapter(new SimpleAdapter(MainActivity.this, moreList,
                    R.layout.list_item_popupwindow, new String[] { "share_key" },
                    new int[] { R.id.tv_list_item }));
            lvPopupList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    
                @Override
                public void onItemClick(AdapterView<?> parent, View view,
                                        int position, long id) {
                    pwMyPopWindow.dismiss();
                    Toast.makeText(MainActivity.this,
                            moreList.get(position).get("share_key"),
                            Toast.LENGTH_LONG).show();
                }
            });
    
            // 控制popupwindow的宽度和高度自适应
            /*lvPopupList.measure(View.MeasureSpec.UNSPECIFIED,
                    View.MeasureSpec.UNSPECIFIED);
            pwMyPopWindow.setWidth(lvPopupList.getMeasuredWidth());
            pwMyPopWindow.setHeight((lvPopupList.getMeasuredHeight() + 20)
                    * NUM_OF_VISIBLE_LIST_ROWS);*/
    
            // 控制popupwindow点击屏幕其他地方消失
            pwMyPopWindow.setBackgroundDrawable(this.getResources().getDrawable(
                    R.mipmap.ic_launcher));// 设置背景图片,不能在布局中设置,要通过代码来设置
            pwMyPopWindow.setOutsideTouchable(true);// 触摸popupwindow外部,popupwindow消失。这个要求你的popupwindow要有背景图片才可以成功,如上
            pwMyPopWindow.setOnDismissListener(new PopupWindow.OnDismissListener() {
                @Override
                public void onDismiss() {
                    //popupwindow消失的时候恢复成原来的透明度
                    backgroundAlpha(1f);
                }
            });
    
        }
    
        /**
         * 设置添加屏幕的背景透明度
         * @param bgAlpha
         */
        public void backgroundAlpha(float bgAlpha)
        {
            WindowManager.LayoutParams lp = getWindow().getAttributes();
            lp.alpha = bgAlpha; //0.0-1.0
            getWindow().setAttributes(lp);
        }
    }
    MainActivity

    效果图



    严禁盗版    

    转载请注明出处:https://www.cnblogs.com/bimingcong/p/4982237.html

     



  • 相关阅读:
    排序算法最强总结及其代码实现
    程序员面试常问的小算法总结
    Docker部署Scrapy-redis分布式爬虫框架(整合Selenium+Headless Chrome网页渲染)
    使用亚马逊AWS云服务器进行深度学习——免环境配置/GPU支持/Keras/TensorFlow/OpenCV
    阿里巴巴MySQL开源中间件Canal入门
    【秒杀系统】秒杀系统实战(四)| 缓存与数据库双写一致性实战
    【秒杀系统】秒杀系统实战(五)| 如何优雅的完成订单异步处理
    把购买数据添加到购物车
    实现自动登陆和记住用户名功能
    自定义登陆标签
  • 原文地址:https://www.cnblogs.com/bimingcong/p/4982237.html
Copyright © 2011-2022 走看看