覆盖dispatchDraw时,不会自动绘制视图

时间:2011-05-10 13:45:26

标签: android view canvas rotation mirroring

我正在尝试镜像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(...)行,则会正确绘制子视图的更改(例如,这是一个经常更新的进度条。)

我希望有人可以提供帮助! 非常感谢。 克里斯

1 个答案:

答案 0 :(得分:0)

对我而言,动态更改Gui不会更新屏幕看起来很正常。在任何Gui框架中,它们都需要程序员手动请求重绘。

这是因为如果我在我的Gui中更改10个项目,我不想重绘10次,但最后只需重绘一次。当我完成Gui的重构时,框架无法猜测。所以我需要以某种方式明确地调用刷新方法。

或者,当你完成旋转你的东西时,你可以直接使你Gui无效,而不是在一个单独的线程中。