我正在研究我的Android演示,当点击某个按钮时它将启动一个浮动窗口。然后,通过单击浮动窗口,窗口本身将隐藏,直到当前显示的窗口的屏幕截图被采用,然后显示它自己。为什么我的View.setVisibility(View.INVISIBLE)方法无法按时运行?
基本上,点击浮动窗口 - 隐藏自己 - 采取截图 - 显示自己。
我谷歌搜索,并设法编写一些代码,使其工作。有一些奇怪的地方:每当我点击浮动窗口时,窗口本身并没有按时消失,即我的每个屏幕截图都包含窗口的视图。
该序列似乎变成单击浮动窗口 - 采取截图 - 隐藏自己 - 显示自己。它不应该表现得像这样!
验证码:
public void onCreate() {
super.onCreate();
windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
floatIcon = new ImageView(this);
floatIcon.setImageResource(R.drawable.floating);
final WindowManager.LayoutParams params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
params.gravity = Gravity.TOP | Gravity.LEFT;
params.x = 0;
params.y = 100;
windowManager.addView(floatIcon, params);
try {
floatIcon.setOnTouchListener(new View.OnTouchListener() {
private WindowManager.LayoutParams paramsF = params;
private int initialX;
private int initialY;
private float initialTouchX;
private float initialTouchY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
// Get current time in nano seconds.
long pressTime = System.currentTimeMillis();
// If double click...(click interval should be longer than 2000)
if (pressTime - lastPressTime <= 2000) {
// createNotification();
// ServiceFloating.this.stopSelf();
mHasDoubleClicked = true;
} else {
mHasDoubleClicked = false;
}
lastPressTime = pressTime;
initialX = paramsF.x;
initialY = paramsF.y;
initialTouchX = event.getRawX();
initialTouchY = event.getRawY();
break;
case MotionEvent.ACTION_UP:
if (!mHasDoubleClicked && !mHasMoved) {
if (rootUtil == null) {
rootUtil = RootUtil.getInstance();
}
while (floatIcon.isShown()) {
try {
Thread.sleep(300);
floatIcon.setVisibility(View.INVISIBLE);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Vibrator vb = (Vibrator) getSystemService(VIBRATOR_SERVICE);
vb.vibrate(100);
String tempFileName = String.valueOf(System.currentTimeMillis());
rootUtil.execute("screencap -p /sdcard/" + tempFileName + ".png");
}
floatIcon.setVisibility(View.VISIBLE);
break;
case MotionEvent.ACTION_MOVE:
paramsF.x = initialX + (int) (event.getRawX() - initialTouchX);
paramsF.y = initialY + (int) (event.getRawY() - initialTouchY);
windowManager.updateViewLayout(floatIcon, paramsF);
if ((int) (event.getRawX() - initialTouchX) < 3 && (int) (event.getRawY() - initialTouchY) < 3) {
mHasMoved = false; //Move distance within 3 is not recognized as a real move
} else {
mHasMoved = true;
}
break;
}
return false;
}
});
} catch (Exception e) {
// TODO: handle exception
}
我困在这里好几天。真的很感激,如果有人可以帮助或给我一个提示。
Ps。 我不明白为什么没有人似乎对这个问题感兴趣,是因为这个问题根本不值得回答,或者只是我在这里以错误的方式/方式提问?
有人知道原因吗?我做了几个其他的实验,没有一个能工作。 –