Android中使用WindowManager在界面布局上添加浮动窗口
2014-03-05 11:51
417 查看
如果大家看过一些游戏sdk中的功能,现在大多都有悬浮窗口这个功能。如360,uc等等。。
这里不需要定义service,只需要这只WindowsManager中的LayoutParams就可以达到这个悬浮框可以绑定界面的功能。
话不多说,先上代码:
然后,以下是自定义button的代码:
这里不需要定义service,只需要这只WindowsManager中的LayoutParams就可以达到这个悬浮框可以绑定界面的功能。
话不多说,先上代码:
public class FloatBox extends BasicView { LinearLayout mFloatLayout; FloatButton floatView; String TAG = "FloatBox"; WindowManager.LayoutParams windowParams; WindowManager mWindowManager; float mStartX = 0; float mStartY = 0; public FloatBox(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub } public FloatBox(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } public FloatBox(Context context, String str) { super(context, str); // TODO Auto-generated constructor stub } public FloatBox(Context context) { super(context); // TODO Auto-generated constructor stub } @Override protected void init(Context context) { // TODO Auto-generated method stub initWindowBox(context); } private void initViewBox(Context context){ mFloatLayout = new LinearLayout(context); LinearLayout.LayoutParams mFloatLayoutLP = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); mFloatLayout.setLayoutParams(mFloatLayoutLP); mFloatLayout.setOrientation(LinearLayout.VERTICAL); floatView = new FloatButton(context); LinearLayout.LayoutParams floatViewLp = new LinearLayout.LayoutParams( MetricUtil.getDip(context, 50), MetricUtil.getDip(context, 50)); floatView.setLayoutParams(floatViewLp); mFloatLayout.addView(floatView); } /** * 用windowManager来添加box * @param context */ private void initWindowBox(Context context){ windowParams = new WindowManager.LayoutParams(); mWindowManager = (WindowManager) context .getSystemService(context.WINDOW_SERVICE); // 设置window type 这里使用的type是1000 - 2000之间的,需要绑定token // 如果使用2000以上的类型的话,一般适用于桌面上的悬浮窗. windowParams.type = WindowManager.LayoutParams.TYPE_APPLICATION; windowParams.format = PixelFormat.RGBA_8888; windowParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE; windowParams.gravity = Gravity.LEFT | Gravity.TOP; // 以屏幕左上角为原点,设置x、y初始值,相对于gravity windowParams.x = 0; windowParams.y = 0; // 长宽设置 windowParams.width = WindowManager.LayoutParams.WRAP_CONTENT; windowParams.height = WindowManager.LayoutParams.WRAP_CONTENT; mFloatLayout = new LinearLayout(context); LinearLayout.LayoutParams mFloatLayoutLP = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); mFloatLayout.setLayoutParams(mFloatLayoutLP); mFloatLayout.setOrientation(LinearLayout.VERTICAL); // 绑定token windowParams.token = mFloatLayout.getWindowToken(); // 添加layout mWindowManager.addView(mFloatLayout, windowParams); floatView = new FloatButton(context); LinearLayout.LayoutParams floatViewLp = new LinearLayout.LayoutParams( MetricUtil.getDip(context, 50), MetricUtil.getDip(context, 50)); floatView.setLayoutParams(floatViewLp); mFloatLayout.addView(floatView); mFloatLayout.measure(View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), View.MeasureSpec .makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); Log.i(TAG, "Width/2--->" + floatView.getMeasuredWidth() / 2); Log.i(TAG, "Height/2--->" + floatView.getMeasuredHeight() / 2); floatView.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub System.out.println("onTouch "); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: //加一个值,更方便点击 if(Math.abs(event.getRawX() - mStartX) > 30){ mStartX = event.getRawX(); } if(Math.abs(event.getRawY() - mStartY) > 30){ mStartY = event.getRawY(); } updatePosition(); break; case MotionEvent.ACTION_UP: break; default: break; } // if(event.getAction() == MotionEvent.ACTION_MOVE){ // // Log.i(TAG, "event.getRawX()--->" + event.getRawX()); // Log.i(TAG, "event.getRawX()--->" + event.getRawY()); // mStartX = event.getRawX(); // mStartY = event.getRawY(); // }else if(event.getAction() == MotionEvent.ACTION_UP){ // return true; // } return false; } }); final Context mcontext = context; floatView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Toast.makeText(mcontext, "floatView onclick", 1000).show(); return; } }); } private void updatePosition(){ windowParams.x = (int) (mStartX - floatView .getMeasuredWidth() / 2); windowParams.y = (int) (mStartY - floatView .getMeasuredHeight() / 2); // refresh Log.i(TAG, "x--->" + windowParams.x); Log.i(TAG, "y--->" + windowParams.y); mWindowManager.updateViewLayout(mFloatLayout, windowParams); } public void showBox() { mFloatLayout.setVisibility(View.VISIBLE); } public void hideBox() { mFloatLayout.setVisibility(View.GONE); } public void removeBox() { mWindowManager.removeView(mFloatLayout); } }
然后,以下是自定义button的代码:
public class FloatButton extends Button { public FloatButton(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO Auto-generated constructor stub init(); } public FloatButton(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub init(); } public FloatButton(Context context) { super(context); // TODO Auto-generated constructor stub init(); } private void init() { Decorator.setStateImage(this, ResourceLoader.getBitmapDrawable("appicon_normal.png"), ResourceLoader.getBitmapDrawable("appicon_hover.png"), ResourceLoader.getBitmapDrawable("appicon_normal.png")); } }
相关文章推荐
- Android使用WindowManager在界面添加一个悬浮框
- 使用Windowmanager给界面添加窗口
- android UI学习 -- 设置界面的布局(包括style的使用,selector的使用,Checkbox自定义样式,菜单项的样式)
- Android中将布局文件/View添加至窗口过程分析 ---- 从setContentView()谈起
- Android中将布局文件/View添加至窗口过程分析 ---- 从setContentView()谈起
- Android 8.0系统上使用WindowManager添加view的一个问题
- Android使用WindowManager实现悬浮窗口
- Android中将布局文件/View添加至窗口过程分析 ---- 从setContentView()谈起
- Android-使用XML布局文件实现游戏的开始界面
- 在Android中使用WindowManager实现悬浮窗口
- 【Android】使用WindowManager添加View
- iOS 8 Auto Layout界面自动布局系列4-使用VFL添加布局约束
- Auto Layout界面自动布局系列-使用VFL添加布局约束
- 在Android中使用WindowManager实现悬浮窗口
- Android中使用WindowManager实现悬浮窗口
- Android中将布局文件/View添加至窗口过程分析 ---- 从setContentView()谈起
- Android中将布局文件/View添加至窗口过程分析 ---- 从setContentView()谈起
- 使用层级观察器hierarchyviewer综合各种布局实现Android QQ2012登陆界面和注册界面
- Android中将布局文件/View添加至窗口过程分析
- Android 8.0系统上使用WindowManager添加view的一个问题