Tôi cũng đang tìm kiếm giải pháp cho điều này và cuối cùng, tôi đã tìm ra giải pháp của riêng mình thực sự khá đơn giản.
Trong trường hợp của tôi, tôi có một số LinearLayout
có chứa một số yếu tố View
, một số trong đó đôi khi không có trên màn hình, theo chiều dọc bên dưới phần cuối của giới hạn màn hình. Tôi đã có thể lưu View
dưới dạng bitmap (xem loadBitmapFromView()
, bên dưới) nhưng gặp sự cố khi mở rộng ra phía dưới màn hình.
Giải pháp của tôi là làm cho phần LinearLayout
của tổng hợp ScrollView
.
ví dụ:
này:
<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>
Trở thành:
Lưu ý sử dụng wrap_content
để đảm bảo scrollview quy mô với chiều cao nội dung của bạn.
<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>
Điều này dường như đảm bảo rằng các mục có thể được tắt thủ công khi tôi muốn lưu View
làm bitmap. Tôi đã sử dụng phương pháp sau để lưu bitmap. Tôi tìm thấy điều này sớm hơn nhiều về SO nhưng tôi dường như không thể tìm thấy câu hỏi để tham khảo nó đúng cách (bất cứ ai bạn - cảm ơn bạn!).
Đối với phương pháp sau, tôi chuyển một tham chiếu đến LinearLayout
ở trên (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;
}
Cảm ơn người tạo vì phản hồi nhanh của bạn. Phương thức view.getDrawable() chỉ được hỗ trợ bởi Views, trong đó "giữ" một hình ảnh nền trước bên trong như ImageView chẳng hạn. Tất cả các Chế độ xem khác như RelativeLayouts, LinearLayouts, TextViews, v.v. không hỗ trợ phương thức này. Hầu hết các diễn đàn internet đều đề xuất phương pháp 1 hoặc 2 (xem bài đăng của tôi) để tạo ảnh chụp màn hình bitmap (tức là nền cộng với nền trước) từ Chế độ xem. Vấn đề vẫn chưa được giải quyết cho các lượt xem quá khổ. Bất kỳ ý tưởng nào khác? –
Vâng, tôi đã đề cập rằng view.getDrawable() không được hỗ trợ bởi mọi chế độ xem trong bài đăng. Hai phương pháp này cung cấp hình ảnh hoàn chỉnh, bao gồm các phần ngoài màn hình, bạn có thể thử đặt hai hình ảnh riêng biệt đó trong một chế độ xem (nếu hình nền là hình nền png trong suốt) bằng canvas và chế độ xem tùy chỉnh và lấy có thể rút ra từ đó, mặc dù tôi chưa bao giờ thử điều đó, vì vậy không thể biết cách làm việc này, nhưng nếu bạn có thể làm theo đó bạn có thể đạt được những gì bạn cần. – noob
Phương thức getDrawingCache() chỉ nhằm cung cấp cho hình ảnh trên màn hình, vì vậy tôi không nghĩ rằng nó sẽ làm việc cho bạn. Sử dụng getDrawingCache (true) có thể làm việc cho bạn. Một ý tưởng khác có thể là thay đổi kích thước chế độ xem bằng cách sử dụng LayoutParams để vừa với màn hình và sau đó lấy bộ nhớ cache bản vẽ từ đó. – noob