Нарисуйте гладкую линию и немного постепенно в андроиде

Я пытаюсь реализовать простой доступный вид. Прямо сейчас я использую метод quadTo для рисования гладкой линии.

And the result like this : enter image description here

I don't know how can draw a line small gradually when user move his finger fast. The same with this example : enter image description here

Вы знаете, как я могу получить этот результат? (в любом случае, с двигателем или с открытым исходным кодом). Прямо сейчас, я думаю о реализации моего собственного метода «quadTo». Но я думаю, что это будет медленно (или это над моими способностями). Потому что это родной метод на Android SDK.

Спасибо за любую помощь.

это мое приложение для моего простого доступного вида для всех, кто в нем нуждается:

public class TestView extends LinearLayout{

private static final String TAG = "TestView";
private PointF previousPoint;
private PointF startPoint;
private PointF currentPoint;
private static final float STROKE_WIDTH = 5f;

private static final float HALF_STROKE_WIDTH = STROKE_WIDTH/2;

private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
private Paint paintBm = new Paint(Paint.ANTI_ALIAS_FLAG);
private Bitmap bmp;
private Canvas canvasBmp;
private Path path;
private int paintSize = 25;

public TestView(Context context, AttributeSet attrs) {
    super(context, attrs);

    this.setWillNotDraw(false);
    paint.setAntiAlias(true);

    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeJoin(Paint.Join.ROUND);
    paint.setStrokeCap(Paint.Cap.ROUND);
    paint.setStrokeWidth(STROKE_WIDTH);
    paint.setColor(Color.BLACK);
    //paint.setAlpha(100);

    paintBm.setAntiAlias(true);

    paintBm.setStyle(Paint.Style.STROKE);
    paintBm.setStrokeJoin(Paint.Join.ROUND);
    paintBm.setStrokeCap(Paint.Cap.ROUND);
    paintBm.setStrokeWidth(STROKE_WIDTH);
    paintBm.setColor(Color.BLACK);
    paintBm.setAlpha(100);
    path = new Path();
    //paint.setPathEffect(new CornerPathEffect(2));
}

public TestView(Context context) {
    super(context);
   //TODO Auto-generated constructor stub
    paint.setAntiAlias(true);

    paint.setStyle(Paint.Style.STROKE);
    paint.setStrokeJoin(Paint.Join.ROUND);
    paint.setStrokeCap(Paint.Cap.ROUND);
    paint.setStrokeWidth(STROKE_WIDTH);
    paint.setColor(Color.BLACK);

    path = new Path();
    //paint.setPathEffect(new CornerPathEffect(2));
}



@Override
protected void onLayout(boolean changed, int left, int top, int right,
        int bottom) {
   //TODO Auto-generated method stub
    super.onLayout(changed, left, top, right, bottom);
    if(bmp == null){
        bmp = Bitmap.createBitmap(right-left,bottom-top,Bitmap.Config.ARGB_8888);
        canvasBmp = new Canvas(bmp);

    }
}
@Override
public boolean onTouchEvent(MotionEvent event) {
    //printSamples(event);
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        currentPoint = new PointF(event.getX(), event.getY());
        previousPoint = currentPoint;
        startPoint = previousPoint;
        path.reset();
        break;

    case MotionEvent.ACTION_MOVE:
        startPoint = previousPoint;
        previousPoint = currentPoint;
        currentPoint = new PointF(event.getX(), event.getY());
        int historySize = event.getHistorySize();
        for(int i = 0; i < historySize; i++){

        }



        drawLine(canvasBmp, path, paint, previousPoint, currentPoint);
        //path.moveTo(currentPoint.x, currentPoint.y);
        break;
    case MotionEvent.ACTION_UP:
        startPoint = previousPoint;
        previousPoint = currentPoint;
        currentPoint = new PointF(event.getX(), event.getY());
        drawLine(canvasBmp, path, paint, previousPoint, currentPoint);
        paintSize = 25;
        break;
    default:
        break;
    }

    invalidate();
    return true;// super.onTouchEvent(event);
}


@Override
protected void onDraw(Canvas canvas) {
    Log.v("pichan", "dasd");
    //canvas.drawBitmap(bmp, 0,0, null);
    //canvas.drawColor(Color.BLUE);
    //canvas.drawPath(path, paint); 
    canvas.drawBitmap(bmp, 0, 0, paintBm);

}





private void drawLine(Canvas canvas, Path path, Paint paint, PointF start, PointF end)
{
    PointF mid1 = midPoint(previousPoint, startPoint);
    PointF mid2 = midPoint(end, start);

    path.reset();
    paint.setStrokeWidth(paintSize);
    path.moveTo(mid1.x, mid1.y);
    path.quadTo(previousPoint.x, previousPoint.y, mid2.x, mid2.y);
    canvas.drawPath(path, paint);
    //canvas.
    //paintSize -= 1;
}

private PointF  midPoint(PointF p1, PointF p2)
{
    return new PointF((p1.x + p2.x)/2.0f ,  (p1.y + p2.y) * 0.5f);
}

}
3
nl ja de
это хорошая идея, я занят сейчас. Я проверю его до ночи. Надеюсь, что смогу помочь
добавлено автор gZerone, источник
Привет @Аншуман. Я проверил ваше решение и вашу проблему. Я думаю, что с вашим решением линия не может быть гладкой. Потому что расстояние между событиями (MotionEvent) различно. Если ваш палец движется быстро, расстояние будет длиннее и наоборот. Пример состоит из трех точек: p1, p2, p3. Расстояние между p1-> p2 = 5 и размер хода равно 10. И расстояние от p2-> p3 = 10 и размер хода составляет 20. => линии не могут быть гладкими.
добавлено автор gZerone, источник
Я понял, в чем твоя проблема. Раньше я столкнулся с проблемой. И единственный способ, который я могу думать, - это создать собственный метод drawline (в моем случае это метод «quadTo»). Когда вы реализуете свой собственный метод drawline, вы можете изменить strokeWidth, когда вы рисуете точку между тонкой и толстой линией.
добавлено автор gZerone, источник
Привет @AndroidDev. Я проверил ссылку. Они вычисляют ширину обводки на основе скорости (а не давления). Как вы можете видеть здесь: public float velocityFrom (Point start) {return distanceTo (start)/(this.time - start.time); } Они вычисляют скорость (скорость) устройства на расстояние между двумя точками до периода времени. Вы можете получить расстояние stackoverflow.com/ вопросы/929773/& hellip; .
добавлено автор gZerone, источник
Затем следующий шаг фильтрует://Простой фильтр нижних частот для уменьшения аберраций скорости. скорость = VELOCITY_FILTER_WEIGHT * скорость + (1 - VELOCITY_FILTER_WEIGHT) * lastVelocity; Из конечного значения скорости вы можете получить значение хода методом «strokeWidth ()» (вам нужно написать собственный метод strokeWidth ()). Чем больше значение скорости, тем меньшее значение ширины штриха.
добавлено автор gZerone, источник
Я использовал вашу логику, чтобы нарисовать гладкую линию и эффективно работать, но в моем случае путь рисуется с использованием переменной ширины и для достижения этого я обнаруживаю давление от события движения и на основе давления, приложенного прямым стилусом пользователя, меняю ширина хода краски, все работает отлично, используя вашу логику, но иногда путь, нарисованный, не соединен должным образом. вы можете проверить, что случилось в моем коде pastebin.com/niDbXf29 .
добавлено автор AndroidDev, источник
Хорошо ... нет проблем. Также проверьте скриншоты. Чтобы вы могли узнать, что на самом деле неправильно в моем коде imageshack.us/ фото/My-изображения/28/4o3t.png
добавлено автор AndroidDev, источник
Фактически в моем случае, исходя из другого значения давления, я устанавливаю значение strokeWidth для моего объекта рисования. В моем случае нарисованные линии являются гладкими, но при рисовании линии всякий раз, когда значение давления изменяется, тогда точка соединения между тонкой и толстой линиями, нарисованными на основе по давлению похоже, что они перекрываются друг с другом. Так есть способ решить эту проблему. Отправьте вам новый снимок экрана, чтобы показать u фактическую ошибку imageshack.com/a/img132/7016 /8y0v.png
добавлено автор AndroidDev, источник
После многих проб и ошибок я могу принести гладкость в чертеже. Следующим шагом будет рассчитать ширину штриха, основанную на скорости и давлении события движения, и любой ширине штриха, которую я получил, нужно установить на краску объект, я получил одну ссылку, которая делает это, но они дали очень мало демонстраций для расчета ширины хода. Не могли бы вы проверить ссылку и рассказать мне, как они вычисляют ширину штриха, основанную на давлении и скорости. corner.squareup.com/2012/07/smoother-signatures.html . Проверьте концепцию переменной ширины.
добавлено автор AndroidDev, источник

1 ответы

После изучения времени я создаю SignView, который позволяет пользователю входить в систему или рисовать, а результат будет сохранен в файле изображения.

Anyone interested in can take a look here: SignView

Надеясь, что это пользовательское представление может сэкономить время.

5
добавлено
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

Android Developers
Android Developers
4 476 участник(ов)

Общаемся на темы, посвященным Android-разработке, SDK, Kotlin, Realm и т.д.

Android Architecture
Android Architecture
2 186 участник(ов)

Русскоязычный чат по архитектуре в андроид приложениях. Подробнее: http://telegra.ph/Android-Architecture-12-24

rus-speaking/android
rus-speaking/android
1 705 участник(ов)

Основной чат по Android разработке (вопрос-ответ). ПРАВИЛА: bit.ly/andr-rules. NEWS: bit.ly/AnrdResId ЧАТЫ: Основной: bit.ly/andr-main IDE, сборка, Git, сервисы: bit.ly/andr-tools Оффтоп: bit.ly/andr-offtop Конференции, события: bit.ly/andr-events Вакансии, найм: bit.ly/andr-job Архитектура: bit.ly/andr-patterns Rx: bit.ly/andr-rx Тестирование: bit.ly/andr-test Kotlin: bit.ly/andr-kotlin Хаmarin: bit.ly/andr-xamarin За мат, спам, агрессию, предложения о работе, оффтоп в этом канале - бан на сутки и более ☢☢☢

Android Dev Подкаст
Android Dev Подкаст
1 325 участник(ов)

Комната для обсуждения Android Dev подкаста apptractor.ru/AndroidDev/ Общее обсуждение Android: https://t.me/android_ru Остальные чаты про Android: http://t.me/devChats Наши новости https://t.me/androiddevpodcast_news

Android Guards
Android Guards
602 участник(ов)

Обсуждение любых вопросов касающихся безопасности Android. - Защита системы и приложений - Уязвимости и эксплойты - Вредоносное ПО - Копание в кишках системы и приложений (RE)

Android JOB
Android JOB
466 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению Android (full-time, part-time, remote и разовые подработки)

AndroidDev :: Разработка. It's Android time now!
AndroidDev :: Разработка. It's Android time now!
458 участник(ов)

It's Android time now! Чат разработчиков Android. Вакансии, резюме и информацию о митапах размещать можно. Публикацию скрытой и явной рекламы ваших каналов и сайтов после получения разрешения от @olegushakov

Aandroid Talks!
Aandroid Talks!
212 участник(ов)

Чат об общих вопросах по ОС Android. Чат для разработки под андроид - pro.android: https://t.me/joinchat/AAAAAEKIFKnmRT9cMebb9w

Android Rus
Android Rus
68 участник(ов)