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

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

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

Да, возможно … Вы должны расширить ActivityGroup в Activity ‘A’. Затем сделайте это в событии click button …

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

затем преобразуйте это представление в bitmap …

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

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

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

     Intent bIntent = new Intent(A.this,B.class); startActivityForResult(bIntent,B_REQUEST_CODE); 
  2. В 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); 
  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(); } 

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

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

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

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

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

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

  • Как записывать экран и делать скриншоты с помощью Android API?
  • Сделайте снимок экрана целиком
  • Захват экрана в android
  • Android делает скриншот с помощью кода
  • Сделайте снимок экрана в полноэкранном приложении DirectX
  • Использование HTML5 / Canvas / JavaScript для снятия скриншотов в браузере
  • .NET Equivalent Snipping Tool
  • Как программно сделать снимок экрана?
  • Сделайте снимок экрана SurfaceView
  • Как сделать скриншоты эмулятора с помощью Eclipse?
  • Давайте будем гением компьютера.