Android:在 canvas 上绘制 xml 布局

Android: draw xml Layout on canvas

我有自定义PrintDocumentAdapter,自己画页面,所以我应该在页面上画xml布局canvas:

private void drawPage(PdfDocument.Page page, List<Object> objects,
                          int pageNumber) {
   Canvas canvas = page.getCanvas();
   ...
}

我的xml里有一个TableLayout。我希望 table 宽度填满整个页面,但如果宽度大于页面宽度,则它会超过页面;如果宽度小于页面宽度,则它会小于页面。我同时使用了 wrap_contentmatch_parent,但其中 none 有效。我什至尝试修复宽度和高度。

private void drawPage(PdfDocument.Page page, List<Payment> payments,
                          int pageNumber) {
        Canvas canvas = page.getCanvas();
        PdfDocument.PageInfo pageInfo = page.getInfo();

        canvas.save();
        canvas.translate(leftMargin , topMargin);

        FrameLayout frameLayout = new FrameLayout(context);
        frameLayout.setLayoutParams(new ViewGroup.LayoutParams(200, 200));
        LayoutInflater li = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View v = li.inflate(R.layout.payments_table_layout, null);
        v.setLayoutParams(new   
FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

        TableLayout tableLayout = (TableLayout) v.findViewById(R.id.payments_table_layout);

        for(int i= 0 ; i< objects.size(); ++i){
//... some code
        }

        frameLayout.addView(v);
        frameLayout.measure(200 , 200);
        frameLayout.layout(100, 100, 100, 100);
        frameLayout.draw(canvas);
        canvas.restore();
    } 

R.layout.payments_table_layout:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center">
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="50dp">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="some text"
            style="@style/CustomFont.Wave"/>
    </FrameLayout>
    <TableLayout
        android:id="@+id/payments_table_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center_horizontal"
        android:stretchColumns="*"
        android:layout_weight="1">
        <TableRow
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:background="#ccc">
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="some text"
                android:layout_gravity="center"
                android:background="@drawable/table_border"
                android:padding="4dp"
                />
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="some text"
                android:layout_gravity="center"
                android:background="@drawable/table_border"
                android:padding="4dp"/>
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="some text"
                android:layout_gravity="center"
                android:background="@drawable/table_border"
                android:padding="4dp"/>
            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="some text"
                android:layout_gravity="center"
                android:background="@drawable/table_border"
                android:padding="4dp"/>
        </TableRow>
    </TableLayout>
</LinearLayout>

现在结果:

请尝试以下 xml ,其中我在 TableRow 及其子文本视图中使用了权重和布局权重

android:weightSum="4"

android:layout_width="0dp"
android:layout_weight="1"
<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center">
        <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="50dp">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:text="some text"
               />
        </FrameLayout>
        <TableLayout
            android:id="@+id/payments_table_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="center_horizontal"
            android:stretchColumns="*"
            android:layout_weight="1">
            <TableRow
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:weightSum="4"
                android:layout_gravity="center_horizontal"
                android:background="#ccc">
                <TextView
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="wrap_content"
                    android:text="some text"
                    android:layout_gravity="center"
                    android:background="@color/colorAccent"
                    android:padding="4dp"
                    />
                <TextView
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="wrap_content"
                    android:text="some text"
                    android:layout_gravity="center"
                    android:background="@color/colorAccent"
                    android:padding="4dp"/>
                <TextView
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="wrap_content"
                    android:text="some text"
                    android:layout_gravity="center"
                    android:background="@color/colorAccent"
                    android:padding="4dp"/>
                <TextView
                    android:layout_width="0dp"
                    android:layout_weight="1"
                    android:layout_height="wrap_content"
                    android:text="some text"
                    android:layout_gravity="center"
                    android:background="@color/colorAccent"
                    android:padding="4dp"/>
            </TableRow>
        </TableLayout>
    </LinearLayout>

我不应该拉伸 TableLayout 的所有列,所以我将此属性更改为:

android:stretchColumns="1,3,7"  
android:shrinkColumns="5"

并像这样将布局宽度设置为页面宽度(我们应该注意尺寸单位):在我的 customPrintDocumentAdapter

@Override
    public void onLayout(PrintAttributes oldAttributes, PrintAttributes newAttributes, CancellationSignal cancellationSignal, LayoutResultCallback callback, Bundle extras) {
        myPdfDocument = new PrintedPdfDocument(context, newAttributes);

        pageHeight =
                newAttributes.getMediaSize().getHeightMils()/1000 * 72;
        pageWidth =
                newAttributes.getMediaSize().getWidthMils()/1000 * 72;

        ...
    }

和我的新 drawPage 方法:

private void drawPage(PdfDocument.Page page, List<Payment> payments,
                          int pageNumber) {
... 
frameLayout.setLayoutParams(new ViewGroup.LayoutParams(pageWidth, pageHeight));
...
}