主要的思路是,先将layout转成view,再将view转成bitmap。
首先写一个简单的xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="200dp"
android:layout_height="100dp"
android:orientation="vertical"
android:layout_gravity="center"
android:gravity="center"
android:background="@android:color/darker_gray"
tools:context="com.example.shishuqi.hello.ConvertActivity">
<ImageView
android:id="@+id/starView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
app:srcCompat="@android:drawable/star_big_on" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center"
android:text="stars" />
<ImageView
android:id="@+id/starView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
app:srcCompat="@android:drawable/star_big_on" />
</LinearLayout>
接下来在activity的oncreate方法中将layout转成view 来显示:
View view = getLayoutInflater().inflate(R.layout.activity_convert, null);
setContentView(view);
这样写会有一个问题,就是layout的layout_width、layout_height属性会失效,因为我们指定了父布局为Null,因此需要写一个根布局,修改以上代码如下:
LinearLayout rootView = new LinearLayout(this);
View view = getLayoutInflater().inflate(R.layout.activity_convert, rootView);
setContentView(view);
不过,这样写layout依然无法在水平居中,在实际应用中,可以写个固定的view显示,不在setContentViewz中写就可以。
得到view以后,将其转成Bitmap就可以啦,具体方法如下:
private Bitmap getViewBitmap(View view) {
view.setDrawingCacheEnabled(true);
view.measure(
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
view.layout(0, 0,
view.getMeasuredWidth(),
view.getMeasuredHeight());
view.buildDrawingCache();
Bitmap cacheBitmap = view.getDrawingCache();
return Bitmap.createBitmap(cacheBitmap);
}