Android:超大视图中的位图

Android:超大视图中的位图,android,view,bitmap,Android,View,Bitmap,问题描述: 为了从视图创建位图快照,我测试了以下两种方法(例如,在本例中为RelativeLayout)。对于尺寸(例如宽度和高度)小于设备屏幕尺寸(例如480x900)的视图,这两种方法都非常有效。视图的可见部分被捕获并写入位图。不幸的是,位图在视图的不可见部分是黑色的 问题: 我怎样才能捕捉到视图中看不见的部分 代码: }取决于要捕获的图像,即来自视图背景或前景的图像。无论哪种方式,您都必须从它们获取可绘制对象,将它们强制转换为BitmapDrawable,然后从它们的对象获取位图。 代码:

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

问题:
我怎样才能捕捉到视图中看不见的部分

代码:


}

取决于要捕获的图像,即来自视图背景或前景的图像。无论哪种方式,您都必须从它们获取可绘制对象,将它们强制转换为BitmapDrawable,然后从它们的对象获取位图。 代码:-


我希望这对您有用。

我也在尝试为ListView解决这个问题,以获取所有不在屏幕上的行

我发现了很多我想分享的东西:

这里有人询问是否可以从未绘制的视图创建位图:

在这里,他们声称这是一个重复,并且回答正确(?)它包含一个URL,带有一些旧的编码,无法编译。另外,可能重复的问题对我也没有帮助。

我想我会尝试通过以下方法完成: 我已经想到了同样的想法,现在我还得去发现怎么做


希望您能使用这些信息。

我也在寻找解决方案,最后终于找到了自己的解决方案,其实很简单

在我的例子中,我有一个
线性布局
,其中包含许多
视图
元素,其中一些元素有时不在屏幕上,垂直位于屏幕边界的末端下方。我能够将
视图
保存为位图(请参见下面的
loadBitmapFromView()
),但当它扩展到屏幕底部之外时遇到了问题

我的解决方案是将
线性布局
作为
滚动视图
组合的一部分

e、 g

这个:

<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>
这似乎确保了当我想将
视图
保存为位图时,可以手动布置屏幕外的项目。我使用以下方法保存位图。我早就发现了这一点,但我似乎找不到问题来正确地引用它(无论你是谁,谢谢!)

对于以下方法,我将引用传递到上面的
LinearLayout
my\u linear\u layout


感谢造物主的快速响应。只有视图支持view.getDrawable()方法,这些视图在内部“保存”前景图片,例如ImageView。所有其他视图(如RelativeLayouts、LinearLayouts、TextView等)都不支持此方法。大多数互联网论坛建议使用方法1或2(参见我的帖子)从视图中创建位图屏幕截图(即背景加前景)。对于超大视图,这个问题仍然没有解决。还有其他想法吗?嗯,我已经提到了视图。并非文章中的每个视图都支持getDrawable()。这两种方法给出了完整的图像,包括屏幕外的部分,可能你可以尝试使用画布和自定义视图将这两个单独的图像放在一个视图中(如果前面的图像是透明的背景png图像),并从中获得可绘制的图像,尽管我从未尝试过,所以无法判断这将如何工作,但是如果你能做到这一点,你可能会达到你所需要的。getDrawingCache()方法的目的是只提供屏幕上的图像,所以我认为这不适合你。使用getDrawingCache(true)可能适合您。另一种方法是使用LayoutParams调整视图大小以适应屏幕,然后从中获取图形缓存。
BitmapDrawable bd=(BitmapDrawable) view.getBackground(); //if you need background image
BitmapDrawable bd=(BitmapDrawable) view.getDrawable(); //if you need foreground image (Only available to some views who have an android:src xml property)
Bitmap bm=bd.getBitmap();
<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>
<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>
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;
}