Android - сенсорный рисунок - PullRequest
4 голосов
/ 09 октября 2011

Я смотрю на это примерное приложение для рисования от Google, и когда я запускаю приложение в симуляторе и пытаюсь рисовать с помощью мыши, рисунок не выглядит плавно. Круги появляются с промежутками между ними. Только когда я медленно перетаскиваю мышку, я получаю непрерывную линию. У меня еще нет реального устройства, чтобы проверить это, поэтому я хочу знать, будет ли это так же и на реальном устройстве, или это поведение симулятора?

Если это так и будет отображаться на устройстве, что нужно сделать, чтобы сенсорный рисунок был плавным?

UPDATE:

Фактический код, который делает рисунок:

private void drawPoint(float x, float y, float pressure, float width) {
    if (width < 1) width = 6; 
    if (mBitmap != null) {
        float radius = width / 2;
        int pressureLevel = (int)(pressure * 255);
        mPaint.setARGB(pressureLevel, 255, 255, 255);
        mCanvas.drawCircle(x, y, radius, mPaint);
        mRect.set((int) (x - radius - 2), (int) (y - radius - 2),
                (int) (x + radius + 2), (int) (y + radius + 2));
        invalidate(mRect);
    }
}

@Override public boolean onTouchEvent(MotionEvent event) {         
    int N = event.getHistorySize();
    int P = event.getPointerCount();

    for (int i = 0; i < N; i++) {
        for (int j = 0; j < P; j++) {
            mCurX = event.getHistoricalX(j, i);
            mCurY = event.getHistoricalY(j, i);
            drawPoint(mCurX, mCurY,
                    event.getHistoricalPressure(j, i),
                    event.getHistoricalTouchMajor(j, i));
        }
    }
    for (int j = 0; j < P; j++) {
        mCurX = event.getX(j);
        mCurY = event.getY(j);
        drawPoint(mCurX, mCurY, event.getPressure(j), event.getTouchMajor(j));
    }           
}

Любая помощь в ее улучшении будет принята с благодарностью.

enter image description here

Ответы [ 4 ]

2 голосов
/ 09 октября 2011

Это будет неровно, но я считаю, что код рисует точки, поэтому, если вы просто нарисуете линию, начинающуюся там, где последний конец был нарисован до новой точки, она будет непрерывной.

И дана реальном устройстве он будет выглядеть точно так же.

Другой вариант, который я выполняю из памяти, - это было какое-то значение давления, которое было между 0 и 255, или 0 и 1, установите его насамое высокое значение, все время.На самом деле это может быть простым решением вашей проблемы.

Было бы полезно, если бы вы показали код, который на самом деле выполняет рисование, кстати.

ОБНОВЛЕНИЕ:

Как я уже говорил, измените эту строку:

int pressureLevel = (int)(pressure * 255);

на

int pressureLevel = (int)(255);

должен решить вашу проблему.

Если это не так, вместо использованияdrawCircle вы можете просто использовать drawLine, тогда вы будете отслеживать последний круг, который вы только что нарисовали.

0 голосов
/ 18 сентября 2016

Существует простой метод, который должен решить эту проблему, Когда вы определяете атрибуты mPaint, попробуйте:

mPaint.setStrokeJoin(Paint.Join.ROUND);

Этот атрибут соединяет «неровные линии» в красивую плавную линию.

0 голосов
/ 01 апреля 2013

Может быть попробовать это:

public boolean onTouch(View view, MotionEvent event) {
   if (event.getHistorySize() == 0) {
      x = event.getX();
      y = event.getY();
   }
   if (x == 0 && y == 0) {
     x = event.getX();
     y = event.getY();
   }

   bitmapCanvas.drawLine(x, y, event.getX(), event.getY(), paint);
   x = event.getX();
   y = event.getY();
   invalidate();
   return true;
}

Некоторые вещи нужно улучшить, но в целом это хорошо для рисования.

0 голосов
/ 09 октября 2011

Вам лучше работать на устройстве, а не на эмуляторе, поскольку эмулятор обрабатывает действия в реальном времени слишком медленно:).

...