2

Google Cardboard 用の一種の HUD オーバーレイを作成しようとしています。

HUD を複製する必要があります (それぞれの目に 1 つ)。単純な解決策は、すべての XML 要素を別のビューに手動でコピーし、それらに異なる名前を付けることです。コードの重複が多いため、これは悪いアプローチのように感じます。

したがって、すべてを2回レンダリングすることになっているViewGroupの次のソリューションを思いつきました。

public class StereoView extends FrameLayout {


    private static final String TAG = StereoView.class.getSimpleName();

    public StereoView(Context context) {
        super(context);
        init(context);
    }

    private void init(Context context) {
        testPaint.setColor(Color.RED);
    }

    private Paint testPaint = new Paint(Paint.ANTI_ALIAS_FLAG);


    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right/2, bottom);
    }

    @Override
    protected void dispatchDraw(Canvas canvas) {

        canvas.save();
        canvas.translate(getWidth() / 2, 0);

        super.dispatchDraw(canvas);

        canvas.restore();
        super.dispatchDraw(canvas);

    }

    public StereoView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context);
    }

    public StereoView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context);
    }


    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public StereoView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init(context);
    }
}

最初の問題は、1 回か 2 回を除いて、dispatchDraw も onDraw も呼び出されないことです。子ビューが無効化されている場合は呼び出されません。

2 つ目の問題は、MATCH_PARENT を持つ要素の背景が、ViewGroups の内部境界の外にレンダリングされることです。

200DP幅 ここに画像の説明を入力

MATCH_PARENT ここに画像の説明を入力

このアプローチはあまりにも多くを望んでいますか、それとも私の考えが間違っていますか? 複雑なレイアウトと画像を処理するために完全にカスタム ビューを作成するのは大変な作業のように思えますが、私のレイアウトをコピーするのは悪い設計のように思えます。

4

2 に答える 2

0

これはあなたの問題に対する私の考えです。

AはsViewGroupをホストします。View任意の xml レイアウトはs であるため、選択Viewした a を拡張し、-(私が好む)、初期化プロセスで Layoutを 2 回膨張させ、後でそれらを sとして追加します。好きな場所。ViewGroupLinearLayoutFramelayoutViewonLayout()View

View1 とView2 をオンボードにする必要がある場合は、インターフェイスまたは Bean など、任意のアプローチを使用して 2 つをバインドできます。

ノート

1 つのレイアウトを作成し、それを 2 回インフレートします。これにより、2 つの個別Viewのオブジェクトが得られるため、これはコードの重複にはなりません。

Elltz _20yearElltz = new Elltz(20),_21yearElltz = new Elltz(21);

それが役に立てば幸い

于 2015-10-27T00:40:37.767 に答える