package com.example.happycodinggirl.testwindowmanager;
import android.content.Context;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
public class MainActivity extends ActionBarActivity {
private WindowManager windowManager;
private View floatview;
private WindowManager floatWindowManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Button button= (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (floatWindowManager==null){
createFloatView();
}
}
});
}
public void createFloatView(){
floatview =LayoutInflater.from(this).inflate(R.layout.floatlayout,null);
mearsureView(floatview);
// windowManager =getWindowManager();
// Log.v("TAG","-----activity windowManager---"+ windowManager);
floatWindowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
Log.v("TAG","----floatWindowManager is---"+ floatWindowManager);
Display display= floatWindowManager.getDefaultDisplay();
int width=display.getWidth();
int height=display.getHeight();
WindowManager.LayoutParams layoutParams=new WindowManager.LayoutParams();
layoutParams.type= WindowManager.LayoutParams.TYPE_PHONE;
layoutParams.flags= WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL|
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;
layoutParams.gravity= Gravity.LEFT|Gravity.TOP;
layoutParams.x=width/2- floatview.getMeasuredWidth()/2;
layoutParams.y=height/2- floatview.getMeasuredHeight()/2;
layoutParams.width=floatview.getMeasuredWidth();
layoutParams.height=floatview.getMeasuredHeight();
floatWindowManager.addView(floatview, layoutParams);
}
public void mearsureView(View view){
int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
view.measure(w, h);
}
@Override
protected void onDestroy() {
super.onDestroy();
if (floatWindowManager!=null){
floatWindowManager.removeView(floatview);
}
}
}
每一个WindowManager都绑定一个Display.你可以通过createDisplayContext(Display)来得到一个这个Display
所属于的Context上下文,然后使用这个上下文context.getSystemService(Context.WINDOW_SERVICE)
来获得一个WindowManager.该功能还未试过,以后尝试下。
gravity属性指的不是view的位置,而是基准点的位置。比如上面代码为
LEFT和TOP,则就是以左上为基准,layoutParams.x,y分别是偏移
该基准位置的距离。所以上面代码展示出来的效果是局屏幕中间显示的
一个view.
另外,activity有个getWindowManager的方法返回一个WindowManager,
为了展示自定义的Windows使用。测试了下换为activity下的windowManager,
发现背景都变为黑色的了。还未深入研究,以后再继续深挖。
完整代码地址
本文介绍了如何在Android中使用WindowManager创建悬浮窗,强调了gravity属性的实际含义,并指出通过activity.getWindowManager()方法获取的WindowManager会使背景变黑,需要进一步探究。
2433

被折叠的 条评论
为什么被折叠?



