Android FingerPaint示例不绘制点?
android api示例演示中的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) {
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项内容:
私有布尔mDrawPoint在MyView
类中的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);