Представление не рисуется автоматически при переопределении dispatchDraw - PullRequest
1 голос
/ 10 мая 2011

Я пытаюсь отразить LinearLayout. Чтобы получить эту работу, я расширил LinerLayout, чтобы создать свой собственный компонент View.

Вот как это выглядит:

    public class FlipLayout extends LinearLayout implements Runnable {
        private boolean isMirroring = true;
        private Handler handler;

        public FlipLayout(Context context) {
            super(context);
            this.setWillNotDraw(false);
        }

        public FlipLayout(Context context, AttributeSet attr) {
            super(context, attr);
            this.setWillNotDraw(false);
            handler = new Handler();
            handler.postDelayed(this, 30);

        }

        @Override
        protected void dispatchDraw(Canvas canvas) {
            canvas.save();
            if (isMirroring) {
                canvas.rotate(180, getWidth() / 2, getHeight() / 2);
            }
            super.dispatchDraw(canvas);
            canvas.restore();
        }

        @Override
        public boolean dispatchTouchEvent(MotionEvent event) {
            if (isMirroring)
                event.setLocation(getWidth() - event.getX(),
                        getHeight() - event.getY());
            return super.dispatchTouchEvent(event);
        }

        @Override
        public void run() {
            invalidate();
            handler.postDelayed(this, 30);
        }

    }

Этот класс работает хорошо, но только при реализации интерфейса Runnable и при вызове invalidate () каждые несколько миллисекунд.

Если я только вращаю холст без аннулирования представления, изменения дочерних представлений не отрисовываются. Теперь мне интересно, в чем причина такого поведения и есть ли способ заставить его работать без реализации Runnable / Handler. Если я удаляю строку canvas.rotate (...), изменения дочерних представлений отображаются правильно (это, например, индикатор выполнения, который часто обновляется).

Я надеюсь, что кто-то может помочь! Спасибо. Chris

1 Ответ

0 голосов
/ 10 мая 2011

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

Это потому, что если я изменяю 10 элементов в моем графическом интерфейсе, я не хочу перерисовывать 10 раз, но только один раз в конце.И структура не может догадаться, когда я закончу рефакторинг Gui.Поэтому мне нужно как-то явно вызывать метод обновления.

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

...