Service实现全局悬浮按钮

需求:

实现一个悬浮于所有应用之上的小控件,并可随意拖动,可点击展开,不能影响下方应用正常使用。

实现:

public void switch2small() {
        LayoutParams mTouchDotParams = new LayoutParams();
		// 设置window type,位于顶层
		mTouchDotParams.type = LayoutParams.TYPE_PRIORITY_PHONE;
		//mTouchDotParams.type = LayoutParams.TYPE_BASE_APPLICATION;
		//mTouchDotParams.softInputMode = LayoutParams.SOFT_INPUT_ADJUST_PAN;;
		// 设置图片格式,效果为背景透明
		mTouchDotParams.format = PixelFormat.RGBA_8888;

		//View以外的区域可以响应点击和触摸事件
		mTouchDotParams.flags = WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL
		| WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
		| WindowManager.LayoutParams.FLAG_FULLSCREEN
		| WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;

		// 调整悬浮窗口至左上角,便于调整坐标
		mTouchDotParams.gravity = Gravity.LEFT | Gravity.TOP;
		// 以屏幕左上角为原点,设置x、y初始位置
		mTouchDotParams.x = 1050;
		mTouchDotParams.y = 100;

		// 设置悬浮窗口长宽数据
		mTouchDotParams.width = LayoutParams.WRAP_CONTENT;
		mTouchDotParams.height = LayoutParams.WRAP_CONTENT;

		final ImageView view = new ImageView(this);
		FrameLayout.LayoutParams fl = new FrameLayout.LayoutParams(50, 50);
		view.setLayoutParams(fl);
		view.setImageResource(R.drawable.main_icon);
		view.setClickable(true);
        //点击
		view.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				// TODO Auto-generated method stub
				Log.i("vga", "==small onclick======");
				//view.setVisibility(View.GONE);
				if(onScrolling)
					return;
				mWindowManager.removeViewImmediate(view);
				setupLayoutParams();
				
			}
		});
        //拖动
		view.setOnTouchListener(new OnTouchListener() {
			
			@Override
			public boolean onTouch(View v, MotionEvent event) {
				// TODO Auto-generated method stub
				switch (event.getAction()) {
			    case MotionEvent.ACTION_DOWN:
			     lastX = (int) event.getRawX();//获取事件发生时的坐标
			     lastY = (int) event.getRawY();
	
			     break;
			    case MotionEvent.ACTION_MOVE:

				  if(Math.abs(lastX-mTouchDotParams.x)>50 || Math.abs(lastY-mTouchDotParams.y)>50){
					  return false;
				  }
				  
			      if((int) event.getRawX() - lastX>10 || (int) event.getRawY() - lastY>10){
						mTouchDotParams.x = (int) event.getRawX();
						mTouchDotParams.y = (int) event.getRawY();
						banClickToKTV(mTouchDotParams.x,mTouchDotParams.y,50,50);
						mWindowManager.updateViewLayout(view, mTouchDotParams);
						lastX = (int) event.getRawX();
						lastY = (int) event.getRawY();
						return true;
			     }
				onScrolling = true;
			     break;
			    case MotionEvent.ACTION_UP:
					if(onScrolling){
						onScrolling = false;
						return true;
					}
				
			     break;
			    }
			    return false;
			}
		});
		
		mWindowManager.addView(view, mTouchDotParams);
		
	}
	

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值