3

Android 内の GLSurfaceView で画像を動的にレンダリングするために OpenGL を使用しています。アプリケーションは、カスタム GLSurfaceView の複数のインスタンスを持つ (静的) XML ベースのレイアウトに対して完全に正常に動作します。(画像の左上と右上)

これらのインスタンスが可視性値によって動的に交換される場合、最後に表示された OpenGL イメージが新しいイメージの上に表示されます。(画像左下と右下)

http://www.abload.de/img/appxbunc.jpg

左上の写真: 4 インスタンス、通常サイズ

右上の写真: 4 つのインスタンス、大きいサイズ

左下の写真: 1 インスタンス、通常サイズ (不要なオーバーレイとしての左上の写真)

右下の写真: 1 つのインスタンス、大きなサイズ (不要なオーバーレイとしての左上の写真)

私がこれまでに試したこと:

  • 不要なインスタンスを削除しませんでした:
    • android::visibility="gone" で未使用の画像を非表示にします (スムーズに動作しません)
    • ビューを可視領域の外に移動し、0 x 0 にサイズ変更します
    • 出力を簡素化するために、動的画像の代わりに無地の色を使用する
    • ビューを無効にすることでビューの再描画を強制します(実際、ビューが提供するほとんどすべての機能を試しました)
    • onDraw() 関数のさまざまなバッファーをクリアします (GLSurfaceView が提供するほぼすべての関数を実際に試しました)。
    • onPause() イベントで強制的にレンダラーを停止する
    • ViewPager を使用してビューを切り替える
  • 不要なインスタンスを正常に削除しました:
    • アプリを再起動してOpenGLを再起動します(このようには使用できません)
    • android::visibility="gone" で他のすべての GLSurfaceViews を再帰的に非表示にします (エンジンにバグが発生したため、動作しなくなりました)

不要な画像は、ビューの可視性の変更のようなレイアウトのリフローでは変更されません。GLSurfaceView が別の GLSurfaceView の上にある場合にのみ表示されます (android::visibility="gone" で非表示)。代わりに ImageView を使用しても問題ありません。最初に作成されたインスタンスには、この問題はありません。これは、子スタックの一番上 (または一番下?) にあり、その兄弟の上にあるためです。

Android は、GLSurfaceView のすべてのインスタンスで使用される OpenGL ベースのビューを 1 つだけサポートしていると思います。すべてのインスタンスはいくつかの設定 (特に可視性) を共有しているように見えるため、単にオフにしたり移動したりすることはできません。

GLSurfaceView クラス:

public class Panel extends GLSurfaceView implements Renderer {
  private static native void nativeRender();

  public Panel(Context context) {
    super(context);

    this.setRenderer(this);
    this.setRenderMode(RENDERMODE_WHEN_DIRTY);
  }

  public void onDrawFrame(GL10 gl) {
    nativeRender();
  }

  public void onSurfaceChanged(GL10 gl, int w, int h) {
    gl.glViewport(0, 0, w, h);
  }
  public void onSurfaceCreated(GL10 gl, EGLConfig config) {
  }
  @Override
  public void surfaceDestroyed(SurfaceHolder holder) {
    super.surfaceDestroyed(holder);
  }

    public void callback() {
        this.requestRender();
    }
}

複数の OpenGL ビューを互いの内部 (特に上部) で使用することは可能ですか? 可視性の値を使用せずにそれらを交換するより良い方法はありますか?

4

1 に答える 1

1

私は同じ問題を抱えていて、問題を解決できませんでした。別のGLSurfaceViewの可視性をGONEにすると、1つのGLSurfaceViewが1つのトップになり、画面のトップに戻らないことを最終的に理解したからです。しかし、私はトリックで問題を解決しました。ビューを非表示にする代わりに、幅と高さを 1 ピクセルに変更しました。これにより、ビューがユーザーに見えなくなります。そして、それを表示する必要があるときは、LayoutParams で幅と高さを変更しました。そして、それは私の問題を部分的に解決しました。私はあなたに私のコードを見せています

    <RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">

<LinearLayout
    android:id="@+id/smallVideoRenderLayoutIncoming"
    android:layout_width="1dp"
    android:layout_height="1dp"
    android:background="@color/transparent"
    android:orientation="vertical"/>


<LinearLayout
    android:id="@+id/largeVideoRenderLayoutIncoming"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"/>

RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(ConstantFunctions.dpToPx(120),ConstantFunctions.dpToPx(170));
smallVideoRenderLayoutIncoming.setLayoutParams(layoutParams);

表示する必要がある場合は、必要に応じてサイズを変更しました。

于 2017-02-20T05:05:45.393 に答える