您的位置:首页 > 运维架构

弹出PopupWindow背景变暗的实现

2015-11-20 20:03 537 查看
弹出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>
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
效果图


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: