Android 渲染视图组的内容两次

Android 渲染视图组的内容两次,android,android-view,google-cardboard,android-viewgroup,Android,Android View,Google Cardboard,Android Viewgroup,我试图为谷歌纸板创建一种HUD覆盖 需要复制HUD(每只眼睛一个)。一个简单的解决方案是手动将所有XML元素复制到另一个视图中,但给它们不同的名称。这种方法感觉很糟糕,因为它涉及大量代码重复 因此,我为一个视图组提出了以下解决方案,该视图组应该将所有内容渲染两次: public class StereoView extends FrameLayout { private static final String TAG = StereoView.class.getSimpleName(

我试图为谷歌纸板创建一种HUD覆盖

需要复制HUD(每只眼睛一个)。一个简单的解决方案是手动将所有XML元素复制到另一个视图中,但给它们不同的名称。这种方法感觉很糟糕,因为它涉及大量代码重复

因此,我为一个视图组提出了以下解决方案,该视图组应该将所有内容渲染两次:

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);
    }
}
第一个问题是调用dispatchDraw或onDraw的次数只有一两次。当子视图无效时,不会调用它

第二个问题是,与父元素匹配的元素上的背景在ViewGroups内部边界之外渲染:

200DP宽度

匹配父项

这种方法是希望太多,还是我想错了?创建一个完全自定义的视图来处理复杂的布局和图像似乎需要大量的工作,而复制我的布局似乎是一个糟糕的设计。

你说:

一个简单的解决方案是手动复制所有XML元素 进入另一个视图,但给他们不同的名称。这感觉像是一场灾难 错误的方法,因为它涉及大量代码重复

实际上,您可以继续使用
标记。您所需要做的就是创建一个布局,其中包含将要向一只眼睛显示的所有视图。然后在主布局中,您必须将此布局
两次,一次用于左眼,另一次用于右眼

您可能会想,如果是这种情况,那么我如何在这个主布局上使用
findViewById()
,因为现在将有两个具有相同id的视图。您可以通过如下操作来解决这个问题。假设您已经创建了
eye.xml
布局。然后您的
主布局应该如下所示

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:orientation="horizontal">

     <include
         android:id="@+id/leftEye"
         layout="@layout/eye" />

     <include
         android:id="@+id/rightEye"
         layout="@layout/eye" />

</LinearLayout>
您需要在活动中编写一个简单的方法,将
左眼
右眼
作为参数传递,然后在此方法中执行所有代码。这允许您同时在
左眼
右眼
中执行UI更改

将来,您可以编写一个自定义视图,在该视图中只需膨胀
eye.xml
。这将使你的想法模块化。

这是我对你问题的看法

A
ViewGroup
hosts
View
s;任何xml布局都是
视图
s,因此扩展您选择的
视图组
线性布局
框架布局
(我更喜欢),在初始化过程中,将布局充气两次并将其添加为
视图
,以后您可以研究如何使用
在线布局()
将您的
视图定位到您的首选位置

无论您将什么称为
视图
1,
视图
2需要在板上,您都可以使用您想要的任何方法、接口或bean将两者绑定起来

注意

创建一个布局并将其充气两次。这将为您提供两个独立的
视图
对象,因此这将不会是代码重复,因为它更多的是

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

希望能有所帮助

通过java反射或其他方式克隆该对象如何。。。
Elltz _20yearElltz = new Elltz(20),_21yearElltz = new Elltz(21);