настройка drawable.invalidate для непрерывного рисования на холсте - PullRequest
2 голосов
/ 11 марта 2012

Я пытаюсь постепенно изменить альфа-значение OvalShape () .. для этого мне нужно вызвать инвалидацию, чтобы он продолжал вызывать себя и отображать себя с увеличенным альфа-значением ..

но установка неверна, так как я не очень разбираюсь в этом ..

public class xml_anim_testing_sub_class extends View {
    private ShapeDrawable mDrawable;
    int x = 10;
    int y = 10;
    int width = 300;
    int height = 50;
    int my_alpha = 255,add_to_my_alpha = 0;

    public xml_anim_testing_sub_class(Context context) {
        super(context);
    }

    protected void onDraw(Canvas canvas) {
        x++;
        mDrawable = new ShapeDrawable(new OvalShape());
        mDrawable.getPaint().setColor(0xff74AC23);
        mDrawable.setAlpha(my_alpha += add_to_my_alpha );
        mDrawable.setBounds(x, y, x + width, y + height);
        if (my_alpha == 0)
            add_to_my_alpha  = 1;
        if (my_alpha == 255)
            add_to_my_alpha  = -1;
        mDrawable.draw(canvas);
        mDrawable.invalidateSelf();
    }
}

Хорошо, я нашел решение, invalidate(), но в чем же разница между invalidate и postInvalidate? потому что оба работают ..

также, какая польза от этого?

mDrawable.invalidateSelf()(cb);

Ответы [ 2 ]

6 голосов
/ 11 марта 2012

Вместо вызова mDrawable.invalidateSelf(), позвоните postInvalidate() (для самого представления).Это запланирует еще один проход рисования после завершения текущего.

Кроме того, вам не нужно выделять новый ShapeDrawable каждый раз через onDraw.Просто назначьте его в конструкторе один раз.Это сократит образование мусора.

0 голосов
/ 06 ноября 2015

Согласно документам: http://developer.android.com/reference/android/view/View.html#invalidate()

invalidate()

Делать недействительным весь вид.Если представление является видимым, onDraw (android.graphics.Canvas) будет вызван в какой-то момент в будущем.

Это должно быть вызвано из потока пользовательского интерфейса.Для вызова из потока, не являющегося пользовательским интерфейсом, вызовите postInvalidate ().

Пост-недействительный пост поставит в очередь задачу недействительности для потока пользовательского интерфейса (основного петлителя) для выполнения в режиме FIFO.

...