Android - 触摸绘图

时间:2011-10-09 03:47:48

标签: android canvas drawing touch

我正在通过Google查看this sample drawing app,当我在模拟器中运行应用程序并尝试使用鼠标进行绘制时,绘图看起来并不顺畅。圆圈出现时它们之间有间隙。只有当我慢慢地拖动鼠标时,我才会得到一条完整的线条。我还没有一个实际的设备来测试它,所以我想知道它是如何在实际设备上,或者这是一个模拟器行为?

如果这也是它在设备上的显示方式,我该怎么做才能使触摸平滑?

更新

执行绘图的实际代码是:

private void drawPoint(float x, float y, float pressure, float width) {
    if (width < 1) width = 6; 
    if (mBitmap != null) {
        float radius = width / 2;
        int pressureLevel = (int)(pressure * 255);
        mPaint.setARGB(pressureLevel, 255, 255, 255);
        mCanvas.drawCircle(x, y, radius, mPaint);
        mRect.set((int) (x - radius - 2), (int) (y - radius - 2),
                (int) (x + radius + 2), (int) (y + radius + 2));
        invalidate(mRect);
    }
}

@Override public boolean onTouchEvent(MotionEvent event) {         
    int N = event.getHistorySize();
    int P = event.getPointerCount();

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < P; j++) {
            mCurX = event.getHistoricalX(j, i);
            mCurY = event.getHistoricalY(j, i);
            drawPoint(mCurX, mCurY,
                    event.getHistoricalPressure(j, i),
                    event.getHistoricalTouchMajor(j, i));
        }
    }
    for (int j = 0; j < P; j++) {
        mCurX = event.getX(j);
        mCurY = event.getY(j);
        drawPoint(mCurX, mCurY, event.getPressure(j), event.getTouchMajor(j));
    }           
}

任何帮助改进它将非常感谢。

enter image description here

4 个答案:

答案 0 :(得分:2)

它将是锯齿状的,但我相信代码是绘制点,所以如果你只绘制一条线,从最后一端绘制到新点开始,它将是连续的。

是的,它在实际设备上看起来会一样。

另一个选项,我在内存中做的是,有一些压力值在0到255之间,或0和1,始终将其设置为最高值。这实际上可能是解决您问题的简单方法。

如果您显示实际执行绘图的代码,那将会有所帮助,顺便说一句。

<强>更新

正如我所提到的,改变这一行:

int pressureLevel = (int)(pressure * 255);

int pressureLevel = (int)(255);

应该解决你的问题。

如果没有,那么您可能只想使用drawCircle,而不是使用drawLine,那么您将跟踪刚刚绘制的最后一个圆圈。

答案 1 :(得分:0)

你最好在设备而不是模拟器上运行,因为模拟器处理实时动作太慢了:)。

答案 2 :(得分:0)

也许试试这个:

public boolean onTouch(View view, MotionEvent event) {
   if (event.getHistorySize() == 0) {
      x = event.getX();
      y = event.getY();
   }
   if (x == 0 && y == 0) {
     x = event.getX();
     y = event.getY();
   }

   bitmapCanvas.drawLine(x, y, event.getX(), event.getY(), paint);
   x = event.getX();
   y = event.getY();
   invalidate();
   return true;
}

有些事情需要改进,但总的来说这对画画有好处。

答案 3 :(得分:0)

有一种简单的方法可以解决这个问题, 定义mPaint属性时,请尝试:

mPaint.setStrokeJoin(Paint.Join.ROUND);

此属性将“锯齿状线条”连接成一条漂亮的平滑线。