为什么我的View.setVisibility(View.INVISIBLE)方法无法正常工作?

时间:2015-11-30 03:59:18

标签: android view visibility

我正在研究我的Android演示,当单击某个按钮时,它将启动一个浮动窗口。然后,通过单击浮动窗口,窗口本身将隐藏,直到获取当前显示窗口的屏幕截图,然后显示自己。

基本上,点击浮动窗口 - 隐藏自身 - 截屏 - 显示自己

我用Google搜索并设法编写一些代码以使其正常工作。有些奇怪:每当我点击浮动窗口时,窗口本身并没有按时消失,即我的每个屏幕截图都包含窗口的视图。

序列似乎变成了点击浮动窗口 - 截屏 - 隐藏自身 - 显示自己。它不应该像这样!

守则:

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
    }

我被困在这里好几天了。真的很感激,如果有人可以帮助或给我一个提示。

聚苯乙烯。 我无法理解为什么似乎没有人对这个问题感兴趣,是因为这个问题根本不值得回答,或者只是我在这里以错误的方式/风格提问?

2 个答案:

答案 0 :(得分:0)

<强> [UPDATE]

虽然大约一周后没有人回答我的问题。我设法解决了这个问题,现在我想在这里发布求解,以防将来有人遇到同样的问题。

我确实解决了点击浮动窗口的问题 - 隐藏自己 - 使用Android提供的 AsyncTask 实现截图 - 显示自身序列。

在AsyncTask的onPreExecute()方法中,我将隐藏浮动窗口的代码放入其中。

在AsyncTask的doInBackground()方法中,我将截屏的代码放入其中。

在AsyncTask的onPostExectue()方法中,我将显示浮动窗口的代码放入其中。

然后在onTouch()的{​​{1}}方法中,只需初始化AsyncTask并执行它。

一切都按照我的预期工作,我不知道为什么以前的代码不起作用。我试图启动一个新线程,并使用Thread.join等待屏幕截图完成,然后显示浮动窗口,即使这不起作用),但AsyncTask工作。

希望这会对某人有所帮助,我也希望有人也可以向我解释。

答案 1 :(得分:0)

这个答案对某人有帮助,我也遇到过这个问题。但就我而言,我使用了RotateAnimation来查看。如果我评论RotateAnimation代码,则View.INVISIBLE正在运行。