我试图通过膨胀布局来创建一个视图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>
答案 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)