Tome una captura de pantalla de una vista completa

He creado una tabla que básicamente está hecha por HorizontalScrollView dentro de ScrollView . Hice que el usuario pueda editar los campos.

Ahora quiero guardar la tabla en una pantalla, jpg, png, pdf o cualquier otra cosa.

El problema es que la mesa casi siempre es más grande que la pantalla.

¿Hay alguna forma de hacer una captura de pantalla de todo el diseño de ScrollView ? Si no, ¿qué crees que puede hacer el trabajo?

En realidad encontré la respuesta:

 public static Bitmap loadBitmapFromView(View v, int width, int height) { Bitmap b = Bitmap.createBitmap(width , height, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(b); v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height); v.draw(c); return b; } 
  ScrollView iv = (ScrollView) findViewById(R.id.scrollView); Bitmap bitmap = Bitmap.createBitmap( iv.getChildAt(0).getWidth(), iv.getChildAt(0).getHeight(), Bitmap.Config.ARGB_8888); Canvas c = new Canvas(bitmap); iv.getChildAt(0).draw(c); // Do whatever you want with your bitmap saveBitmap(bitmap); 

El uso de @softwaresupply answer causa un problema en mi caso en el que mi vista se redibujó y se puso completamente blanca. Hay una solución más fácil para obtener una captura de pantalla donde ni siquiera tiene que proporcionar ancho y alto como parámetros. Use la memoria caché de dibujo .

 public static Bitmap loadBitmapFromView(View v) { Bitmap bitmap; v.setDrawingCacheEnabled(true); bitmap = Bitmap.createBitmap(v.getDrawingCache()); v.setDrawingCacheEnabled(false); return bitmap; } 

Es imposible hacer una captura de pantalla del contenido que aún no se ha procesado (como las partes fuera de la pantalla del ScrollView). Sin embargo, puede realizar capturas de pantalla múltiples, desplazar el contenido entre cada toma y luego unir imágenes. Aquí hay una herramienta que puede automatizar esto para usted: https://github.com/PGSSoft/scrollscreenshot

ilustración

Descargo de responsabilidad: soy autor de esta herramienta, fue publicada por mi empleador . Las solicitudes de funciones son bienvenidas.

Puede pasar la vista una nueva instancia de un Lienzo construido sobre un objeto Bitmap.

Prueba con

 Bitmap b = Bitmap.createBitmap(targetView.getWidth(), targetView.getHeight(), Bitmap.Config.ARGB_8888); Canvas c = new Canvas(b); targetView.draw(c); BitmapDrawable d = new BitmapDrawable(getResources(), b); canvasView.setBackgroundDrawable(d);` 

En realidad hizo el trabajo por mí.

este trabajo para mí, espero que sea útil para ti también.

 public static Bitmap getBitmapByView(ScrollView scrollView) { int h = 0; Bitmap bitmap = null; //get the actual height of scrollview for (int i = 0; i < scrollView.getChildCount(); i++) { h += scrollView.getChildAt(i).getHeight(); scrollView.getChildAt(i).setBackgroundResource(R.color.white); } // create bitmap with target size bitmap = Bitmap.createBitmap(scrollView.getWidth(), h, Bitmap.Config.ARGB_8888); final Canvas canvas = new Canvas(bitmap); scrollView.draw(canvas); FileOutputStream out = null; try { out = new FileOutputStream("/sdcard/screen_test.png"); } catch (FileNotFoundException e) { e.printStackTrace(); } try { if (null != out) { bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); out.flush(); out.close(); } } catch (IOException e) { // TODO: handle exception } return bitmap; } 

Descargue el código fuente desde aquí ( tome la captura de pantalla de scrollview en Android programáticamente )

activity_main.xml

            

MainActivity.xml

 package deepshikha.com.screenshot; import android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.Canvas; import android.os.Bundle; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.Toast; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class MainActivity extends AppCompatActivity { Button btn_screenshot; ScrollView scrollView; LinearLayout ll_linear; public static int REQUEST_PERMISSIONS = 1; boolean boolean_permission; boolean boolean_save; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); init(); fn_permission(); } private void init() { btn_screenshot = findViewById(R.id.btn_screenshot); scrollView = findViewById(R.id.scrollView); ll_linear = findViewById(R.id.ll_linear); btn_screenshot.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { if (boolean_save) { Intent intent = new Intent(getApplicationContext(), Screenshot.class); startActivity(intent); } else { if (boolean_permission) { Bitmap bitmap1 = loadBitmapFromView(ll_linear, ll_linear.getWidth(), ll_linear.getHeight()); saveBitmap(bitmap1); } else { } } } }); } public void saveBitmap(Bitmap bitmap) { File imagePath = new File("/sdcard/screenshotdemo.jpg"); FileOutputStream fos; try { fos = new FileOutputStream(imagePath); bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.flush(); fos.close(); Toast.makeText(getApplicationContext(), imagePath.getAbsolutePath() + "", Toast.LENGTH_SHORT).show(); boolean_save = true; btn_screenshot.setText("Check image"); Log.e("ImageSave", "Saveimage"); } catch (IOException e) { Log.e("GREC", e.getMessage(), e); } } public static Bitmap loadBitmapFromView(View v, int width, int height) { Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(b); v.draw(c); return b; } private void fn_permission() { if ((ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) || (ContextCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) { if ((!ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE))) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_PERMISSIONS); } if ((!ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE))) { ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_PERMISSIONS); } } else { boolean_permission = true; } } @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == REQUEST_PERMISSIONS) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { boolean_permission = true; } else { Toast.makeText(getApplicationContext(), "Please allow the permission", Toast.LENGTH_LONG).show(); } } } } 

¡Gracias!

Es posible que pueda usar la memoria caché de dibujo de una vista, pero no estoy seguro si esto mantendrá toda la vista o solo lo que se representa en la pantalla.

Te aconsejaría que busques en StackOverflow para preguntas similares, lo más probable es que se haya preguntado antes.

prueba esto, funciona bien para mí

 TableLayout tabLayout = (TableLayout) findViewById(R.id.allview); if (tabLayout != null) { Bitmap image = Bitmap.createBitmap(tabLayout.getWidth(), tabLayout.getHeight(), Config.ARGB_8888); Canvas b = new Canvas(image); tabLayout.draw(b); } 

// set button click listener

  share = (Button)findViewById(R.id.share); share.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Bitmap bitmap = takeScreenshot(); saveBitmap(bitmap); } }); 

// entonces tienes que crear dos métodos

  public Bitmap takeScreenshot() { View rootView = findViewById(android.R.id.content).getRootView(); rootView.setDrawingCacheEnabled(true); return rootView.getDrawingCache(); } public void saveBitmap(Bitmap bitmap) { File imagePath = new File(Environment.getExternalStorageDirectory() + "/screenshot.png"); FileOutputStream fos; try { fos = new FileOutputStream(imagePath); bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos); fos.flush(); fos.close(); } catch (FileNotFoundException e) { Log.e("GREC", e.getMessage(), e); } catch (IOException e) { Log.e("GREC", e.getMessage(), e); } } 

Después de agregar este código en su aplicación, ejecutar la aplicación y verificar su almacenamiento local, ha creado una captura de pantalla de toda la página.

 public static Bitmap loadBitmapFromView(ScrollView v) { Bitmap b = Bitmap.createBitmap(v.getWidth() , v.getChildAt(0).getHeight(), Bitmap.Config.ARGB_8888); Canvas c = new Canvas(b); v.draw(c); return b; } 

He probado muchos códigos y cada vez uso NullPointerExeption . Descubrí que cuando nuestra vista no tiene una vista principal, el ancho y el alto proporcionados (Xml o Java) se ignoran y se MATCH_PARENT en MATCH_PARENT .

Finalmente, se me ocurrió esta solución:

 /** * Take screen shot of the View * * @param v the view * @param width_dp * @param height_dp * * @return screenshot of the view as bitmap */ public static Bitmap takeScreenShotOfView(View v, int width_dp, int height_dp) { v.setDrawingCacheEnabled(true); // this is the important code :) v.measure(View.MeasureSpec.makeMeasureSpec(dpToPx(v.getContext(), width_dp), View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(dpToPx(v.getContext(), height_dp), View.MeasureSpec.EXACTLY)); v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight()); v.buildDrawingCache(true); // creates immutable clone Bitmap b = Bitmap.createBitmap(v.getDrawingCache()); v.setDrawingCacheEnabled(false); // clear drawing cache return b; } public static int dpToPx(Context context, int dp) { Resources r = context.getResources(); return Math.round(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, r.getDisplayMetrics())); }