1

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(...) を削除すると、子ビューの変更が正しく描画されます (たとえば、頻繁に更新されるプログレスバーです)。

誰かが助けてくれることを願っています!本当にありがとう。クリス

4

1 に答える 1

0

私には、Gui を動的に変更しても画面が更新されないのは普通のことのように思えます。どの GUI フレームワークでも、プログラマーが再描画を手動で要求する必要があります。

これは、Gui で 10 個のアイテムを変更した場合、10 回再描画するのではなく、最後に 1 回だけ再描画する必要があるためです。フレームワークは、Gui のリファクタリングがいつ完了したかを推測できません。したがって、何らかの方法で明示的に更新メソッドを呼び出す必要があります。

または、別のスレッドではなく、ローテーションが完了したときに直接 Gui を無効にすることもできます。

于 2011-05-10T14:14:49.533 に答える