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 の内部境界の外にレンダリングされることです。
このアプローチはあまりにも多くを望んでいますか、それとも私の考えが間違っていますか? 複雑なレイアウトと画像を処理するために完全にカスタム ビューを作成するのは大変な作業のように思えますが、私のレイアウトをコピーするのは悪い設計のように思えます。