gpt4 book ai didi

Android:来自超大 View 的位图

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:40:17 25 4
gpt4 key购买 nike

问题描述:
我已经测试了以下两种方法,以便从 View (例如,本例中的 RelativeLayout)创建位图快照。对于尺寸(例如宽度和高度)小于设备屏幕尺寸(例如 480x900)的 View ,这两种方法都非常有效。 View 的可见部分被捕获并写入位图中。不幸的是,位图在 View 的不可见部分是黑色的。

问题:
我怎样才能捕获 View 的不可见部分?

代码:

public class NewRelativeLayout extends RelativeLayout{

private Bitmap bmp;

public NewRelativeLayout(Context context){
super(context);
this.setLayoutParams(new RelativeLayout.LayoutParams(2000,2000));
// add here methods to configure the RelativeLayout or to add children
}

//This is the first method
public void makeSnapshot_Method1(){
this.setDrawingCacheEnabled(true);
bmp = Bitmap.createBitmap(this.getDrawingCache());
this.setDrawingCacheEnabled(false);
}

//This is the second method
public void makeSnapshot_Method2(){
bmp = Bitmap.createBitmap(2000, 2000, Bitmap.Config.ARGB_8888);
Canvas helpCanvas = new Canvas(bmp);
this.draw(helpCanvas);
}

最佳答案

我也在寻找这个问题的解决方案,最后,设法想出了我自己的解决方案,这实际上非常简单。

在我的例子中,我有一个 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;
}

关于Android:来自超大 View 的位图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9296782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com