簡體   English   中英

為什么我的View.setVisibility(View.INVISIBLE)方法不能按時工作?

[英]Why is my View.setVisibility(View.INVISIBLE) method not working on time?

我正在開發我的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
    }

我被困在這里幾天。 如果有人可以幫助或給我提示,我將不勝感激。

PS。 我不明白為什么沒有人對此問題感興趣,是因為這個問題根本不值得回答,還是因為我在這里以錯誤的方式/方式提出問題?

[UPDATE]

盡管大約一個星期后沒有人回答我的問題。 我設法解決了這個問題,現在我想在這里發布解決方案,以防將來有人遇到同樣的問題。

我確實通過Android提供的AsyncTask實現解決了單擊浮動窗口的問題-隱藏自身-截取屏幕截圖-顯示其自身順序。

在AsyncTask的onPreExecute()方法中,我將隱藏浮動窗口的代碼放入其中。

在AsyncTask的doInBackground()方法中,我放入了獲取屏幕截圖的代碼。

在AsyncTask的onPostExectue()方法中,我放入了顯示浮動窗口的代碼。

然后在我的onCreate()onTouch()方法中,只需初始化AsyncTask並執行它。

一切都按我的預期工作,我不知道為什么以前的代碼不起作用。 我試圖啟動一個新線程並使用Thread.join等待完成截圖的線程,然后顯示浮動窗口,即使這不起作用),但是AsyncTask也可以工作。

只是希望這會對某人有所幫助,我希望有人也能向我解釋。

這個答案可能對某人有所幫助,我也遇到了這個問題。 但就我而言,我對視圖使用了RotateAnimation。 如果我注釋RotateAnimation代碼,則View.INVISIBLE正在運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM