展会信息港展会大全

Android popupwindow以及windowManager总结——实现悬浮效果
来源:互联网   发布日期:2015-10-03 11:39:32   浏览:1717次  

导读:Android有三类窗口应用程序窗口 (Application Window): 包括所有应用程序自己创建的窗口,以及在应用起来之前系统负责显示的窗口。子窗口(Sub Window):比如...

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偏移的位置

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

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开发

AiLab云推荐
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港