Создание эффекта аэрозоля при нанесении прикосновений в андроиде

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

Ответ 1

Вы просто используете общую часть рисования на холсте... затем укажите радиус, на который нужно нарисовать. Затем, используя "случайную" функцию, нарисуйте (x) количество точек внутри области круга, которую вы определили, используя радиус до тех пор, пока пользователь нажимает вниз. Если вам нужна более точная помощь, пожалуйста, дайте мне знать.

[Изменить] Это будет очень псевдокод. Но вы должны очень легко сделать код из этого.

// This needs to happen in the down press on the canvas
if(currentBrush == Brush.SPRAY_CAN){
    int dotsToDrawAtATime = 20;
    double brushRadius = 1.0; // This is however large they set the brush size, could be (1), could be whatever the max size of your brush is, e.g., (50), but set it based on what they choose

    for (int i = 0; i < dotsToDrawAtATime; i++){
        // Pick a random color for single dot to draw
        // Get the circumference of the circle (2*pi*brushRadius), based on the X/Y that the user input when they pressed down. Pick a random spot inside that area, and draw a single dot. As this is a for loop, it will happen 20 different times for this one occurrence.
    }
}

[Редактировать 2] Если вы собираетесь использовать это, я бы очень хотел рассмотреть возможность использования метода Iain_b. Пожалуйста, учтите его пост.

[Редактировать 3] Вот изображение... может быть, это поможет вам понять...

enter image description here

[Редактировать 4]

Здесь мой код обновлен с помощью lain_b, чтобы упростить его.

// This needs to happen in the down press on the canvas
if(currentBrush == Brush.SPRAY_CAN){
    int dotsToDrawAtATime = 20;
    double brushRadius = 1.0; // This is however large they set the brush size, could be (1), could be whatever the max size of your brush is, e.g., (50), but set it based on what they choose

    for (int i = 0; i < dotsToDrawAtATime; i++){
        // Pick a random color for single dot to draw
        ...

        // Get the location to draw to
        int x = touchedX + Random.nextGaussian()*brushRadius;
        int y = touchedY + Random.nextGaussian()*brushRadius;

        // Draw the point, using the random color, and the X/Y value
        ...
    }
}

Ответ 2

Хмм ИМО логически я бы:

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

  • Затем вычислите радиус аэрозоля с помощью касательной точки в центре круга.

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

Ответ 3

Это дополнение к ответам (DavidKroukamp, ​​RyanInBinary) выше. Я не могу комментировать, поскольку у меня недостаточно репо. Я бы использовал гауссовский дистрибутив для распределения пикселей. Это гораздо проще, чем кажется:

int x = touchedX + Random.nextGaussian()*radius;
int y = touchedY + Random.nextGaussian()*radius;

Где TouchedX / Y - местоположение события касания (и x, y - координаты пикселя для рисования). Я просто думаю, что это даст более естественное распространение. (Randomjava.util.Random)

Ответ 4

Если производительность является проблемой, вы можете с лёгкостью кэшировать генерируемые случайные значения в первый раз, а затем всегда использовать их повторно. Это имеет дополнительное преимущество, заключающееся в возможности отменить/повторить один и тот же псевдослучайный шаблон, который может быть полезен в вашем приложении.