Андроид, снимок экрана с экрана

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

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

Ответ 1

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

  • Запустите действие B с помощью startActivityForResult() вместо startActivity().

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

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

    ViewTreeObserver vto = layout.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
     @Override
     public void onGlobalLayout() {
      layout.getViewTreeObserver().removeGlobalOnLayoutListener(this);
      getDrawingBitmap();
     }
    });
    
  • Теперь 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();
    }
    

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

  • Теперь в Activity 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);
        } 
      }
    }
    

Ответ 2

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

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

затем преобразует это представление в виде растрового изображения...

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

Ответ 3

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

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

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

Ответ 4

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

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();.