在画布上画线的更有效方法?

时间:2016-06-13 00:37:07

标签: android

我在位图上绘制网格。用户可以更改大小,宽高比或拖动网格。使用drawLines执行此操作会在发生这些操作时导致相当糟糕的卡顿。有更好的方法吗?

 private void drawGrid()
{
    canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
    gridOverlayView.invalidate();

    int count = 0;
    for(int i = 0; i < numColumns +1 ; i++)
    {
        points[count]   = originX + (cellWidth * i);
        points[count+1] = originY;
        points[count+2] = originX + (cellWidth * i);
        points[count+3] = originY + (gridHeight);
        count += 4;
    }

    for(int i = 0; i < numRows +1; i++)
    {
        points[count]   = originX;
        points[count+1] = originY + (cellHeight * i);
        points[count+2] = originX + (gridWidth);
        points[count+3] = originY + (cellHeight * i);
        count += 4;
    }

    canvas.drawLines(points, 0, points.length, paint);
    gridOverlayView.setImageBitmap(gridOverlayBitmap);
}

这是从:

调用的
   @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY)
    {
        originX += e2.getX() - e1.getX();
        if(originX < 0f)
        {
            originX = 0f;
        }
        if(originX + gridWidth > imageWidth)
        {
            originX = imageWidth - gridWidth;
        }

        originY += e2.getY() - e1.getY();
        if(originY < 0f)
        {
            originY = 0f;
        }
        if(originY + gridHeight > imageHeight)
        {
            originY = imageHeight - gridHeight;
        }

        drawGrid();
        return true;
    }

2 个答案:

答案 0 :(得分:0)

由于没有源代码你正在调用该函数,我找不到口吃的确切原因。我想你想通过用户交互“实时”改变网格。

我认为你应该避免在用户拖动时重绘整个网格 相反,您可以根据需要翻译,缩放或旋转(如果需要)前一个位图。

当然,结果图像有时质量不高,但是当用户停止交互时,您可以重新创建整个网格位图。
通过这种方式,您可以实现“实时”的网格创建效果。

答案 1 :(得分:0)

我通过做一些事情解决了这个问题:优化dev guide之后的布局。然后我简单地缩小我用来绘制网格的位图,然后当我想将它保存到原始图像时将其缩放。这让一切都变得顺畅......(实际上太快了)