Android开发之PoupWindow详解
来源:互联网 发布:php curl 不返回头部 编辑:程序博客网 时间:2024/06/08 11:15
大家都用过微信的语音,当我们按下按钮的时候开始录音,同时弹出一个显示音量的对话框,如下所示:并且当这个对话框弹出的时候,下面的activity不变暗!一看到这个可能我们第一反应就是自定义布局,使用DialogFragment来实现。但是我们知道默认的AlertDialog或者DialogFragment弹出的时候都会导致其下的Activity失去焦点,变暗,且我一时没找到怎么让屏幕不变暗的方法!
通过在网上找资料,了解到了PoupWindow这个Widget,废话不多说,上代码:
首先是初始化
private DisplayMetrics dm = getResources().getDisplayMetrics();;// 弹出框private PopupWindow exitPoupWindow = null;
private void initExitPoupWindow() {//得到布局View view = getLayoutInflater().inflate(R.layout.exit_popuwindow, null,false);//获取按钮控件exit = (Button) view.findViewById(R.id.exit_cancel);exit.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {initOrDismissExitPoupWindow();}});ok = (Button) view.findViewById(R.id.exit_ok);ok.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {initOrDismissExitPoupWindow();ActivityCollector.finish_all();}});// 在这里指定PoupWindow大小exitPoupWindow = new PopupWindow(view, dm.widthPixels * 2 / 3,LayoutParams.WRAP_CONTENT);// 使其获得焦点,让外部不可点击,否则外部可点击exitPoupWindow.setFocusable(false);// 允许接收外部点击事件,这个只有当focusable为false,// 且Touchable为真的时候才有意义,外部点击事件将稍后传给这个poupwindow// 这个poupwindow就可以对事件进行响应 了exitPoupWindow.setOutsideTouchable(true);// 允许点击exitPoupWindow.setTouchable(true);// 设置动画exitPoupWindow.setAnimationStyle(R.style.mypopwindow_anim_style);// 这里也可以设置activity的透明度!WindowManager.LayoutParams params = getWindow().getAttributes();params.alpha = 0.5f;getWindow().setAttributes(params);// 注册监听事件,点击别的地方消失view.setOnTouchListener(new OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {initOrDismissExitPoupWindow();return false;}});}
然后写一个方法用于初始化或者销毁PopuWindow
private void initOrDismissExitPoupWindow() {if (exitPoupWindow != null && exitPoupWindow.isShowing()) {exitPoupWindow.dismiss();exitPoupWindow = null;// 还原透明效果WindowManager.LayoutParams params = getWindow().getAttributes();params.alpha = 1f;getWindow().setAttributes(params);} else {initExitPoupWindow();}}
最后是一个显示的方法
private void showExitPoupWindow(View parent) {// 初始化弹出框initOrDismissExitPoupWindow();// 设置弹出位置:显示到正中间exitPoupWindow.showAtLocation(parent, Gravity.CENTER, 0, 0);// exitPoupWindow.showAsDropDown(anchor);// exitPoupWindow.showAsDropDown(anchor, xoff, yoff);}这个方法得传进一个view参数,相当于poupwindow得绑定到这个view上面,如果是点击一个按钮弹出这个poupwindow的话就直接在onClick或者onTouch中把参数传进去即可!
但是,我在使用得时候遇到了一个问题:我是点击ActionBar的菜单项的时候弹出这个poupwindow,但是不知道怎么获取到这个菜单项的view!于是采用了如下方法,就可以弹出这个poupwindow了!
case R.id.action_exit:showExitPoupWindow(MainUI.this.getWindow().getDecorView());break;
最终效果如下,当然字体是我系统的字体^_^:
对应的布局文件如下所示,比较简单
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/exit_poupwindow" android:gravity="center_horizontal" android:orientation="vertical" android:paddingLeft="10dp" android:paddingRight="10dp" android:paddingTop="10dp" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="0dp" android:gravity="center" android:text="提示" android:textColor="@color/actionbar_background" android:textSize="17sp" android:textStyle="bold" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:layout_marginTop="5dp" android:gravity="center" android:text="你确定要退出本应用吗?" android:textColor="@color/actionbar_background" android:textSize="17sp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="5dp" android:orientation="horizontal" > <Button android:id="@+id/exit_cancel" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:background="@drawable/exit_button" android:text="取消" android:textColor="@color/actionbar_background" android:textSize="17sp" /> <Button android:id="@+id/exit_ok" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginLeft="20dp" android:layout_weight="1" android:background="@drawable/exit_button" android:text="确定" android:textColor="@color/actionbar_background" android:textSize="17sp" /> </LinearLayout></LinearLayout>
以及动画定义文件popshow_anim.xml,显示弹出动画:
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="300" android:fromYDelta="100%p" android:toYDelta="0" /> <alpha android:duration="300" android:fromAlpha="0.0" android:toAlpha="1.0" /></set>pophidden_anim.xml,显示退出动画:
<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:duration="300" android:fromYDelta="0" android:toYDelta="50%p" /> <alpha android:duration="300" android:fromAlpha="1.0" android:toAlpha="0.0" /></set>
然后styles文件里面定义动画style:
<style name="mypopwindow_anim_style"> <item name="android:windowEnterAnimation">@anim/popshow_anim</item> <!-- 指定显示的动画xml --> <item name="android:windowExitAnimation">@anim/pophidden_anim</item> <!-- 指定消失的动画xml --> </style>
通过以上步骤我们就可以自定义poupwindow布局,随心所欲的实现我们想要的效果^_^,还可以设置弹出和消失的动画,是不是很nice!
不过有一点需要注意:默认poupwindow弹出的时候是不会使屏幕变暗的,如果想让屏幕变暗就可以设置屏幕的透明度,如下所示,然后在消失的时候再设置透明度为1.0f就恢复了^_^!
// 这里也可以设置activity的透明度!WindowManager.LayoutParams params = getWindow().getAttributes();params.alpha = 0.5f;getWindow().setAttributes(params);
先写这么多!
0 0
- Android开发之PoupWindow详解
- Android开发之InstanceState详解
- Android开发之Handler详解
- ANDROID开发之SQLite详解
- Android开发之InstanceState详解
- Android开发之InstanceState详解
- Android开发之InstanceState详解
- Android开发之---Intent详解
- Android开发之Services详解
- Android开发之InstanceState详解
- Android开发之InstanceState详解
- ANDROID开发之SQLite详解
- ANDROID开发之SQLite详解
- ANDROID开发之SQLite详解
- ANDROID开发之SQLite详解
- Android开发之InstanceState详解
- Android开发之InstanceState详解
- Android开发之InstanceState详解
- 任意进制整数之间的相互转换(C++实现)
- poj2418(Hardwood Species)
- 学习前端框架demo的网站 ToDoMVC
- [urls.py设置技巧]Django urls.py的了解与基本配置
- Game of Life
- Android开发之PoupWindow详解
- 【LeetCode从零单刷】Search in Rotated Sorted Array I & II
- 2015-11-02-02-我第二份工作的姻缘
- 面试时经常考的------对字符串的操作(三)
- Linux系统Apache SSL安装与配置
- redis持久化_codepython整理三
- Linux命令(持续更新)
- Extjs中的success和failure .
- Calendar