[Android]桌面悬浮窗 (demo)

Demo下载地址:http://download.csdn.net/detail/u011634756/5915433(免积分哦~)

———华丽的分割线—————

一、 个人认为的原理

WindowManager 可以add一个优先级比较高的view到桌面上去

二、实现过程

1. 配置 WindowManager.LayoutParams 能不能实现桌面悬浮就主要就靠这个

2. 配置你要悬浮的view (画面,滑动,点击事件)

3. 通过WindowManager 把view 给add 到桌面上

三、贴代码


1. 配置 WindowManager.LayoutParams

建一个继承于Application 的类进行配置一个WindowManager.LayoutParams

为毛要在Application 里面用呢? 很简单因为每个程序运行时创建一个Application类的对象且仅创建一个,

所以我们可以在里面进行一些数据共享什么的 。 如果再蛋疼点 你可以自己去写一个单例模式也可以哦。

	/**
	 * 初始化一下相关参数
	 */
	public void initWindowParams(){
		// 设置LayoutParams(全局变量)相关参数		
		mWindowParams.type = WindowManager.LayoutParams.TYPE_PHONE;// 该类型提供与用户交互,置于所有应用程序上方,但是在状态栏后面
		mWindowParams.flags |= WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;// 不接受获取焦点事件
		mWindowParams.gravity = Gravity.LEFT | Gravity.TOP; // 以屏幕左上角为原点
		// 设置x、y初始值 既开始是的位置 默认为坐标 (0 ,0 )
		mWindowParams.x = 0;
		mWindowParams.y = 0;
		// 设置悬浮窗口长宽数据
		mWindowParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
		mWindowParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
		mWindowParams.format = PixelFormat.RGBA_8888;
	}

2. 配置要显示的View

a.创建view

	private void createView() {
		mWindowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
		mWindowParams = ((FloatingDemoApplication) getApplication())
				.getWindowParams();
		// 偷懒了哈  这个地方我就直接来个ImageView  
		// 这个可以获取别的view
		showImg = new ImageView(this);
		showImg.setImageResource(R.drawable.icon_float);
		showImg.setOnTouchListener(this);
		mWindowManager.addView(showImg, mWindowParams);

	}

b.view的相关事件处理

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

		// 获取相对屏幕的坐标,即以屏幕左上角为原点
		x = event.getRawX();
		// 减去状态栏的高度
		y = event.getRawY() - getStatusBarHeight();

		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			
			ACTION_DOWN_TIME = System.currentTimeMillis();
			// 获取相对View的坐标,即以此View左上角为原点
			mTouchStartX = event.getX();
			mTouchStartY = event.getY() + showImg.getHeight() / 2;
			mWindowParams_x_old = mWindowParams.x;
			mWindowParams_y_old = mWindowParams.y;
			break;

		case MotionEvent.ACTION_MOVE:
			updateViewPosition((int) (x - mTouchStartX),(int) (y - mTouchStartY));
			break;

		case MotionEvent.ACTION_UP:
			ACTION_UP_TIME = System.currentTimeMillis();
			long time = ACTION_UP_TIME - ACTION_DOWN_TIME;
			Log.i(TAG, "time == " + time);
			// 我们把down和up时间差小于120 可以看作点击事件
			if ( time < 120) {
				// 把位置给回退到以前为位置
				updateViewPosition(mWindowParams_x_old, mWindowParams_y_old);
				mHandler.sendEmptyMessage(0);
			} else {
				// 把图片给回退到边上
				aSideViewPosition();
			}
			mTouchStartX = mTouchStartY = 0;
			break;
		}
		return true;
	}

	private void updateViewPosition(int x, int y) {
		// 更新浮动窗口位置参数
		mWindowParams.x = x;
		mWindowParams.y = y;
		mWindowManager.updateViewLayout(showImg, mWindowParams);
	}


3. 把view给Add上去 这个我就不说了

四、那个效果图

不知道怎么截取动态图片,用腾讯的截取的 貌似很搓的 凑合着看吧



====================关注小鱼===================

新浪微博http://weibo.com/AwareMissing

腾讯微博http://t.qq.com/y_haiyang


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值