gpt4 book ai didi

Android FingerPaint 示例不绘制点?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:37:48 25 4
gpt4 key购买 nike

示例 android api 演示中的 Fingerpaint 示例不会通过在屏幕上触摸手指来绘制点/点。在代码中他们使用Path画线,有什么方法可以使用路径画圆或点吗?

public class MyView extends View {
// int bh = originalBitmap.getHeight();
// int bw = originalBitmap.getWidth();

public MyView(Context c, int w, int h) {
super(c);
mBitmap = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
// Bitmap mBitmap =
// Bitmap.createScaledBitmap(originalBitmap,200,200,true);
mCanvas = new Canvas(mBitmap);
mPath = new Path();
mBitmapPaint = new Paint(Paint.DITHER_FLAG);
//mBitmapPaint.setColor(Color.YELLOW);
//mBitmapPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC));
}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
// mBitmap = Bitmap.createBitmap(bw, bh, Bitmap.Config.ARGB_8888);
// mCanvas = new Canvas(mBitmap);
}


@Override
protected void onDraw(Canvas canvas) {
//canvas.drawColor(customColor);
canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);
canvas.drawPath(mPath, mPaint);
}

// //////************touching evants for painting**************///////
private float mX, mY;
private static final float TOUCH_TOLERANCE = 5;

private void touch_start(float x, float y) {
//mCanvas.drawCircle(x, y, progress+1, mPaint);

mPath.reset();
mPath.moveTo(x, y);
//mPaint.setStyle(Paint.Style.FILL);
//mPath.addCircle(x, y, (float) (progress+0.15), Direction.CW);
mCanvas.drawPath(mPath, mPaint);
mX = x;
mY = y;
//mPaint.setStyle(Paint.Style.STROKE);

}

private void touch_move(float x, float y) {
float dx = Math.abs(x - mX);
float dy = Math.abs(y - mY);
if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
mPath.quadTo(mX, mY, (x + mX) / 2, (y + mY) / 2);
mX = x;
mY = y;
}
}

private void touch_up() {
mPath.lineTo(mX, mY);
// commit the path to our offscreen
mCanvas.drawPath(mPath, mPaint);
// kill this so we don't double draw
mPath.reset();
}

@Override
public boolean onTouchEvent(MotionEvent event) {
float x = event.getX();
float y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
touch_start(x, y);
invalidate();
break;
case MotionEvent.ACTION_MOVE:
touch_move(x, y);
invalidate();
break;
case MotionEvent.ACTION_UP:
touch_up();
invalidate();
break;
}
return true;
} // end of touch events for image
}

这是代码,我应该在这段代码中编辑什么才能在 finertouch 上绘制点/点?

最佳答案

is there any way to draw circle or point using path?

与其尝试这样做,不如使用方法 drawPoint(float x, float y, Paint paint)在 Canvas 类中。

要在 API 演示中使用它,您需要更改 3 处:

  1. 有一个private boolean mDrawPoint;MyView区分点击和滑动的类。
  2. 设置mDrawPointtruetouch_start()falsetouch_move()如果路径已更改(即在 if 语句中)。
  3. touch_up()检查 mDrawPoint 的值.如果为假,则执行函数之前执行的操作,如果为真,则在 Canvas 上绘制点: mCanvas.drawPoint(mX, mY, mPaint);

新版本 touch_up() :

private void touch_up() {
if(mDrawPoint == true) {
mCanvas.drawPoint(mX, mY, mPaint);
} else {
mPath.lineTo(mX, mY);
// commit the path to our offscreen
mCanvas.drawPath(mPath, mPaint);
// kill this so we don't double draw
mPath.reset();
}
}

when i move up my finger after drawing a line it automatically draws a point next to it, where the line ended. And when i starts a new line/curve the previously drawn line would remove /clear from the canvas leaving only dots behind that were drawn.

您不需要比我的回答中的内容更多的修改。您可能忘记实现其中的一部分。

我在尝试它时遇到了同样的问题,并在发布我的答案之前解决了它。这是因为你在两个不同的 Canvas 上绘制,给了onDraw方法,当你的手指抬起时它会丢失,另一个是 mCanvas ,这是该行保存在 touch_up 中的位置.这就是为什么 touch_up有一个 if :

如果我们没有移动手指(只是轻敲),那么我们将点画到 mCanvas以便它在下一个 onDraw 上仍然存在(onDrawmCanvas 绘制到它作为参数接收的 Canvas 上,以便在 mCanvas 上绘制的旧线条和点仍然可见)。

如果我们移动了手指,那么我们将绘制到 Canvas 的路径保存到传递给 onDrawmCanvas以便在手指抬起后它仍然存在。

您遇到的问题来自else touch_up 的一部分函数永远不会被执行,因此在 touch_up 上无论是否应该绘制一个点,并且路径永远不会提交给 mCanvas这样下次就消失了onDraw被称为。

这很可能源于您设置 mDrawPointtouch_start() 中为真正如我在第 2 点中所说。但忘记设置 mDrawPointtouch_move 中达到错误 正如我在第 2 点中所说。

这是我的 touch_move看起来像:

private void touch_move(float x, float y) {
float dx = Math.abs(x - mX);
float dy = Math.abs(y - mY);
if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) {
mPath.quadTo(mX, mY, (x + mX)/2, (y + mY)/2);
mX = x;
mY = y;
mDrawPoint = false;
}
}

关于Android FingerPaint 示例不绘制点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17251416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com