创建视图的位图

时间:2012-01-11 11:29:11

标签: android view bitmap

我试图通过膨胀布局来创建一个视图programaticaly。

View marker = ((LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(R.layout.overlay_view, null);

现在我想将此视图转换为位图:

public static Bitmap createDrawableFromView(Context context, View view){
        DisplayMetrics displayMetrics = new DisplayMetrics();
        ((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);

        view.measure(displayMetrics.widthPixels, displayMetrics.heightPixels);
        view.layout(0, 0, displayMetrics.widthPixels, displayMetrics.heightPixels);

        Bitmap cache = Bitmap.createBitmap(view.getMeasuredWidth(), view.getMeasuredHeight(), Bitmap.Config.ARGB_8888);

        Canvas canvas = new Canvas(cache);
        view.draw(canvas);

        return cache;
    }

我还尝试了测量(1,1)和布局(0,0,0,0)而没有任何改变。 位图看起来像填充的布局。 现在问题:如果我在视图中添加一些内容使得视图比宽度或高度中的显示更大(例如:带有长文本的TextView),则位图也更大。 Views XML的宽度和高度是WRAP_CONTENT,但它没有用。 我从来没有把这个View放在某处显示它(因为我只需要Bitmap)。

问题:如何将视图WRAP到最大宽度= displayWidth?

我尝试了view.setLayoutParams(新的LayoutParam(100,100)),但它还大于100?!我真的不明白发生了什么,当我给布局充气并设置视图的内容时。

我的显示器中view.getMeasuredWidth和Height总是更大?! (如果我把更大的东西放在里面)

以下是布局示例:

<RelativeLayout android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/somedrawable"
        android:padding="10dp"
        android:clickable="true">
        <TextView android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Name"/>
        <TextView android:id="@+id/description"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/name"
            android:text="Description"
            android:textSize="20dp"
            android:textColor="#ffffff"/>
    </RelativeLayout>

1 个答案:

答案 0 :(得分:0)

我找到了解决方案:

第一步:将新的LayoutParams添加到视图中。这很重要,因为没有你会得到一个NullPointer。

view.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

第二

view.measure(MeasureSpec.makeMeasureSpec(displayMetrics.widthPixels), MeasureSpec.AT_MOST),
             MeasureSpec.makeMeasureSpec(displayMetrics.heightPixels, MeasureSpec.AT_MOST));

view.measure()我使用了MeasureSpec.makeMeasureSpec(displayMetrics.heightPixels, MeasureSpec.AT_MOST));。第一个参数是显示宽度或高度,第二个参数是AT_MOST模式,这需要“包装”视图。

效果很好! (对我来说:p)