先直接上代码:(代码中有少量的注解,但都是实现功能的关键)
接口ViewManager中定义了addView、reMoveView、updateView方法,WindManager实现了ViewManager但是没有直接去实现这三个方法,间接的交给WindowManagerGlobal去实现addView、reMoveView、updateView方法。
package com.example.andyshangguan.test_windowmnanger;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.WindowManager.LayoutParams;
import android.widget.Toast;
@SuppressLint("ServiceCast")
public class MainActivity extends Activity {
private View windowView;
private LayoutInflater inflater;
private WindowManager.LayoutParams wL;
private WindowManager windowManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
// inflater = getLayoutInflater();
inflater= (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
windowView = inflater.inflate(R.layout.layout_showwindow, null);
//(ViewGroup)getWindow().getDecorView().findViewById(android.R.id.content));
windowView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "windowView", Toast.LENGTH_SHORT).show();
}
});
windowView.setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//getRawX是触摸位置相对于屏幕的坐标,getX是相对于按钮的坐标
float rawx = event.getRawX() - v.getMeasuredWidth() / 2;
float rawy = event.getRawY() - v.getMeasuredHeight() / 2;
switch (event.getAction()) {
case MotionEvent.ACTION_MOVE:
Log.e("info", " event.getX()====" + event.getRawX());
Log.e("info", " event.getY()====" + event.getRawY());
wL.x = (int) rawx;
wL.y = (int) rawy;
windowManager.updateViewLayout(v, wL);
break;
default:
break;
}
return false;
}
});
wL = new WindowManager.LayoutParams(LayoutParams.WRAP_CONTENT,
//TYPE_TOAST类型系统是不需要权限的。如果申明为TYPE_SYSTEM_XXX权限,在AndroidManifest.xml申明权限
//参考:http://www.jianshu.com/p/167fd5f47d5c?utm_campaign=maleskine&utm_content=note&utm_medium=writer_share&utm_source=weibo
LayoutParams.WRAP_CONTENT, LayoutParams.TYPE_TOAST, 0, PixelFormat.TRANSPARENT);
wL.flags = LayoutParams.FLAG_NOT_TOUCH_MODAL
| LayoutParams.FLAG_NOT_FOCUSABLE
| LayoutParams.FLAG_SHOW_WHEN_LOCKED;
wL.gravity = Gravity.LEFT | Gravity.TOP;
wL.x = 100;
wL.y = 300;
windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
}
//在布局文件中直接使用的onClik方法
public void showWindow(View v) {
switch (v.getId()) {
case R.id.showWindow:
windowManager.addView(windowView, wL);
break;
default:
break;
}
}
}