2011-03-24 8 views
0

Je construis une application qui utilise la caméra android. J'utilise un FrameLayout qui a 2 enfants. Le premier enfant est un SurfaceView qui prévisualise la caméra et le second enfant est un LinearLayout avec quelques boutons.Android Appareil photo SurfaceView Orientation

J'ai lu que dans Android 2.1 et au-dessous, la seule façon d'utiliser l'appareil photo est en mode paysage, donc j'utiliser android:screenOrientation="landscape" android:configChanges="keyboardHidden|orientation" dans mon activité dans le fichier manifeste.

Est-il possible d'utiliser le SurfaceView (appareil photo) en mode paysage seulement et utilisez les LinearLayout (boutons) soit portrait/paysage?

(Par exemple, dans Google Goggles la caméra ne change pas d'orientation, mais les boutons de rotation lors d'un changement d'orientation.)

Répondre

2

L'application de l'appareil photo inclus dans Android est PSBA. Vérifiez la source par vous-même. De son apparence, il est également réglé en mode paysage, mais il fait simplement pivoter les images d'image lorsque l'utilisateur change d'orientation.

Voir this part de la source de la caméra.

1

La meilleure façon de résoudre est comme PSBA fait en utilisant RotateImageView et ImageView spécial que vous pouvez définir une rotation en degrés. Ainsi, dans votre activité de caméra, vous devez implémenter OrientationListener et onOrientationChanged, vous définissez les nouveaux Degrés sur votre RotateImageView. Voici la façon simple, mais vous pouvez chercher un meilleur exemple à la mise en œuvre de la caméra à

private class MyOrientationEventListener extends OrientationEventListener { 
     public MyOrientationEventListener(Context context) { 
      super(context); 
     } 

     @Override 
     public void onOrientationChanged(int orientation) { 


      mOrientation = roundOrientation(orientation); 
      ((RotateImageView)findViewById(R.id.btnFlash)).setDegree(mOrientation); 


     } 
    } 

    public static int roundOrientation(int orientation) { 
     return ((orientation + 45)/90 * 90) % 360; 
    } 
Questions connexes