2013-05-16 41 views
2

我们遇到了从特定视图生成位图的问题。限制是它不能渲染视图(绘图)。有没有人有任何提示如何解决这个问题?Android:在不绘制的情况下生成视图的位图

类视图文档(http://developer.android.com/reference/android/view/View.html)对Android使用的渲染视图的步骤有一些解释。在这种情况下,我们会在步骤“布局”中进行,而不是在“绘图”中。任何有想法的人都可以举个例子吗?

我的代码生成异常: 错误 - >宽度和高度必须> 0

... 
public static Bitmap loadBitmapFromView(View v) { 
    Bitmap b = null; 
    try { 
     b = Bitmap.createBitmap(
       v.getWidth(), 
       v.getHeight(), 
       Bitmap.Config.ARGB_8888);     
     Canvas c = new Canvas(b); 
     v.measure(v.getWidth(), v.getHeight()); 
     v.layout(0, 0, v.getWidth(), v.getHeight()); 
     v.draw(c); 

    } catch (Exception e) { 

     Log.e(MainActivity.TAG, "error -> "+e.getMessage()); 
    } 



    return b; 
} 


public void snap(View v) { 


    LayoutInflater inflate = (LayoutInflater) getBaseContext() 
      .getSystemService(LAYOUT_INFLATER_SERVICE); 
    View view = new View(getBaseContext()); 
    view = inflate.inflate(R.layout.list_item, null); 


    Log.d(MainActivity.TAG, "getWidth -> "+view.getWidth()); 
    Log.d(MainActivity.TAG, "getHeight -> "+view.getHeight()); 

    Bitmap b = loadBitmapFromView(view); 
    if (b != null) { 

     LinearLayout mainLayout = (LinearLayout) findViewById(R.id.LinearLayout1); 
     ImageView image = new ImageView(this); 
     image.setImageBitmap(b); 

     mainLayout.addView(image); 
    } 


} 
+0

我真的不明白你想要达到的目标。但在'onMeasure'步骤之前,视图不会有大小。所以,只是膨胀视图不会伎俩。 –

+0

您可以从视图中生成位图而不绘制它?我想生成一个图像(位图)到一个未在屏幕上绘制的视图。这个想法是生成多个位图图像并仅在需要时显示。 –

回答

8

我找到了解决办法是这样的:

public static Bitmap getScreenViewBitmap(final View v) { 
    v.setDrawingCacheEnabled(true); 

    v.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), 
      MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); 
    v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight()); 

    v.buildDrawingCache(true); 
    Bitmap b = Bitmap.createBitmap(v.getDrawingCache()); 
    v.setDrawingCacheEnabled(false); // clear drawing cache 

    return b; 
} 
1

你立即试图让通胀后视图的宽度和高度,但没有按查看在布置完成之后才有大小。您可以自己确定一个尺寸(请致电measure(),无论MeasureSpec是否合适),或者将其作为布局的一部分,设置为不可见,并且只在布局完成后尝试从视图中加载位图。

+0

嗨kcoppock,你的建议就像这样的讨论:http://stackoverflow.com/questions/4393612/when-can-i-first-measure-a-view? –

+1

对,你可以添加一个onGlobalLayout监听器,但是这个视图必须是布局的一部分。你的步骤应该工作,问题是你不能依赖getWidth()和getHeight()在当前时间。如果你在那里硬编码值,它应该可以工作。在这种情况下,您需要硬编码值,或者自己测量视图以获取适当的尺寸。 – kcoppock

相关问题