Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Tomando una "captura de pantalla" de un diseño específico en Android

Tengo dos cuestiones principales que están estrechamente vinculadas. Estoy examinando estos problemas desde un punto de vista programático.

(1) – Deseo tomar una captura de pantalla del contenido de una disposición ESPECÍFICA, es decir un ScrollView anidado en un LinearLayout .

(2) – Como el ScrollView tiene contenido que se derrama fuera de la pantalla (de ahí el desplazamiento posible), ¿cómo puedo asegurar que la captura de pantalla incluye los elementos que no son visibles en la pantalla?

Este es el bloque actual de código que uso. Hace el trabajo de tomar una captura de pantalla, pero sólo para toda la pantalla. Esto es aunque R.id.boss es el ID del ScrollView y no el LinearLayout principal.

 View view = findViewById(R.id.boss); View v = view.getRootView();// this does not seem to make a difference v.setDrawingCacheEnabled(true); v.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight()); v.buildDrawingCache(true); Bitmap b = Bitmap.createBitmap(u.getDrawingCache()); v.setDrawingCacheEnabled(false); 

Gracias por adelantado.

EDITAR:

He cometido algunos errores. Utilicé R.id.boss que es el recurso incorrecto. Ahora soy capaz de tomar una captura de pantalla del scrollview solo, menos las partes fuera de pantalla.

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/boss" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_gravity="top" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="F" android:textAppearance="?android:attr/textAppearanceMedium" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Analyze via image URL" android:textAppearance="?android:attr/textAppearanceSmall" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" > <EditText android:id="@+id/mUrl" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.7" android:text="http://" > <requestFocus /> </EditText> <ImageView android:id="@+id/call" android:layout_width="75dp" android:layout_height="50dp" android:layout_weight="0.3" android:text="ABC" android:src="@drawable/run" /> </LinearLayout> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="ABC" android:textAppearance="?android:attr/textAppearanceSmall" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" > <EditText android:id="@+id/filepath" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="0.55" /> <ImageView android:id="@+id/cam" android:layout_width="75dp" android:layout_height="50dp" android:layout_weight="0.15" android:src="@drawable/cam" /> <ImageView android:id="@+id/browse" android:layout_width="75dp" android:layout_height="50dp" android:layout_weight="0.15" android:src="@drawable/folder" android:text="B" /> <ImageView android:id="@+id/upload" android:layout_width="75dp" android:layout_height="50dp" android:layout_weight="0.15" android:src="@drawable/run" android:text="A" /> </LinearLayout> <LinearLayout android:id="@+id/baba" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="vertical" > <ScrollView android:id="@+id/scroll" android:layout_width="fill_parent" android:layout_height="150dp" android:layout_weight="0.7" > <LinearLayout android:layout_width="fill_parent" android:layout_height="186dp" android:orientation="vertical" > <ImageView android:id="@+id/pic" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Facial recognition" android:textAppearance="?android:attr/textAppearanceMedium" /> <TextView android:id="@+id/text3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Small Text" android:textAppearance="?android:attr/textAppearanceSmall" /> <TextView android:id="@+id/avmarwe" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Gender and age" android:textAppearance="?android:attr/textAppearanceMedium" /> <TextView android:id="@+id/text1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Small Text" android:textAppearance="?android:attr/textAppearanceSmall" /> <TextView android:id="@+id/skahasd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Expression and mood" android:textAppearance="?android:attr/textAppearanceMedium" /> <TextView android:id="@+id/text2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Small Text" android:textAppearance="?android:attr/textAppearanceSmall" /> <TextView android:id="@+id/dsfsfs" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Celebrity Facial Match" android:textAppearance="?android:attr/textAppearanceMedium" /> <TextView android:id="@+id/text4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_weight="1" android:text="Small Text" android:textAppearance="?android:attr/textAppearanceSmall" /> </LinearLayout> </ScrollView> </LinearLayout> <LinearLayout android:id="@+id/linearLayout1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" > <Button android:id="@+id/c" android:layout_width="fill_parent" android:layout_height="50dp" android:layout_weight="0.7" android:text="" /> <Button android:id="@+id/share" android:layout_width="70dp" android:layout_height="50dp" android:layout_weight="0.3" android:text="" /> </LinearLayout> </LinearLayout> 

6 Solutions collect form web for “Tomando una "captura de pantalla" de un diseño específico en Android”

Gracias a ustedes, finalmente he descubierto lo que estaba mal.

View v = view.getRootView(); No se debe utilizar porque llamará a la vista de raíz que no quiero. Pensé erróneamente que esto no hizo ninguna diferencia porque había entrado el identificador incorrecto del recurso.

MeasureSpec alguna manera no dio una buena cuenta de la anchura y la altura. Así que terminé usando otro método:

 ... ScrollView z = (ScrollView) findViewById(R.id.scroll); int totalHeight = z.getChildAt(0).getHeight(); int totalWidth = z.getChildAt(0).getWidth(); u.layout(0, 0, totalWidth, totalHeight); ... 

Como la altura total de ScrollView puede ser determinada por el único elemento secundario que tiene.

Después de realizar estos cambios, ahora puedo tomar una captura de pantalla de un ScrollView anidado y todo su contenido, visible o no. Para cualquier persona interesada, aquí está el bloque de código incluyendo el ahorro del mapa de bits:

  View u = findViewById(R.id.scroll); u.setDrawingCacheEnabled(true); ScrollView z = (ScrollView) findViewById(R.id.scroll); int totalHeight = z.getChildAt(0).getHeight(); int totalWidth = z.getChildAt(0).getWidth(); u.layout(0, 0, totalWidth, totalHeight); u.buildDrawingCache(true); Bitmap b = Bitmap.createBitmap(u.getDrawingCache()); u.setDrawingCacheEnabled(false); //Save bitmap String extr = Environment.getExternalStorageDirectory().toString() + File.separator + "Folder"; String fileName = new SimpleDateFormat("yyyyMMddhhmm'_report.jpg'").format(new Date()); File myPath = new File(extr, fileName); FileOutputStream fos = null; try { fos = new FileOutputStream(myPath); b.compress(Bitmap.CompressFormat.JPEG, 100, fos); fos.flush(); fos.close(); MediaStore.Images.Media.insertImage(getContentResolver(), b, "Screen", "screen"); }catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } 

EDIT: después de ver el comentario del OP

Usted no necesita pensar en nuevas actividades en absoluto .. Diga que usted está en actividad ahora mismo. El diseño A es la disposición principal para la actividad, la disposición B y C son dos disposiciones del niño dentro de la disposición A. Como esto,

  Layout A -> Parent | -------Layout B | -------Layout C 

Ahora si usted desea tomar la captura de pantalla de C solamente

1) in onCreate () de la actividad

  LinearLayout myCLayout = (LinearLayout)this.findViewbyId(R.id.my_c_layout); ViewTreeObserver vto = myCLayout.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { //fully drawn, no need of listener anymore myCLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this); getDrawingBitmap(); } }); 

Donde getDrawingBitmap () es una función .. para tomar su captura de pantalla ..

 public void getDrawingBitmap(){ LinearLayout myCLayout = (LinearLayout)this.findViewbyId(R.id.my_c_layout); Bitmap b = myCLayout.getDrawingCache(); File file = saveBitmapAsFile(b); } 

EDIT: Para ScrollView

Nunca lo intenté .. Pero creo que puedes hacer esto ..

1) primer override scrollView, y sobreescribir la función onMeasure.

 public class MyScrollView extends ScrollView{ public MyScrollView(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){ super.onMeasure(widthMeasureSpec, yourFullScrollViewHeight)); } } 

Y utilizar MyScrollView en su diseño .. aquí yourFullScrollViewHeight es la altura de todo el contenido scrollView que necesita para tomar una captura de pantalla .. Nunca he intentado esto .. Pero podría funcionar ..

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

Aquí está la solución exacta que desea, se mostrará toda la pantalla incluyendo el contenido oculto en su ScrollView

 LayoutInflater inflater = (LayoutInflater) this.getSystemService(LAYOUT_INFLATER_SERVICE); FrameLayout root = (FrameLayout) inflater.inflate(R.layout.activity_main, null); // activity_main is UI(xml) file we used in our Activity class. FrameLayout is root view of my UI(xml) file. root.setDrawingCacheEnabled(true); Bitmap bitmap = getBitmapFromView(this.getWindow().findViewById(R.id.frameLayout)); // here give id of our root layout (here its my FrameLayout's id) 

Muestre el bitmap de bitmap en su ImageView o utilícelo como desee.
Disfrutar..

También tuve este problema y lo codifiqué yo mismo.

He utilizado este código para tomar una captura de pantalla de todo el diseño.

Hice modificar el tamaño de la lista y algunos elementos matemáticos.

Consulte el siguiente sitio web ,

Prueba este código

Public Bitmap screenShot (Vista de vista) {

  Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); view.draw(canvas); return bitmap; } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.