Intereting Posts
Изменить клавиатуру Android по умолчанию с использованием кода ADB или Java Fragment saveInstanceState приходит как null после изменения ориентации Как получить плотность экрана? Проблема создания виртуального устройства Android (AVD) на Ubuntu 16.04 Как использовать Single TextWatcher для нескольких EditTexts? Возможно ли получить количество загрузок приложения из Google Play? Как использовать writeStringArray () и readStringArray () в посылке Устройство «unknown-sdk» при выполнении тестов в Jenkins Показать пункт меню всегда в панели действий поддержки Получение и обработка словаря <string, List <string >> из мыла с использованием KSoap2 Грейд-зависимости: скомпилировать проект по относительному пути Лучший способ получить бесплатную версию Android-приложения Как получить доступ к API телефонных разговоров с удаленной страницы Почему CursorLoader onLoaderReset () вызывается после вращения устройства? RecyclerView: изменение размера анимированного объекта

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

Я построил таблицу, которая в основном выполняется 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(); } } } } 

Благодаря!