我正在尋找解決方案,最終設法提出了我自己的解決方案,其實很簡單。
就我而言,我有一個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 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
保存爲位圖。我用下面的方法保存位圖。我很早就發現了這一點,但我似乎無法找到正確引用它的問題(無論你是誰 - 謝謝!)。
對於以下方法,我通過參考上面的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;
}
感謝創造者爲您的快速響應。 view.getDrawable()方法僅由Views支持,它像ImageView那樣「持有」一個前景圖片。像RelativeLayouts,LinearLayouts,TextViews等所有其他視圖不支持此方法。大多數互聯網論壇推薦方法1或2(見我的文章),以便從視圖製作位圖截圖(即背景和前景)。對於超大視圖,問題仍未解決。任何其他想法? – 2012-02-15 18:54:59
那麼,我已經提到,view.getDrawable()不支持在帖子本身的每個視圖。 這兩種方法給出了完整的圖像,包括屏幕外部分,可以嘗試使用畫布和自定義視圖將這兩個單獨的圖像放在一個視圖中(如果forground一個是透明背景png圖像),並獲取雖然我從來沒有嘗試過,所以不能說出這將如何工作,但如果你能遵循,你可能會實現你所需要的。 – noob 2012-02-15 19:15:46
getDrawingCache()方法旨在僅給出屏幕上的圖像,所以我不認爲這適用於您。使用getDrawingCache(true)可能適合你。 另一個想法可能是使用LayoutParams調整視圖以適合屏幕,然後從那裏獲取繪圖緩存。 – noob 2012-02-15 19:19:46