Android PopupWindow使用,轻松实现微博主界面(二)
2016-05-25 12:01
501 查看
一、概述
1.继承关系:
java.lang.Object ↳ android.widget.PopupWindow
可以看出它并不是继承于View,而是Object的子类,位于app包下,和Dialog类似;
2.实现效果:
(1)微博效果
(2)电商购物效果
二、基本使用
贴上微博效果的代码如下:
@OnClick(R.id.compose_btn) public void onComposeBtnClicked(View view){ initPopup(); } private void initPopup() { View customView = getLayoutInflater().inflate(R.layout.popup_custome_view, null); final PopupWindow popupWindow = new PopupWindow(customView, WindowManager.LayoutParams.MATCH_PARENT, WindowManager.LayoutParams.MATCH_PARENT, true); popupWindow.setAnimationStyle(R.style.popupAnimation); popupWindow.setBackgroundDrawable(new BitmapDrawable()); //由于PopupWindow没有提供监听动画的接口和获取动画的接口,这里做了延时一个动画的时长 new Handler().postDelayed(new Runnable() { @Override public void run() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ getWindow().setStatusBarColor(Color.TRANSPARENT); } } }, 200); customView.findViewById(R.id.close_btn).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { popupWindow.dismiss(); } }); popupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { @Override public void onDismiss() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){ getWindow().setStatusBarColor(getResources().getColor(R.color.colorPrimaryDark)); } } }); popupWindow.showAtLocation(mTabHost, Gravity.BOTTOM, 0, 0); popupWindow.update(); }
可以看出触发点击事件时候显示显示popupWindow:
(1)初始化popupWindow中必须设置:
popupWindow.setBackgroundDrawable(new BitmapDrawable());
否则无法show;
(2)设置动画:
popupWindow.setAnimationStyle(R.style.popupAnimation);
这里要在style中配置:
<style name="popupAnimation" parent="android:Animation" mce_bogus="1"> <item name="android:windowEnterAnimation">@anim/pop_enter</item> <item name="android:windowExitAnimation">@anim/pop_exit</item> </style>
pop_enter的xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromYDelta="100%" android:toYDelta="0%" android:duration="200"/> <alpha android:duration="200" android:fromAlpha="0.0" android:interpolator="@android:anim/decelerate_interpolator" android:toAlpha="1.0" /> </set>
pop_exit的xml
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <translate android:fromYDelta="0%" android:toYDelta="100%" android:duration = "200"/> <alpha android:duration="200" android:fromAlpha="1.0" android:interpolator="@android:anim/accelerate_interpolator" android:toAlpha="0.0" /> </set>
(3)关于动画:
查了很久没发现popupwindow的动画监听,并且无法获取动画实例,所以这里的动画监听使用了new Handler().postDelayed的延时方式处理;三、存在的问题
如果popupwindow中有弹出软键盘的交互,就好比我的效果图二中需要弹出软键盘,这里试了下在Activity中配置windowSoftInputMode为adjustResize或者是adjustPan在弹出软键盘时候均会遮挡输入框,但是在原生android上是不会遮挡的,在国内小米和魅族上测试均会遮挡,我想了一下应该是国内改了FrameWork层中window的相关参数导致的,解决这个问题需要给popupwindow设置:
mPopupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); mPopupWindow.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);
如果想在弹出popupwindow时候改变window的背景色,比如我效果图二的效果,这里可以在show的时候一并设置window的背景alpha,在dismiss的时候在设置回来:
show的时候:private void show() { WindowManager.LayoutParams params = getWindow().getAttributes(); params.alpha = 0.7f; getWindow().setAttributes(params); mPopupWindow.showAtLocation(mRecycler, Gravity.BOTTOM, 0, 0); }
dismiss的时候:
mPopupWindow.setOnDismissListener(new PopupWindow.OnDismissListener() { @Override public void onDismiss() { WindowManager.LayoutParams params = getWindow().getAttributes(); params.alpha = 1f; getWindow().setAttributes(params); } });
四、总结
(1)popupwindow和dialog一样都是和View平级的控件,都在app包下;
(2)popupwindow是处在整个Activity最顶层,设置在window层级;
(3)Window是Activity在Attach时候创建的,在创建的过程中会设置windowsoftInputmode属性值,这里可以参考老罗的这篇博文:/article/1363513.html
(4)关于windowsoftInputmode相关值得含义:
【A】stateUnspecified:软键盘的状态并没有指定,系统将选择一个合适的状态或依赖于主题的设置【B】stateUnchanged:当这个activity出现时,软键盘将一直保持在上一个activity里的状态,无论是隐藏还是显示
【C】stateHidden:用户选择activity时,软键盘总是被隐藏
【D】stateAlwaysHidden:当该Activity主窗口获取焦点时,软键盘也总是被隐藏的
【E】stateVisible:软键盘通常是可见的
【F】stateAlwaysVisible:用户选择activity时,软键盘总是显示的状态
【G】adjustUnspecified:默认设置,通常由系统自行决定是隐藏还是显示
【H】adjustResize:该Activity总是调整屏幕的大小以便留出软键盘的空间
【I】adjustPan:当前窗口的内容将自动移动以便当前焦点从不被键盘覆盖和用户能总是看到输入内容的部分
相关文章推荐
- Android开发中常见的设计模式
- Android账号注册实现点击获取验证码倒计时效果
- android图片压缩上传系列-基础篇
- Android Support兼容包详解
- Android 使用第三方SDK—友盟实现分享功能
- Android Navigation TabBar控件实现多彩标签栏
- Android selector item 属性大全
- 解决android有的手机拍照后上传图片被旋转的问题
- 仿QQ列表侧滑删除的ListView
- android内核基础
- android配置环境时,adb端口占用问题
- android graphic(22)—android M 分屏功能开关
- Android导航栏隐藏与浮现
- android_实现EditText的抖动效果
- Android Cordova 插件开发之Cordova安装
- Android中使用定时器的三种方法
- 高德地图LBS开发定位--android客户端
- Android Cordova 插件开发之创建项目
- 关于Android依赖注入框架ButterKnife和Dagger的简单比较
- android studio配置记录