2015-11-30 159 views
1

我正在研究我的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。 我不明白为什么没有人似乎对这个问题感兴趣,是因为这个问题根本不值得回答,或者只是我在这里以错误的方式/方式提问?

+0

有人知道原因吗?我做了几个其他的实验,没有一个能工作。 –

回答

0

[更新]

虽然没有人回答我的问题后一个星期左右。我设法解决了这个问题,现在我想在这里发布解决方案,以防将来遇到同样的问题。

我没有解决点击浮动窗口的问题 - 隐藏自己 - 采取截图 - 显示自己序列与的AsyncTask实施由Android提供。

在AsyncTask的onPreExecute()方法中,我把隐藏浮动窗口的代码放在里面。

在AsyncTask的doInBackground()方法中,我把截屏的代码放在里面。

在AsyncTask的onPostExectue()方法中,我把显示浮动窗口的代码放在里面。

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

一切正如我所料,我不知道为什么以前的代码不工作。我尝试启动一个新的Thread并使用Thread.join来等待截图的线程'完成,然后显示浮动窗口,即使这不起作用),但AsyncTask的作品。

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

0

这个答案可能对某人有帮助,我也遇到过这个问题。但在我的情况下,我使用RotateAnimation来查看。如果我评论RotateAnimation代码,则View.INVISIBLE正在工作。

相关问题