仿苹果的EasyTouch

来源:互联网 发布:软件外部接口 编辑:程序博客网 时间:2024/05/21 07:47
最近工作中需要做出一个桌面移动的控件!也就是类似苹果手机的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() {@Overridepublic 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
原创粉丝点击