tomar - Android tomando captura de pantalla de la página fuera de la pantalla
cómo hacer una captura (4)
Estoy trabajando en una aplicación de Android. Tengo una actividad, digamos A, que llena toda la pantalla con vistas. En un botón, haga clic en AI para comenzar otra actividad, digamos B, que también tiene algunas vistas y controles. Quiero que la actividad B esté fuera de la pantalla y quiero tomar la captura de pantalla de B de A. ¿Es posible?
Nota: Tengo éxito en tomar la captura de pantalla de la página A guardando el caché de dibujo en un mapa de bits, pero luchando para tomar la captura de pantalla de la página fuera de la pantalla.
Creo que sería muy difícil hacerlo, ya que no conozco ninguna forma de controlar los métodos de dibujo de esas vistas, y el sistema operativo Android tampoco los dibujará a menos que estén visibles.
Sin embargo, puede ser posible poner en primer plano la otra Vista por un corto tiempo para llenar su caché de dibujo. Tal vez se pueda volver a poner en segundo plano antes de que se haga visible, ya que, para lograr una experiencia sin problemas, el sistema operativo parece dibujar las vistas fuera de la pantalla antes de que estén realmente en primer plano.
Otro truco podría ser adjuntar la vista de primer plano como una vista de niño en el fondo y darle una transparencia alfa muy leve. La vista web, por ejemplo, se puede superponer de esta manera muy bien, lo que obliga a dibujar la vista web y su fondo. Tal vez esto funciona con otras vistas también.
Estoy usando de esta manera su funcionamiento es excelente, pero hay un problema. Solo tomo instantáneas de un diseño la primera vez que tomo la instantánea. Me da la imagen correcta, pero luego de algunos cambios, la tomo de nuevo.
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();
}
Este problema se resuelve para agregar ((RelativeLayout) findViewById (R.id.mainview)). DestroyDrawingCache ();
Pues he conseguido lo que quiero. Estos son los pasos que he usado.
Comience la actividad B con startActivityForResult () en lugar de startActivity ().
Intent bIntent = new Intent(A.this,B.class); startActivityForResult(bIntent,B_REQUEST_CODE);
En onCreate de la actividad B, tome mainLayout de B y habilite su caché de dibujo
final LinearLayout layout = (LinearLayout) findViewById(R.id.app_parent_layout); layout.setDrawingCacheEnabled(true); layout.setDrawingCacheQuality(LinearLayout.DRAWING_CACHE_QUALITY_HIGH);
En la actividad B, espere hasta que su diseño se dibuje completamente (Esto es muy importante). Para eso en onCreate () de la actividad B, obtenga mainLayout de B, use ViewTreeObserver para obtener una llamada cuando su diseño esté completamente dibujado.
ViewTreeObserver vto = layout.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { layout.getViewTreeObserver().removeGlobalOnLayoutListener(this); getDrawingBitmap(); } });
Ahora se llama a getDrawingBitmap () cuando el diseño se dibuja por completo. Ahí toma tu captura de pantalla.
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(); }
Aquí estoy tomando el mapa de bits y lo guardo como un archivo y devuelvo el nombre del archivo como un código de resultado. Estoy seguro de que hay un método mejor para enviar el mapa de bits a la actividad principal que guardar como un archivo y enviar un nombre de archivo. Pero tengo un requisito de todos modos para guardar el mapa de bits por algún tiempo. Así que para mí este es el método más fácil. Después de configurar el resultado, termine la actividad.
Ahora en la actividad A onActivityResult () recupera el nombre del archivo.
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); } } }
Sí, es posible ... Debería ampliar el ActivityGroup en la Actividad ''A''. Entonces haz esto en tu evento de click de botón ...
View view =getLocalActivityManager().startActivity("B",new Intent(this,B.class).addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)).getDecorView();
luego convertir esa vista como mapa de bits ...
Creo que esto es útil para ti ...