андроид, снимок экрана с экрана
Я работаю над приложением для Android. У меня есть активность, скажем, A, которая заполняет весь экран просмотрами. На одно нажатие кнопки в AI хочется начать другое действие, скажем B, в котором также есть некоторые виды и элементы управления. Я хочу, чтобы активность B была вне экрана, и вы хотите сделать снимок экрана B от A. Является ли это возможным?
Примечание. Мне удастся снять скриншот страницы A, сохранив кэш чертежа в bitmap, но изо всех сил пытаюсь снять снимок экрана на экране.
- Android запускает программный снимок экрана
- Как предотвратить захват экрана в Android
- Программный скрининг на мобильном устройстве
- Захват экрана в bitmap
- Получить скриншот конкретного приложения
- Как сделать снимок экрана в OpenGL
- Взятие «скриншотов» определенного макета в Android
- Android получает снимок экрана всех элементов ListView
- Захват снимка экрана с использованием .NET
- Как захватить снимок экрана определенного элемента, а не всей страницы, используя Selenium Webdriver?
- Как сделать снимок экрана и поделиться им программно
- Как сделать снимок экрана текущей веб-страницы с помощью javascript / jquery
- Можете ли вы снять «скриншот» на странице с помощью Canvas?
Да, возможно … Вы должны расширить ActivityGroup в Activity ‘A’. Затем сделайте это в событии click button …
View view =getLocalActivityManager().startActivity("B",new Intent(this,B.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();
затем преобразуйте это представление в bitmap …
Я думаю, что это полезно для вас …
Ну, я достиг того, чего хочу. Это те шаги, которые я использовал.
-
Запустите действие 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(); }
Здесь я беру bitmap и сохраняю его как файл и возвращаю имя файла в виде кода результата. Я уверен, что есть лучший способ отправить битмап родительской активности, а не сохранять в файл и отправить имя файла. Но у меня есть требование, чтобы сохранить битмап на какое-то время. Так что для меня это более простой метод. После установки результата завершения результата.
-
Теперь в 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 ();