Я тоже искал решение для этого и, в конце концов, сумел придумать свое собственное решение, которое на самом деле довольно просто.
В моем случае у меня был LinearLayout
, который содержалнесколько элементов View
, некоторые из которых иногда не отображались на экране, вертикально ниже границ экрана.Мне удалось сохранить View
как растровое изображение (см. loadBitmapFromView()
ниже), но возникли проблемы, когда он вышел за пределы нижней части экрана.
Мое решение состояло в том, чтобы сделать LinearLayout
составной ScrollView
составной.
например
Это:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/my_linear_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<!-- Some Views added here at runtime -->
</LinearLayout>
Стал:
Обратите внимание на использование wrap_content
, чтобы ScrollView масштабировался до высоты вашего контента.
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/scroll"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
>
<LinearLayout
android:id="@+id/my_linear_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
<!-- Some Views added here at runtime -->
</LinearLayout>
</ScrollView>
Это, казалось, гарантировало, что за кадромэлементы могли быть размещены вручную, когда я хотел сохранить View
как растровое изображение.Я использовал следующий метод для сохранения растрового изображения.Я нашел это намного раньше на SO, но я не могу найти вопрос для того, чтобы ссылаться на него должным образом (кем бы вы ни были - спасибо!).
Для следующего метода я передаю ссылку наLinearLayout
выше (my_linear_layout
).
public static Bitmap loadBitmapFromView(View view) {
Bitmap bitmap = null;
// width measure spec
int widthSpec = View.MeasureSpec.makeMeasureSpec(
view.getMeasuredWidth(), View.MeasureSpec.AT_MOST);
// height measure spec
int heightSpec = View.MeasureSpec.makeMeasureSpec(
view.getMeasuredHeight(), View.MeasureSpec.AT_MOST);
// measure the view
view.measure(widthSpec, heightSpec);
// set the layout sizes
int left = view.getLeft();
int top = view.getTop();
int width = view.getMeasuredWidth();
int height = view.getMeasuredHeight();
int scrollX = view.getScrollX();
int scrollY = view.getScrollY();
view.layout(left, top, width + left, height + top);
// create the bitmap
bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),
Bitmap.Config.ARGB_8888);
// create a canvas used to get the view's image and draw it on the
// bitmap
Canvas c = new Canvas(bitmap);
// position the image inside the canvas
c.translate(-view.getScrollX(), -view.getScrollY());
// get the canvas
view.draw(c);
return bitmap;
}