11
votes

Combattre avec superficielle, appareil photo et opengl

Nous nous sommes battus avec des problèmes liés à la superficie des visions superficielles pendant plus d'une semaine et ne leur trouvez aucune solution appropriée. Nous lisons les autres questions dans le forum concernant des problèmes similaires (et même Mixare Source Code), mais nous ne pouvions pas trouver de réponse. Nous espérons donc que vous pourriez nous aider à nous aider.

scénario: Nous avons p>

  • une vue superficielle pour la caméra li>
  • un SurfaceView pour une couche OpenGL, qui va au-dessus de la caméra. Li>
  • Une autre vue, qui montre des informations sur ce que nous pouvons voir à l'écran. Celui-ci va au-dessus des deux superfasions. LI> ul>

    Problème: P>

    Peu importe la difficulté que nous essayons, les deux superficielles ne sont apparemment pas bien sur les autres. Si nous essayons de: p> xxx pré>

    (qui semble logique), tout se passe comme prévu jusqu'à ce que nous verrouillons / déverrouillez le téléphone. Après cela, la GLSURFACEView disparaît simplement (pas l'InfoView, que l'on est toujours montrée). P>

    Si, au lieu de cela, nous essayons de: P>

    setContentView(mGLSurfaceView); 
    addContentView(mCameraPreview, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
    addContentView(mInfoView, new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    


2 commentaires

Votre question se passe bien au-delà de mes connaissances - mais assurez-vous de passer des appels vers GLSURFACEVIEW.ONPAUSE () et GLSURFACEVIEW.ONRESUME () Comme vous êtes censé à partir de votre activité de conteneur. C'est tout ce que je peux penser à ce sujet.


Il semble que nous essayons de faire face au même problème. Je n'ai pas vu votre question lorsque j'ai posté My propre . Avez-vous essayé setzorderiaoverlay () ? Je l'ai essayé mais je ne pouvais pas faire fonctionner ce scénario. Peut-être que vous pourriez comprendre comment l'utiliser et résoudre ce problème.


4 Réponses :


3
votes

J'ai eu le même problème. Comme vous indiquez vous-même: plusieurs superfasionview S ne s'entendent pas les uns avec les autres en ce que leur ordre z est indéfini.

sur mon Samsung Galaxy S2 La commande est la même que vous décrivez (Don 't savoir comment il se trouve sur d'autres téléphones). La façon dont j'ai résolu ceci, vérifie la première création de l'activité dans olcreate () : xxx

avec : xxx

et: xxx

pas la solution la plus élégante, mais c'est mieux que de laisser le fil de fil pendant 4,6 secondes .

Il pourrait également être possible de verrouiller l'écran dans une seule orientation, mais vous devez ensuite faire beaucoup de piratage laids pour faire pivoter les superpositions de la bonne manière.

Ou, si vous ciblez uniquement Android 3.0 ou supérieur (API NIVEAU 8), vous pouvez simplement afficher la caméra dans une surfacetexture OpenGL. http://developer.android.com/reference /android/hardware/camera.html#setpreviewtexture(android.graphics.surfacetexture )


0 commentaires

5
votes

Essayez ceci:

mLayout.addView(mRenderView);
mLayout.addView(mCustomSurfaceView);

// without this line, the camera preview cannot be displayed 
// when running activity at first time.
mCustomSurfaceView.setZOrderMediaOverlay(true);


1 commentaires

Parfait, cela m'a conduit à setzordonop (Ontop) qui était exactement ce que je cherchais



1
votes

J'ai eu le même problème: je voulais une vision superficielle sous un GLSURFACEView, la première à lire la vidéo et la seconde pour diriger une partie.

Peu importe ce que j'ai fait, l'ordre Z entre ces 2 vues de surface semble être aléatoire.

Mais j'ai trouvé la solution, grâce à ce message: https://stackoverflow.com/a/6028907/1557915

L'astuce consiste à supprimer l'utilisation de la mise en page, mais utilisez plutôt SetContentView / addContentView.


0 commentaires

2
votes

Chaque surface de la vue de surface a une profondeur z. Il existe trois profondeurs possibles: la valeur par défaut (bas), "Superposition de support" (au-dessus de celui-ci) et "TOP" (qui est au-dessus de tout, y compris l'UI basée sur la vue). Si vous avez deux surfaces qui se chevauchent à la même profondeur, on gagnera, mais vous ne pouvez pas définir de manière fiable laquelle. Vous pouvez obtenir un comportement cohérent sur un seul appareil uniquement pour constater qu'il fonctionne dans l'autre sens sur un autre appareil.

La composition est effectuée avec des superpositions matérielles, lorsque cela est possible. De nombreux appareils actuellement populaires ont 4 plans de superposition. Une fois que vous avez dépassé cela, la composition est effectuée avec le GPU, qui va être plus chère. Si vous avez une barre d'état, une barre de navigation et une vue d'UI, c'est trois, vous obtenez donc une vue superficielle pour bon marché.

Pour l'exemple de la question, il serait préférable de combiner autant de choses que possible sur la surface étant rendue avec des gants. Cela peut inclure une sortie de caméra sur l'API 11+. Voir l'activité "Texture à partir de la caméra" dans Grafika pour un exemple. (Grafika a également une application de démonstration avec trois superpositions superposées; voir l'activité "Test multi-surfaces".)

Si vous souhaitez en savoir plus sur pourquoi la vision de la superficie se comporte la façon dont il le fait, voir le Graphiques de niveau système Android doc.


0 commentaires