Сделайте снимок экрана целиком

Я построил таблицу, которая в основном выполняется HorizontalScrollView внутри ScrollView . Я заставил пользователя редактировать поля.

Теперь я хочу сохранить таблицу на экране, jpg, png, pdf или что-то еще.

Проблема в том, что таблица почти всегда больше экрана.

Есть ли способ сделать снимок экрана всего макета ScrollView ? Если не так, как вы думаете, может сделать эту работу?

Solutions Collecting From Web of "Сделайте снимок экрана целиком"

На самом деле я нашел ответ:

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

Невозможно сделать снимок экрана с не-показуемым контентом (например, внеэкранные части ScrollView). Тем не менее, вы можете сделать несколько скриншотов, прокручивать содержимое между каждым снимком, а затем присоединяться к изображениям. Вот инструмент, который может автоматизировать это для вас: https://github.com/PGSSoft/scrollscreenshot

иллюстрация

Отказ от ответственности: я автор этого инструмента, он был опубликован моим работодателем . Запросы функций приветствуются.

Использование ответа @softwaresupply вызывает проблему в моем случае, когда мое представление перерисовывается и становится полностью белым. Существует более простое решение для получения снимков экрана, где вам даже не нужно указывать ширину и высоту в качестве параметров. Используйте кэш чертежа .

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

Вы можете передать представление новому экземпляру холста, построенного на объекте Bitmap.

Попробуйте

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

Это действительно помогло мне.

Эта работа для меня, надеюсь, это тоже полезно для вас.

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

Возможно, вы сможете использовать кеш чертежа для представления, но я не уверен, будет ли это удерживать весь вид или только то, что отображается на экране.

Я бы посоветовал вам охотиться вокруг StackOverflow для подобных вопросов, это более чем вероятно было спрошено раньше.

Попробуй, это его работы отлично для меня

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

// установить кнопку нажатия кнопки

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

// тогда вам нужно создать два метода

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

После добавления этого кода в приложение, запустите приложение и проверьте локальное хранилище, вы создали снимок экрана всей страницы.

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

Загрузите исходный код отсюда ( сделайте программный снимок экрана scrollview в android )

activity_main.xml

 <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="#efefef" xmlns:android="http://schemas.android.com/apk/res/android"> <Button android:layout_width="match_parent" android:layout_margin="10dp" android:layout_height="50dp" android:id="@+id/btn_screenshot" android:text="Take ScreenShot"/> <ScrollView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/scrollView" android:layout_marginBottom="10dp" android:background="#ffffff"> <LinearLayout android:layout_width="match_parent" android:layout_marginLeft="10dp" android:id="@+id/ll_linear" android:layout_marginRight="10dp" android:orientation="vertical" android:layout_height="match_parent"> <ImageView android:layout_width="match_parent" android:layout_marginTop="10dp" android:scaleType="fitXY" android:layout_height="200dp" android:layout_gravity="center" android:src="@drawable/image2"/> <ImageView android:layout_width="match_parent" android:layout_marginTop="10dp" android:scaleType="fitXY" android:layout_height="200dp" android:layout_gravity="center" android:src="@drawable/image3"/> <ImageView android:layout_width="match_parent" android:layout_marginTop="10dp" android:scaleType="fitXY" android:layout_height="200dp" android:layout_gravity="center" android:src="@drawable/image5"/> <ImageView android:layout_width="match_parent" android:layout_marginTop="10dp" android:scaleType="fitXY" android:layout_height="200dp" android:layout_gravity="center" android:src="@drawable/image6"/> </LinearLayout> </ScrollView> </LinearLayout> 

MainActivity.xml

 package deepshikha.com.screenshot; import android.Manifest; import android.app.ProgressDialog; import android.content.Intent; import android.content.pm.PackageManager; import android.graphics.Bitmap; import android.graphics.Canvas; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.LinearLayout; import android.widget.ProgressBar; 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 = (Button) findViewById(R.id.btn_screenshot); scrollView = (ScrollView)findViewById(R.id.scrollView); ll_linear = (LinearLayout) 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 (FileNotFoundException e) { Log.e("GREC", e.getMessage(), e); } 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, android.Manifest.permission.READ_EXTERNAL_STORAGE))) { } else { ActivityCompat.requestPermissions(MainActivity.this, new String[]{android.Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_PERMISSIONS); } if ((ActivityCompat.shouldShowRequestPermissionRationale(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE))) { } else { 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(); } } } } 

Благодаря!