使用画布创建自定义行

时间:2014-01-13 23:40:02

标签: android canvas bitmap image-resizing

我想使用一个4x4像素的位图(墙上的另一块砖)绘制一条线,该线可以在任何地方开始/停止并朝任何方向前进。

我正在尝试以下内容:

    Bitmap bm = BitmapFactory.decodeResource(getResources(), R.drawable.brick);
    int width = bm.getWidth();
    int height = bm.getHeight();
    float newWidth = Math.abs(line.startX - line.stopX);
    float newHeight = Math.abs(line.startY - line.stopY);
    float scaleWidth = ((float) newWidth) / width;
    float scaleHeight = ((float) newHeight) / height;
        Matrix matrix = new Matrix();
    Matrix m = new Matrix();
    // resize the bit map
    matrix.postScale(scaleWidth, scaleHeight);
    // recreate the new Bitmap
    Bitmap resizedBitmap = Bitmap.createBitmap(bm, (int)line.startX,(int)line.startY, width, height, matrix, false);
    canvas.drawBitmap(resizedBitmap, m, paint);

我意识到这是一个调整大小,而不是按顺序绘制.bmp。它也会引发错误x + width must be <= bitmap.width()

有没有人对此处使用的技术有任何建议?

1 个答案:

答案 0 :(得分:0)

据我所知,最简单的技术是计算X增量值和Y增量值。此计算的性质取决于您是否需要紧密堆积的位图或重叠:

对于重叠,这应该是一个简单的斜率计算(不要忘记零/无限斜率边缘情况!)。

对于紧密打包,通过比较线的斜率与图像对角线上绘制的线的斜率来确定密堆积方向(X或Y)。如果线条比图像对角线陡峭,则需要Y紧密包装。在备用情况下,您需要X密封包装。

然后,计算增量值。密堆积轴(如果需要)中的增量值将是沿该轴的位图尺寸。另一个轴的增量值将是线的斜率和密堆积增量的简单线性函数。

获得增量值后,迭代地将位图绘制到画布,开始行开始位置,并在每次迭代时递增绘制位置。 当您的增量导致任一值超出行结束时停止迭代。在计算增量时以及检查线的末尾时,您必须考虑到线坐标可能从低数字变为高数字,或从高数字变为低数字。

您可能还认为您并不总是希望在起点处开始绘图,而是想要使您的线“居中”,使得起始和结束图像在其中心与实际端点等距。在这种情况下,你必须计算一个不同的起点,但它应该涉及相当简单的数学。