Java Android Studio 屏幕截图 TableLayout

Java Android Studio Screenshot A TableLayout

我正在尝试获取可滚动 table 的屏幕截图。 TableLayout 具有父匹配 width/height 和 right/left 填充。 TableRows width/height 有 wrap_content 和 textAlignment center.

经过一番努力,我得到了这段代码:

private Bitmap getBitmapFromView(View view)
{
    view.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED);

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

    Canvas canvas = new Canvas(bitmap);
    canvas.drawColor(Color.WHITE);

    view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
    view.draw(canvas);

    return bitmap;
}

虽然它确实获得了所有信息,但它没有获得填充 and/or textAlignment 正确,显示的文本彼此太靠近。

这是它的外观对比: Image

我也尝试了不同的方法:

Bitmap bitmap = getBitmapFromView(TableLayout, TableLayout.getHeight(), TableLayout.getWidth());

private Bitmap getBitmapFromView(View view, int height, int width) {
        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        Drawable bgDrawable = view.getBackground();
        if (bgDrawable != null)
            bgDrawable.draw(canvas);
        else
            canvas.drawColor(Color.WHITE);
        view.draw(canvas);
        return bitmap;
    }

虽然这确实保留了 padding/alignment 它总是 return 除了最后一行之外的每一行(添加新行时)。 所以如果我有 20 行,它 return 只有 19.

当我删除一行(删除行所在的位置)时,它也会留下白色 space。

似乎在截屏之前没有正确更新 TableLayout。 我试过使用:

view.invalidate();
view.requestLayout();

但是没有结果。

在第一种方法中,它获取所有数据(添加时)并且 return 白色 spaces 已删除的行(删除时)但它有 padding/alignment问题,而在第二种方法中它获得不完整的数据。

第二种方法应该有效,但只能在 table 完成工作后才能使用。

您可以创建一个ViewTreeObserver.OnGlobalLayoutListener,将截图代码放入其中,等待table完成工作。

ViewTreeObserver.OnGlobalLayoutListener tableLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        ViewTreeObserver observer = yourTableLayout.getViewTreeObserver();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            observer.removeOnGlobalLayoutListener(this);
        } else {
            observer.removeGlobalOnLayoutListener(this);
        }

        //Your code here
    }
};

您可以使用

创建它
yourTableLayout.getViewTreeObserver().addOnGlobalLayoutListener(tableLayoutListener);