Android делает снимок экрана закадровой страницы - PullRequest
19 голосов
/ 09 апреля 2011

Я работаю над приложением для Android.У меня есть действие, скажем A, которое заполняет весь экран представлениями. При нажатии кнопки в AI я хочу запустить другое действие, скажем, B, которое также имеет некоторые представления и элементы управления.Я хочу, чтобы действие B было за кадром, и хочу сделать снимок экрана B от A.Является ли это возможным?

Примечание. Я успешно сделал снимок экрана страницы A, сохранив кэш чертежа в растровом изображении, но изо всех сил пытаясь сделать снимок экрана закадровой страницы.

Ответы [ 4 ]

14 голосов
/ 16 апреля 2011

Да, это возможно ... Вы должны расширить ActivityGroup в Деятельности 'A'. Затем сделайте это в вашем событии нажатия кнопки ...

 View view =getLocalActivityManager().startActivity("B",new Intent(this,B.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();

затем преобразовать это представление как растровое изображение ...

Я думаю, что это полезно для вас ...

5 голосов
/ 19 сентября 2013

Ну, я добился того, чего хочу. Вот шаги, которые я использовал.

  1. Начните действие B с startActivityForResult () вместо startActivity ().

    Intent bIntent = new Intent(A.this,B.class);
    startActivityForResult(bIntent,B_REQUEST_CODE);
    
  2. В onCreate действия B возьмите mainLayout of B и включите его кэш чертежей

    final LinearLayout layout = (LinearLayout)
                         findViewById(R.id.app_parent_layout);
    layout.setDrawingCacheEnabled(true);
    layout.setDrawingCacheQuality(LinearLayout.DRAWING_CACHE_QUALITY_HIGH);
    
  3. В действии B подождите, пока его макет не будет нарисован полностью (Это очень важный). Для этого в onCreate () действия B получите mainLayout B, используйте ViewTreeObserver, чтобы получить обратный вызов, когда его макет рисуется полностью.

    ViewTreeObserver vto = layout.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
     @Override
     public void onGlobalLayout() {
      layout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
      getDrawingBitmap();
     }
    });
    
  4. Теперь getDrawingBitmap () вызывается, когда макет отрисовывается полностью. Там снимай свой скриншот.

    public void getDrawingBitmap(){
        LinearLayout mainLayout = (LinearLayout)
                            findViewById(R.id.app_parent_layout);
        Bitmap b = mainLayout.getDrawingCache();
    
        File file = saveBitmapAsFile(b);
    
        Intent resultIntent = new Intent();
        resultIntent.putExtra("FullFileName",file.getAbsolutePath());
        setResult(Activity.RESULT_OK,resultIntent);
        finish();
    }
    

    Здесь я беру растровое изображение, сохраняю его в виде файла и возвращаю имя файла в качестве кода результата. Я уверен, что есть лучший способ отправить растровое изображение для родительской активности, чем сохранение в файл и отправка имя файла. Но у меня есть требование сохранить растровое изображение для когда-то. Так что для меня это более простой метод. После установки результата завершение деятельности.

  5. Теперь в действии A onActivityResult () получает имя файла.

    public void onActivityResult(int requestCode, int resultCode, Intent data) {
      super.onActivityResult(requestCode, resultCode, data);
      if(requestCode == B_REQUEST_CODE){
        if (resultCode == Activity.RESULT_OK) { 
          String newText = data.getStringExtra("FullFileName");
         File dir = new File (newText);
        } 
      }
    }
    
1 голос
/ 15 апреля 2011

Я думаю, что это будет очень трудно сделать, так как я не знаю способа контролировать методы рисования этих видов, и ОС Android не будет рисовать их, если они не видны.

Однако может быть возможность на передний план другого представления на короткое время заполнить его кэш чертежа.Может быть, он может быть снова помещен в фон, прежде чем он станет видимым, так как для плавного восприятия ОС, кажется, рисует представления за кадром до того, как они фактически скомпонованы на переднем плане.

Другая хитрость может заключаться в том, чтобы прикрепить вид переднего плана как дочерний вид к фону и придать ему очень небольшую альфа-прозрачность.Например, WebView может очень хорошо накладываться таким образом, фактически вынуждая рисовать и WebView, и его фон.Может быть, это работает и с другими представлениями.

0 голосов
/ 24 июля 2012

Я использую этот способ, он прекрасно работает, но есть проблема, я просто делаю снимки одного макета в первый раз, когда я делаю снимок, он дает мне правильное изображение, но после некоторых изменений я делаю это снова, он дает мне предыдущий снимок.

RelativeLayout layout = (RelativeLayout)findViewById(R.id.mainview);
    layout.setDrawingCacheEnabled(true);
    layout.setDrawingCacheQuality(LinearLayout.DRAWING_CACHE_QUALITY_HIGH);
    layout.buildDrawingCache();
    Bitmap bitmap = layout.getDrawingCache();

          File file =  new File(Environment.getExternalStorageDirectory().toString() + "/sPenimg.png");
          FileOutputStream ostream;
          try {
              ostream = new FileOutputStream(file);
              bitmap.compress(CompressFormat.PNG, 100, ostream);
              ostream.flush();
              ostream.close();      
          } catch (FileNotFoundException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          } catch (IOException e) {
              // TODO Auto-generated catch block
              e.printStackTrace();
          }

Эта проблема решена для добавления ((RelativeLayout) findViewById (R.id.mainview)). DestroyDrawingCache ();

...