Как создать этот тип кисти для рисования в Android - PullRequest
9 голосов
/ 19 января 2012

Возможен дубликат Как сделать нестандартную кисть для холста в android?

Привет друзья,

Я слишком застрял, чтобы создать этот тип кисти для нанесения краски, но не нашел ничего связанного с этим.

Я новичок в рисовании / холсте, поэтому у меня нет знаний об этом для базового, который я выполнил, но для такого эффекта, как создание кисти, у меня не было ничего похожего на то, как его создать / реализовать. У кого-нибудь есть пример или код для этого?

Мне нужен этот тип кисти для моего приложения, простой пример, который нужно понять:

enter image description here

Спасибо.

Ответы [ 2 ]

8 голосов
/ 19 января 2012

Я думаю, что нет простого пути. Я нашел это обсуждение и особенно интересен следующий пост:

Профессиональная компьютерная графика никогда не бывает легкой. Вот почему так мало кто действительно занимается этим. Хуже того, профессионал методы редко публикуются. Я не знаю, сколько усилий ты желание сделать, чтобы получить его, но я дам вам немного света. Итак, если вы хотите, вы можете учиться, развиваться и получить это наилучшим образом. Если это кажется слишком тяжело для вас, пусть это здесь из любопытства.

В наши дни профессиональный способ изготовления каллиграфических кистей что:

Мастер-кривая является гладкой, потому что она построена на основе сплайнов. к получить более профессиональный результат, построить два сплайна: один с помощью очки, которые вы получили (например, от событий мыши), лежащие над сплайном и другой, использующий точки как контрольные точки сплайна. Итак Кривая, которую вы рисуете, является кривой, сгенерированной из интерполяции этих два сплайна. Таким образом, у вас есть «основная кривая» для рисования.

У вас также должна быть «основная толщина», на которой должно быть изменение применяется. Это изменение толщины рассчитывается в соответствии с результат, который вы хотите. Более распространенный вид каллиграфической кисти просто как на изображении, которое вы связали: изогнутые области обычно тоньше чем прямые. Это более обычный тип, потому что большинство дизайнеры получают такой результат при рисовании на планшете, поэтому программы подражают этому поведению. Этот эффект, в частности, обычно рассчитывается с использованием функции на основе второго производного от мастера сплайн. Амплитуда изменения толщины может быть настраиваемым значением.

Тонкие и острые кривые наконечники сделаны в дополнительном расчете. Иногда хорошей идеей может быть сглаживание даже толщины вариации со сплайнами или некой «функцией ceil».

Если вы все сделали правильно, у вас толстый (и, конечно, закрытый) кривой в ваших руках. Нарисуйте его, используя лучший алгоритм заполнения, который вы можете развиваться. Используйте сглаживание, если можете.

Все эти методы могут быть рассчитаны в режиме реального времени, пока пользователь двигает мышь. Чем больше очков вы получите, тем больше вычислений сделать, но это работает хорошо, потому что большинство расчетов, которые вы уже сделали все еще действует. Обычно вам просто нужно восстановить небольшую (последнюю) деталь.

Последнее предложение: никогда не делайте 2D-сглаживание с использованием функции регрессии. методы, если ваши точки действительно не представляют функцию (так что вам нужно сохранить "математическое значение" точек в максимально возможной степени). Я могу не представляйте себе более медленный способ сглаживания точек, которые не имеют особых семантика. Единственное исключение - когда у вас очень очень редкие точки и порядок ввода не имеет значения, но это не тот случай, когда кто-то рисует кистями.

3 голосов
/ 09 января 2016

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

enter image description here

Изображение текстуры: -

enter image description here

Вот мой класс просмотра: -

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.view.MotionEvent;
import android.view.View;

import com.serveroverload.dali.R;

public class CanvasBrushDrawing extends View {
    private Bitmap mBitmapBrush;
    private Vector2 mBitmapBrushDimensions;

    private List<Vector2> mPositions = new ArrayList<Vector2>(100);

    private static final class Vector2 {
        public Vector2(float x, float y) {
            this.x = x;
            this.y = y;
        }

        public final float x;
        public final float y;
    }

    public CanvasBrushDrawing(Context context) {
        super(context);

// load your brush here
        mBitmapBrush = BitmapFactory.decodeResource(context.getResources(), R.drawable.ic_launcher);
        mBitmapBrushDimensions = new Vector2(mBitmapBrush.getWidth(), mBitmapBrush.getHeight());

        setBackgroundColor(0xffffffff);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        for (Vector2 pos : mPositions) {
            canvas.drawBitmap(mBitmapBrush, pos.x, pos.y, null);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {

        int action = event.getAction();
        switch (action) {
        case MotionEvent.ACTION_MOVE:
            final float posX = event.getX();
            final float posY = event.getY();
            mPositions.add(new Vector2(posX - mBitmapBrushDimensions.x / 2, posY - mBitmapBrushDimensions.y / 2));
            invalidate();
        }

        return true;
    }
}

Вы можете использовать это представление в своей деятельности следующим образом: -

setContentView(new CanvasBrushDrawing(MainActivity.this));

Теперь вам просто нужны лучшие файлы текстур от вашего дизайнера.Надеюсь, что это помогло

Вы можете увидеть полный исходный код на Git repo https://github.com/hiteshsahu/Dali-PaintBox

...