仿苹果的EasyTouch

最近工作中需要做出一个桌面移动的控件!也就是类似苹果手机的EasyTouch


事先说明!因为本人没做过也是个菜!所以上网找了下看有人做出来没~刚好碰到EOE社区有人分享了!不过代码里面注视十分少!~本人就在他的基础上加点注释吧!


而且做说之前!~说说这个Demo的问题和不足!


这个Demo在运行的时候-存在一定几率消失掉图标!不知道是因为APP给关闭了还是因为我手机把这个桌面悬浮窗给屏蔽了!


原作者网址:http://www.eoeandroid.com/thread-544248-1-1.html


接下来上代码!主要讲解下重要的代码!剩下的可以去demo里面看~本人是菜鸟-牛人就不要和我一般见识了!有问题可以一起讨论


/**

先说思想:

1- 让自己自定义的界面处于手机桌面的最前端!不管什么时候-

2- 自定义的View开启之后把Activity关闭!因为我们并不需要界面的展示

3- 进行图案的展示-也就是EasyTouch的Button

4- 控件在屏幕的贴磁问题-根据原作者君大代码!分成了六个部分!-----屏幕X分切两半-左半边分为-左上-左下-左边  === 右边分为- 右下-右上-右边

*/

mWindowManager = (WindowManager) context
				.getSystemService(Context.WINDOW_SERVICE);
		layoutParams = new WindowManager.LayoutParams();
		// 设置窗口系统级别为最高-这样窗口就存在最上层
		layoutParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
		// 设置窗口格式为半透明
		layoutParams.format = PixelFormat.TRANSLUCENT;
		layoutParams.flags = WindowManager.LayoutParams.FLAG_IGNORE_CHEEK_PRESSES
				| WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE;

贴上关键代码:

if (iconView == null) {
			iconView = new Button(context);
			iconView.setBackgroundResource(R.drawable.selector_btn_launcher);
			iconView.setOnTouchListener(new View.OnTouchListener() {

				@Override
				public boolean onTouch(View v, MotionEvent event) {
					Log.i("Log", "onTouch");
					// getX()是表示Widget相对于自身左上角的x坐标
					// 而getRawX()是表示相对于屏幕左上角的x坐标值
					// 获取相对屏幕的坐标,即以屏幕左上角为原点
					float rawX = event.getRawX();
					Log.i("Log", "onTouch" + "::rawX::" + rawX);
					Log.i("Log", "onTouch" + "::StartX::" + startRawX);
					// 为状态栏高度 Math.ceil(25
					// * context.getResources().getDisplayMetrics().density))
					float rawY = (float) (event.getRawY() - stateHeight);

					int sumX = (int) (rawX - startRawX);
					Log.i("Log", "onTouch" + "::sumX::" + sumX);
					int sumY = (int) (event.getRawY() - startRawY);

					switch (event.getAction()) {
					case MotionEvent.ACTION_DOWN:
						// 获取相对View的坐标,即以此View左上角为原点
						Log.i("Log", "Action_Down");
						startX = event.getX();
						startY = event.getY();
						startRawX = event.getRawX();
						startRawY = event.getRawY();

						layoutParams.alpha = 1f;
						mWindowManager.updateViewLayout(iconView, layoutParams);
						break;
					case MotionEvent.ACTION_UP:
						Log.i("Log", "sumX=" + sumX + ";sumY=" + sumY);
						Log.i("Log", "Action_up");
						layoutParams.alpha = 0.6f;
						mWindowManager.updateViewLayout(iconView, layoutParams);

						if (sumX > -10 && sumX < 10 && sumY > -10 && sumY < 10) {
							addMainView();
						} else {
							float endRawX = rawX - startX;
							float endRawY = rawY - startY;
							if (endRawX < width / 2) {
								if (endRawX > endRawY) {
									updateIconViewPosition(endRawX, 0);
									Toast.makeText(context, "情况1-1", 0).show();
								} else if (endRawX > height - event.getRawY()
										- 98) {
									updateIconViewPosition(endRawX,
											(float) (height - stateHeight - 98));
									Toast.makeText(context, "情况1-2", 0).show();
								} else {
									updateIconViewPosition(0, endRawY);
									Toast.makeText(context, "情况1-3", 0).show();
								}
							} else {
								if (width - endRawX - 98 > endRawY) {
									updateIconViewPosition(endRawX, 0);
									Toast.makeText(context, "情况2-1", 0).show();
								} else if (width - endRawX - 98 > height
										- event.getRawY() - 98) {
									updateIconViewPosition(endRawX,
											(float) (height - stateHeight - 98));
									Toast.makeText(context, "情况2-2", 0).show();
								} else {
									updateIconViewPosition(width - 98, endRawY);
									Toast.makeText(context, "情况2-3", 0).show();
								}
							}
						}
						startX = 0;
						startY = 0;
						startRawX = 0;
						startRawY = 0;
						break;
					case MotionEvent.ACTION_MOVE:
						Log.i("Log", "Action_Move");
						if (sumX < -10 || sumX > 10 || sumY < -10 || sumY > 10) {
							updateIconViewPosition(rawX - startX, rawY - startY);
						}
						break;
					default:
						break;
					}
					return true;
				}
			});
		}
		layoutParams.alpha = 0.6f;
		layoutParams.x = iconViewX;
		layoutParams.y = iconViewY;
		layoutParams.width = 98;
		layoutParams.height = 98;
		layoutParams.gravity = Gravity.LEFT | Gravity.TOP;
		mWindowManager.addView(iconView, layoutParams);


想尝试的朋友可以下载下来然后试试!因为我亲自测试的时候打了很多log-我都没有删除掉!~对于逻辑不太清楚的朋友帮助估计不小



Demo下载地址

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值