Метод Invalidate () для onDraw в android - PullRequest
0 голосов
/ 14 января 2020

Я делаю проект в android студии. Я просто хочу сделать мигающую световую точку, используя onDraw() и invalidate(), но что-то не так.

Это первый класс

public class flashingPoint extends View {

    private ShapeDrawable mParteDibujable;

    public flashingPoint(Context context){

        super(context);

        final Handler bridge = new Handler();

        Thread time = new Thread() {

            public void run() {

                bridge.postDelayed(this, 1000);
                invalidate();

            }

        };
        time.start();

        }
    @Override
    protected void onDraw(Canvas canvas) {
        mParteDibujable = new ShapeDrawable(new OvalShape());
        mParteDibujable.getPaint().setColor(0xff74AC23);
        mParteDibujable.setBounds(10, 20, 80, 80);

        mParteDibujable.draw(canvas);
        //invalidate();

    }

А затем основной класс:

public class MainActivity extends AppCompatActivity {

    private ShapeDrawable mParteDibujable;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LinearLayout mLinearLayout = new LinearLayout(this);

        flashingPoint myView = new flashingpoint(this);
        mLinearLayout.addView(myView);

        setContentView(mLinearLayout);

    }
}

1 Ответ

3 голосов
/ 14 января 2020

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

Кроме того, вы не можете сделать недействительным в теме, вам нужно использовать postInvalidate. И ваш поток неверен - либо не используйте поток, используйте Runnable и отправьте его в обработчик, либо поток должен бесконечно l oop, а не возвращаться. Желательно, во-первых, нет никакой причины иметь здесь нить.

...