最近工作中需要做出一个桌面移动的控件!也就是类似苹果手机的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-我都没有删除掉!~对于逻辑不太清楚的朋友帮助估计不小