绘制路径大于最大位图尺寸

2024-03-15

我想画一条比canvas.getMaximumBitmapWidth() and/or canvas.getMaximumBitmapHeight()在可缩放的视图内。

特别是在较旧的设备(Android 9 及更早版本)上,这会导致:

路径太大而无法渲染成纹理

or

形状太大而无法渲染为纹理(16388x16388,max=16384x16384)

添加到视图setLayerType(View.LAYER_TYPE_SOFTWARE, paint)不绘制我的实际路径(如果小于最大位图大小),说明:

视图太大,无法放入绘图缓存,需要 12462208 字节,只有 2073600 可用

我试着玩canvas.setDensity(), canvas.setMatrix(), canvas.clipRect(),但没有喜悦。

这是一个简单的 Activity,无法在旧设备上绘制路径:

public class myActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        FrameLayout layout = findViewById(R.id.layout);
        layout.addView(new BigPath(this));
    }

    class BigPath extends View {
        Paint paint = new Paint();
        Path path = new Path();
        public BigPath(Context context) {
            super(context);
            paint.setStyle(Paint.Style.STROKE);
        }
        @Override
        protected void onDraw(Canvas canvas) {
            path.lineTo(canvas.getMaximumBitmapWidth(), canvas.getMaximumBitmapHeight());
            canvas.drawPath(path, paint);
        }
    }
}

也许可以以编程方式将路径分割成更小的部分,但我不知道如何做。请注意,我的实际路径是自动生成的,并且比简单的对角线更复杂,因此我不能提前手动分割它。
先缩小路径,然后放大生成的位图?
降低最终位图分辨率可能是一种选择,但最终具有原始路径大小,因为路径还与其他视图对齐。

如何绘制大于最大位图尺寸的路径?


一个可能的解决方案是使用Matrix缩小路径,然后放大画布。

Matrix matrix = new Matrix();

@Override
protected void onDraw(Canvas canvas) {
    float maxPath = 100000; // Something bigger than max bitmap size
    path.lineTo(maxPath, maxPath);
    int maxBitmap = canvas.getMaximumBitmapWidth() - 10; // Limit 10 px stricter
    float stroke = 3;
    if( maxPath > maxBitmap ) {
        // Downscale path
        float factor = maxBitmap / maxPath;
        matrix.setScale(factor, factor);
        path.transform(matrix);
        stroke *= factor;
        // Upscale canvas
        factor = maxPath / maxBitmap;
        matrix.setScale(factor, factor);
        canvas.concat(matrix);
    }
    paint.setStrokeWidth(stroke);
    canvas.drawPath(path, paint);
}

这使得绘制一条巨大的路径并以原始大小输出成为可能。

保留所提供的MaximumBitmapWidth会导致类似的结果:

形状太大而无法渲染为纹理(16388x16388,max=16384x16384)

因为生成的位图比实际路径大小大一些像素。
所以有必要稍微降低一点限制。

无需考虑canvas.getMaximumBitmapHeight(),因为它始终等于最大位图宽度。

这种方法的唯一缺点是最终位图分辨率可能会降低,取决于第一个尺度的大小factor小于 1(第二个大于 1)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

绘制路径大于最大位图尺寸 的相关文章