Android popupwindow以及windowManager总结——实现悬浮效果
2014-05-15 21:30
330 查看
Android有三类窗口
应用程序窗口 (Application Window): 包括所有应用程序自己创建的窗口,以及在应用起来之前系统负责显示的窗口。
子窗口(Sub Window):比如应用自定义的对话框,或者输入法窗口,子窗口必须依附于某个应用窗口(设置相同的token)。
系 统窗口(System Window): 系统设计的,不依附于任何应用的窗口,比如说,状态栏(Status Bar), 导航栏(Navigation Bar), 壁纸(Wallpaper), 来电显示窗口(Phone),锁屏窗口(KeyGuard), 信息提示窗口(Toast), 音量调整窗口,鼠标光标等等。
popupwindow是属于 sub window的,所以一定要有一个view去依附
主要有两个方法
showAtLocation(View parent,
int gravity, int x, int y)
显示popupwindow在特殊的位置
showAsDropDown(View anchor,
int xoff, int yoff)
显示在view anchor左下x偏移以及y偏移的位置
Android系统窗口实现悬浮以及监听Ontouch事件
window的参数初始化
format表示透明,下面可以看见
type可以试系统窗口中的TYPE_PHONE,或者其他的,窗口值越大,现在越在上面,
flag表示视图的参数,表示是否可以触摸,可以聚焦等。
grvavity表示view的位置等。
popupwindow点击view以外的地方消失
这样,显示的时候,popupWindow获取啦焦点,后面的内容为非活动。
但是这样不能实现点击屏幕其他部分使其消失,返回键也不行。
这时候要给popupWindow设置一个一个BackgroundDrawable,如果你已经定义好布局,怕破坏掉样式,只需要设置一个空的Drawable即可。
应用程序窗口 (Application Window): 包括所有应用程序自己创建的窗口,以及在应用起来之前系统负责显示的窗口。
子窗口(Sub Window):比如应用自定义的对话框,或者输入法窗口,子窗口必须依附于某个应用窗口(设置相同的token)。
系 统窗口(System Window): 系统设计的,不依附于任何应用的窗口,比如说,状态栏(Status Bar), 导航栏(Navigation Bar), 壁纸(Wallpaper), 来电显示窗口(Phone),锁屏窗口(KeyGuard), 信息提示窗口(Toast), 音量调整窗口,鼠标光标等等。
popupwindow是属于 sub window的,所以一定要有一个view去依附
主要有两个方法
showAtLocation(View parent,
int gravity, int x, int y)
显示popupwindow在特殊的位置
showAsDropDown(View anchor,
int xoff, int yoff)
显示在view anchor左下x偏移以及y偏移的位置
public void on_effect(final View v){ /* data.src_bmp=myview.bmp; Intent intent=new Intent(drowview.this,bmpeffect.class); startActivity(intent); */ //前面那个线性布局消失 Log.e("on_effect", "ing"); pop_num=0; //relayout2.setVisibility(View.GONE); //relayout.setVisibility(View.VISIBLE); show=true; int[] location = new int[2]; v.getLocationOnScreen(location); Log.e(""+location[0], ""+location[1]); mypopwindow.showAtLocation(v, Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0,0); }
Android系统窗口实现悬浮以及监听Ontouch事件
public void on_show(final View v){ //showpop=(LinearLayout) findViewById(R.id.linearLayoutpop1); //Log.e("show", "ing"); if(pop_show_flag==false){ showpop.setVisibility(View.VISIBLE); leftpop.invalidate(); windowManager.removeViewImmediate(leftpop); //leftpop.setOnTouchListener(l) leftpop=getLayoutInflater().inflate(R.layout.leftpopwindow2, null); leftpop.setOnTouchListener(mylistener); windowManager.addView(leftpop, windowManagerParams); windowManager.updateViewLayout(leftpop,windowManagerParams); pop_show_flag=true; Log.e("show", "flase"); } else{ windowManager.removeViewImmediate(leftpop); leftpop=getLayoutInflater().inflate(R.layout.leftpopwindow,null); leftpop.setOnTouchListener(mylistener); windowManager.addView(leftpop, windowManagerParams); windowManager.updateViewLayout(leftpop,windowManagerParams); pop_show_flag=false; Log.e("show", "true"); } }
window的参数初始化
windowManager=this.getWindowManager(); windowManagerParams=new WindowManager.LayoutParams(); windowManagerParams.format = PixelFormat.RGBA_8888;; windowManagerParams.type = android.view.WindowManager.LayoutParams.TYPE_APPLICATION; windowManagerParams.flags=android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |android.view.WindowManager.LayoutParams.FLAG_SPLIT_TOUCH; //|android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE; // windowManagerParams.flags=android.view.WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|android.view.WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; windowManagerParams.gravity=Gravity.LEFT|Gravity.CENTER_VERTICAL;
format表示透明,下面可以看见
type可以试系统窗口中的TYPE_PHONE,或者其他的,窗口值越大,现在越在上面,
flag表示视图的参数,表示是否可以触摸,可以聚焦等。
grvavity表示view的位置等。
leftpop.setOnTouchListener(mylistener);在这个里面设置ontouch监听器,可以手动调用下面的onTouch
</pre><pre name="code" class="html">mylistener=new OnTouchListener(){ @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub Log.e("top", "ing"); // v. my_drow_view.onTouchEvent(event);//这里调用下面的onTouch return true; } };
popupwindow点击view以外的地方消失
popupWindow.setFocusable(true);
这样,显示的时候,popupWindow获取啦焦点,后面的内容为非活动。
但是这样不能实现点击屏幕其他部分使其消失,返回键也不行。
这时候要给popupWindow设置一个一个BackgroundDrawable,如果你已经定义好布局,怕破坏掉样式,只需要设置一个空的Drawable即可。
popupWindow.setBackgroundDrawable(new PaintDrawable());
相关文章推荐
- Android中的Window、WindowManager以及悬浮框视频播放的实现
- Android -- 使用WindowManager实现悬浮框效果
- Android WindowManager实现悬浮窗效果 (一)——与当前Activity绑定
- Android 自定义PopupWindow实现悬浮窗效果
- Android WindowManager实现悬浮窗效果 (一)——与当前Activity绑定
- 利用Window和WindowManager实现悬浮窗效果——Android开发艺术探索笔记
- android 自定义ScrollView实现反弹效果(以及解决和ListView之间的冲突)
- Android UI控件之Gallery实现循环效果总结
- Android中使用Animation实现控件的动画效果以及Interpolator和AnimationListener的使用
- Android中使用Animation实现控件的动画效果以及Interpolator和AnimationListener的使用
- Android用悬浮按钮实现翻页效果
- Android UI控件之Gallery实现循环效果总结
- Android实现系统联系人字符分组以及字母表导航效果 .
- android HTML 中实现列表效果以及html支持的标签
- Android中使用Animation实现控件的动画效果以及Interpolator和AnimationListener的使用
- Android实现系统联系人字符分组以及字母表导航效果 .
- android-使用ViewGroup实现左右滑动切换界面以及界面裂开的效果
- Android中使用Animation实现控件的动画效果以及Interpolator和AnimationListener的使用
- Android实现系统联系人字符分组以及字母表导航效果 .
- Android中使用Animation实现控件的动画效果以及Interpolator和AnimationListener的使用