2012-02-15 45 views
6

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

问题:
如何捕获视图的不可见部分?

CODE:

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); 
    } 

}

回答

0

取决于你想捕捉,从视图中的背景或前景图像的映像。无论哪种方式,你必须从它们中获取Drawable对象,将它们转换为BitmapDrawable并从它们获取Bitmap。 代码: -

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(); 

我希望这会对你有用。

+0

感谢创造者为您的快速响应。 view.getDrawable()方法仅由Views支持,它像ImageView那样“持有”一个前景图片。像RelativeLayouts,LinearLayouts,TextViews等所有其他视图不支持此方法。大多数互联网论坛推荐方法1或2(见我的文章),以便从视图制作位图截图(即背景和前景)。对于超大视图,问题仍未解决。任何其他想法? – 2012-02-15 18:54:59

+0

那么,我已经提到,view.getDrawable()不支持在帖子本身的每个视图。 这两种方法给出了完整的图像,包括屏幕外部分,可以尝试使用画布和自定义视图将这两个单独的图像放在一个视图中(如果forground一个是透明背景png图像),并获取虽然我从来没有尝试过,所以不能说出这将如何工作,但如果你能遵循,你可能会实现你所需要的。 – noob 2012-02-15 19:15:46

+0

getDrawingCache()方法旨在仅给出屏幕上的图像,所以我不认为这适用于您。使用getDrawingCache(true)可能适合你。 另一个想法可能是使用LayoutParams调整视图以适合屏幕,然后从那里获取绘图缓存。 – noob 2012-02-15 19:19:46

0

我也想弄清楚一个ListView,获取所有不在屏幕上的行。

我发现很多东西我想与大家分享:

这里有人问,如果一个位图可以从不是绘制的视图中创建: Bitmap from View not displayed on Android

在这里,他们声称这是一个重复的,它的也回答正确(?)它包含一个URL,其中包含一些旧的编码,并且不会编译。此外可能重复的问题并没有帮助我。 Android get full View as Bitmap

我想我会设法把事情通过此方法进行: List View using bitmap 已经想出了同样的想法,现在我还是要探索如何。

希望你能使用一些这方面的信息。

1

我正在寻找解决方案,最终设法提出了我自己的解决方案,其实很简单。

就我而言,我有一个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保存为位图。我用下面的方法保存位图。我很早就发现了这一点,但我似乎无法找到正确引用它的问题(无论你是谁 - 谢谢!)。

对于以下方法,我通过参考上面的LinearLayoutmy_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; 
}