【问题标题】:Java Android Studio Screenshot A TableLayoutJava Android Studio 屏幕截图 A TableLayout
【发布时间】:2021-08-30 23:24:05
【问题描述】:

我正在尝试获取可滚动表格的屏幕截图。 TableLayout 具有父级匹配的宽度/高度和右/左填充。 TableRows 的宽度/高度有 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;
}

虽然它确实获取了所有信息,但它没有正确获取填充和/或 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;
    }

虽然这确实保留了填充/对齐,但它始终返回除最后一行之外的每一行(添加新行时)。 所以如果我有 20 行,它只返回 19。

当我删除一行(被删除的行所在的位置)时,它也会留下一个空格。

在获取屏幕截图之前,它似乎没有正确更新 TableLayout。 我试过使用:

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

但没有结果。

在第一种方法中,它获取所有数据(添加时)并且不返回已删除行所在的空格(删除时),但它存在填充/对齐问题,而在第二种方法中它获取不完整的数据。

【问题讨论】:

标签: java android-studio screenshot android-tablelayout scrollable


【解决方案1】:

第二种方法应该有效,但只有在表完成工作之后。

您可以创建一个ViewTreeObserver.OnGlobalLayoutListener 并将屏幕截图代码放入其中等待表格完成工作。

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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 2021-07-12
    • 2022-01-22
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多