Android FingerPaint示例不绘制点?

Android FingerPaint示例不绘制点?,android,Android,android api示例演示中的Fingerpaint示例并没有通过触摸屏幕上的手指来绘制点/点。在代码中,他们用路径来画线,有没有办法用路径来画圆或点 public class MyView extends View { // int bh = originalBitmap.getHeight(); // int bw = originalBitmap.getWidth(); public MyView(Context c, int w, int h) {

android api示例演示中的Fingerpaint示例并没有通过触摸屏幕上的手指来绘制点/点。在代码中,他们用路径来画线,有没有办法用路径来画圆或点

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
}
这是代码,我应该在代码中编辑什么才能在FineTouch上绘制点/点

有没有办法用路径画圆或点

在类画布中使用方法
drawPoint(float x,float y,Paint Paint)
,而不是尝试这样做

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

  • 有一个
    私有布尔mDrawPointMyView
    类中的code>来区分点击和幻灯片
  • 如果路径发生更改(即在
    if
    语句中),则在
    touch_start()
    中将
    mDrawPoint设置为
    true
    ,在
    touch_move()
    中将
    设置为false
  • touch\u up()
    中检查
    mDrawPoint
    的值。如果为false,则执行函数之前执行的操作,如果为true,则在画布上绘制点:
    mCanvas.drawPoint(mX,mY,mPaint)
  • 新版本的
    触摸屏()

    当我画完一条线后向上移动手指时,它会自动在它旁边画一个点,即线的终点。当我开始一条新的线/曲线时,先前绘制的线将从画布上移除/清除,只留下绘制的点

    你不需要比我的答案更多的修改。您可能忘了实现它的一部分

    我在尝试时遇到了同样的问题,并在发布答案之前解决了它。这是因为您在两个不同的画布上绘制,这是由
    onDraw
    方法提供的,当您的手指抬起时,该方法会丢失,而另一个是
    mCanvas
    ,该方法将线条保存在
    touch\u
    中。这就是为什么
    touch\u-up
    具有
    if

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

    如果我们移动手指,那么我们将绘制到画布的路径保存到
    onDraw
    mCanvas
    ,以便在竖起手指后它仍然存在

    您遇到的问题来自
    touch\u
    函数的
    else
    部分从未执行,因此在
    touch\u
    上,无论是否应该绘制点,都会绘制点,并且路径从未提交到
    mCanvas
    ,因此在下次调用
    onDraw
    时消失

    正如我在第2点中所说,这很可能是由于您在
    touch_start()
    中将
    mDrawPoint
    设置为true但是忘记在触摸移动中将
    mDrawPoint
    设置为false,正如我在第2点中所说的

    以下是我的
    touch\u 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;
            }
        }
    

    回复很晚,但是使用
    mCanvas.drawPoint(x,y,mpain)会更容易触控\启动

    对我有效的简单解决方案就是将以下代码添加到
    touch\u start()


    如果你想继续使用你的路径,将你的动作坐标存储下来,并在动作坐标中进行比较。如果他们没有移动,在你的路径上加一个小圆圈

    path.addCircle(event.getX(), event.getY(), paint.getStrokeWidth()/4f, Path.Direction.CW);
    

    这种方法的优点是它很简单,圆圈看起来并不完全不合适。

    向我们展示了一些代码。这并不是因为您没有绘制点,而是在
    onDraw
    method中绘制路径。我需要做什么更改才能在触地时绘制点/点?没有尝试过。试试这个
    mCanvas.drawPoint(x,y,mPaint)
    触摸启动
    中告诉我它是否有效是的,它有效但不满足我的要求,我已经实现了下面答案中建议的方法。但是它并没有像我在下面的评论中提到的那样完美地工作。通过使用你的代码,我能够画点,但是当我在画完一条线后向上移动手指时,它会自动在它旁边画一个点,线的终点。当我开始一条新的线/曲线时,先前绘制的线将从画布上移除/清除,只留下绘制的点。请告诉我,我还需要做哪些修改才能实现这一点?@Noumannbhatti您的确切要求是什么。拉古南丹的要求是轻敲时画一个点,滑动时画一条路。最初的Fingerpaint会绘制后者,但如果只是轻敲,则不会绘制点。@JulienRousseau是的,现在我已经获得了它。兄弟,你救了我的命。非常感谢你@朱琳,谢谢你这篇内容丰富的帖子。但是有人知道他妈的在哪里吗?!谢谢
    mPath.quadTo(x, y, x + 0.1f, y);
    
    path.addCircle(event.getX(), event.getY(), paint.getStrokeWidth()/4f, Path.Direction.CW);