通过WindowManager实现拖动悬浮框

原创 2015年11月17日 21:15:18

   最近在弄一个WindowManager拖动的小demo,重新研究了一下 WindowManager。

   直接上源码:

  

package com.haihang.floatviewdemo;

import android.content.Context;
import android.graphics.PixelFormat;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.WindowManager;

public class FloatView implements OnTouchListener {

	private Context mContext;
	private static WindowManager mWm;
	private static WindowManager.LayoutParams mWinParams;
	private static View view;
	private float mDownX;
	private float mDownY;
	private float mMoveX;
	private float mMoveY;

	public FloatView(Context context) {
		this.mContext = context;

		view = View.inflate(mContext, R.layout.float_view, null);

		mWm = (WindowManager) context.getApplicationContext().getSystemService(
				Context.WINDOW_SERVICE);

		mWinParams = new WindowManager.LayoutParams();
		mWinParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
		mWinParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
		mWinParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
				| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON;
		mWinParams.format = PixelFormat.TRANSLUCENT;
		// mParams.windowAnimations =
		// com.android.internal.R.style.Animation_Toast;//动画设置
		//在小米手机的 5.0系统中,需要设置 type为 TYPE_TOAST,才能显示
		mWinParams.type = WindowManager.LayoutParams.TYPE_TOAST;

		view.setOnTouchListener(this);
	}

	public void show() {
		mWm.addView(view, mWinParams);
	}
	
	public void hide(){
		if(mWm != null){
			mWm.removeView(view);
		}
	}

	@Override
	public boolean onTouch(View view, MotionEvent event) {

		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			
			mDownX = event.getRawX();
			mDownY = event.getRawY();
			
			break;
		case MotionEvent.ACTION_MOVE:
			
			/**
			 * 最为关键的就是拖动业务的坐标位置的计算
			 */
			
			mMoveX = event.getRawX();
			mMoveY = event.getRawY();

			float difX =  (mMoveX - mDownX);
			float difY =  (mMoveY - mDownY);
			
			mWinParams.x += difX;
			mWinParams.y += difY;
			
			mWm.updateViewLayout(view, mWinParams);
			
			mDownX = mMoveX;
			mDownY = mMoveY;
			
			break;
		case MotionEvent.ACTION_UP:

			break;

		default:
			break;
		}

		// 消费触摸事件
		return true;
	}

}



相关文章推荐

Android_WindowManager_实现类似360流量悬浮框

这里主要用到WindowManager类,通过WindowManager的addView(View view, WindowManager.LayoutParams params)方法可以在窗体中添...

使用WindowManager创建可拖动的悬浮按钮

场景描述: 界面上有一个浮动按钮,可以用手指拖动,点击该按钮触发事件,我这里是启动扫描,留了一个空实现。 private WindowManager wm; private View view...

android利用windowmanager实现悬浮窗

  • 2016年09月15日 23:33
  • 23.07MB
  • 下载

android WindowManager可拖动悬浮按钮

代码地址 http://git.oschina.net/azure_sword/Sample_AS 可悬浮按钮的两种情况 1.当前页面悬浮 2.所有页面悬浮(包括系统页面) 注:第二种功能...

使用WindowManager添加可拖动悬浮窗口到桌面

添加可拖动悬浮窗口到桌面

使用WindowManager实现Android悬浮窗

来源 http://www.cnblogs.com/mengdd/p/3824782.html 编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅...
  • bfboys
  • bfboys
  • 2016年12月30日 22:37
  • 387
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通过WindowManager实现拖动悬浮框
举报原因:
原因补充:

(最多只允许输入30个字)