Образец Android FingerPaint не рисует точку?

Пример примера Fingerpaint в демоверсии aproid android не рисует точку / точку, касаясь пальцем на экране. В коде они использовали 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?

Есть ли способ рисовать круг или точку, используя путь?

Вместо того, чтобы пытаться это сделать, используйте метод drawPoint(float x, float y, Paint paint) в классе Canvas.

Чтобы использовать его в демонстрации API, вам нужно будет изменить 3 вещи:

  1. Иметь private boolean mDrawPoint; MyView классе MyView чтобы различать MyView и слайды.
  2. Установите mDrawPoint в true в touch_start() и в false в touch_move() если путь изменен (то есть в инструкции if ).
  3. В touch_up() проверьте значение mDrawPoint . Если это false, сделайте то, что сделала функция раньше, и если это правда, то нарисуйте точку на холсте: 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(); } } 

Когда я двигаю пальцем после рисования линии, он автоматически рисует точку рядом с ней, где заканчивается линия. И когда я начинаю новую строку / кривую, ранее нарисованная линия удаляла / очищала из холста, оставляя только точечные точки, которые были нарисованы.

Вы не нуждаетесь в каких-либо модификациях, чем в моем ответе. Вы, вероятно, забыли реализовать часть этого.

У меня была такая же проблема, когда я пытался ее решить и разрешил, прежде чем публиковать свой ответ. Это было вызвано тем, что вы нарисовали два разных холста, заданных методу onDraw , который теряется, когда ваш палец встает, а другой – mCanvas , в котором строка сохраняется в touch_up . Вот почему touch_up имеет if :

Если мы не переместили палец (просто постучали), мы нарисуем точку на mCanvas так, чтобы она все еще находилась на следующем onDraw ( onDraw рисует mCanvas на холст, который он получает в качестве аргумента, так что старые строки и точки, нарисованные на mCanvas все еще видны).

Если мы перенесли палец, то мы сохраним путь, который был нарисован на холсте, переданном onDraw на mCanvas чтобы он все еще присутствовал после того, как он поднял палец.

Проблема, с которой вы сталкиваетесь, связана с else частью функции touch_up которая никогда не выполняется, так что на touch_up точка получает touch_up независимо от того, должна ли она, и путь никогда не будет mCanvas и таким образом исчезнет при следующем onDraw .

Скорее всего, это связано с тем, что вы устанавливаете mDrawPoint в true в touch_start() как я сказал в пункте 2. но забываем установить mDrawPoint до false в touch_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; } } 

Очень поздний ответ, но было бы проще использовать mCanvas.drawPoint(x, y, mPaint); В touch_start.

Простое решение, которое работает для меня, – это просто добавить следующий код для touch_start() :

 mPath.quadTo(x, y, x + 0.1f, y); 

Если вы предпочитаете продолжать использовать свой путь, сохраните свои ACTION_DOWN координаты и сравните их в ACTION_UP. Если они не перемещены, добавьте крошечный круг на ваш путь.

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

Преимущество такого подхода состоит в том, что он прост, и круг не выглядит совершенно неуместным.