当前位置: 首页 > 知识库问答 >
问题:

Android FingerPaint示例不绘制点?

慕容晔
2023-03-14

示例android api demo中的手绘示例不会通过触摸屏幕上的手指来绘制点/点。在代码中,他们使用Path来画线,有没有办法使用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
}

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

共有3个答案

华坚成
2023-03-14

对我来说,一个简单的解决方案就是在touch\u start()中添加以下代码:

mPath.quadTo(x, y, x + 0.1f, y);
朱典
2023-03-14

很晚才回复,但在touch_start中使用mCanvas.drawPoint(x, y, mPaint);会更容易。

益承颜
2023-03-14

有没有什么方法可以用路径画圆或点?

与其尝试这样做,不如使用Canvas类中的方法绘制点(浮动x、浮动y、绘画)

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

  1. 有一个私有布尔mDrawPoint 来区分点击和幻灯片

新版本的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();
    }
}

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

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

我在尝试时遇到了同样的问题,并在发布答案之前解决了它。这是因为您在两个不同的画布上绘制,在画布上使用的是onDraw方法,该方法在手指抬起时会丢失,另一个是mCanvas方法,该方法将线条保存在触摸中。这就是为什么触摸屏有一个if(如果)的原因:

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

如果移动手指,则将绘制到画布的路径保存到mCanvas,并将其传递给onDraw,以便在竖起手指后仍然存在。

您遇到的问题来自touch_up函数的ore部分永远不会执行,因此在touch_up上,无论是否应该绘制一个点,路径永远不会提交到mCanvas,因此在下次调用onDraw时消失。

这很可能源于您在touch_start()中将mDrawPoint设置为true,正如我在第2点中所说。但是忘记在touch_move中将mDrawPoint设置为false,正如我在第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;
        }
    }
 类似资料:
  • 本文向大家介绍python 绘制国旗的示例,包括了python 绘制国旗的示例的使用技巧和注意事项,需要的朋友参考一下 国旗是一个国家的象征,它可以反映一个国家的特色和传统,国旗起源于近代的欧洲,是一个国家主权意识不断增强后的必然产物,本文我们使用 Python 来画几面国旗,使用的 Python 库是大家比较熟悉的 turtle。 五星红旗 五星红旗是中华人民共和国的国旗,它是由四颗小的黄五角星

  • 本文向大家介绍python matplotlib绘制三维图的示例,包括了python matplotlib绘制三维图的示例的使用技巧和注意事项,需要的朋友参考一下 作者:catmelo 本文版权归作者所有 链接:https://www.cnblogs.com/catmelo/p/4162101.html 本文参考官方文档:http://matplotlib.org/mpl_toolkits/mpl

  • 我在CSV文件中有一些数据,想打印出来,但图形没有显示出来 这是CSV文件http://www.mediafire.com/file/2gtbxm5adom7m4j/pop.csv

  • 本文向大家介绍Python matplotlib绘制饼状图功能示例,包括了Python matplotlib绘制饼状图功能示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Python matplotlib绘制饼状图功能。分享给大家供大家参考,具体如下: 一 代码 二 运行结果 更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数学运算技巧总结》、《Python数据结

  • 本文向大家介绍python绘制分布折线图的示例,包括了python绘制分布折线图的示例的使用技巧和注意事项,需要的朋友参考一下 用Python 绘制分布(折线)图,使用的是 plot()函数。 一个简单的例子: 结果: 以上就是python绘制分布折线图的示例代码的详细内容,更多关于python绘制分布折线图的资料请关注呐喊教程其它相关文章!

  • 本文向大家介绍Android 曲线图的绘制示例代码,包括了Android 曲线图的绘制示例代码的使用技巧和注意事项,需要的朋友参考一下 本文介绍了Android 曲线图的绘制示例代码,分享给大家,具体如下: 效果展示 效果展示.gif 使用方式 实现思路 横坐标是固定的, 纵坐标需要跟随曲线传入的数值去动态的调整 绘制坐标轴: 纵横交错的网格 根据用户传入坐标数值去绘制坐标轴上的数值 给X轴和Y轴