[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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android桌面悬浮是一种在Android手机或平板电脑的桌面上显示的浮动口。它可以在其他应用程序之上显示,并且可以在用户使用其他应用程序时保持可见。悬浮可以用来显示通知、快捷操作、实时信息等等,为用户提供更方便的操作和查看方式。 要实现Android桌面悬浮,你可以使用Android的WindowManager类。首先,你需要在你的应用程序中声明SYSTEM_ALERT_WINDOW权限,以便能够在其他应用程序之上显示悬浮。然后,你可以使用WindowManager来创建和管理悬浮。 以下是一个简单的示例代码,演示如何创建一个简单的悬浮: ```java // 获取WindowManager对象 WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); // 创建一个悬浮口布局参数 WindowManager.LayoutParams layoutParams = new WindowManager.LayoutParams(); // 设置悬浮口类型为系统级别的口 layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; // 设置悬浮口的宽高 layoutParams.width = WindowManager.LayoutParams.WRAP_CONTENT; layoutParams.height = WindowManager.LayoutParams.WRAP_CONTENT; // 设置悬浮口的位置 layoutParams.gravity = Gravity.TOP | Gravity.LEFT; layoutParams.x = 100; layoutParams.y = 100; // 创建一个ImageView作为悬浮口的内容 ImageView imageView = new ImageView(this); imageView.setImageResource(R.drawable.icon); // 将ImageView添加到悬浮口中 windowManager.addView(imageView, layoutParams); ``` 以上代码创建了一个包含一个图标的悬浮口,并将其添加到屏幕上。你可以根据自己的需求修改悬浮口的内容和样式。记得在不需要悬浮口时,调用`windowManager.removeView(imageView)`来移除悬浮口。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值