Anpassen einer Kameravorschau an ein SurfaceView, das größer als das Display ist

Ich habe ein Android-Anwendung, um Vollbild-Kamera-Vorschau unabhängig von der Größe der Vorschau gegeben durch getSupportedPreviewSizes() ohne Verzerrung. Ich erwarte, dass die Ernte der Vorschau durch eine gewisse Menge in entweder die Höhe oder die Breite, aber das betrifft mich nicht. Der Grund, warum ich versuchen, dies zu tun ist, weil bestimmte android-Kameras (z.B. Samsung Galaxy SII front nach Kamera) nicht wieder jede Vorschau mit der gleichen Seitenverhältnis wie das display, und müssen daher gedehnt und abgeschnitten.

Ist es möglich, vollständig wachsen der Kamera-Vorschau, um eine größere Ansicht als die display-Größe? Es ist möglich, zu wachsen, die SurfaceView, die größer als die Vorschau pixel-Dimensionen zurückgegeben, indem Sie einfach die Einstellung der Oberfläche, Ansicht-layout params, match_parent, aber dies führt zu Verzerrungen in eine Richtung und nur möglich ist, bis das Album füllt sich die Anzeige. Dies scheint darauf hinzudeuten, dass die Vorschau außerhalb des Displays unmöglich ist, und die hardware (oder OS) schränkt ein solches Verhalten.

Es ist eine andere Frage auf das Thema, aber diese Frage behauptet, es ist nicht möglich, erstellen Sie eine SurfaceView, die größer als der Bildschirm Abmessungen, was falsch ist, wie ich gefunden habe, mit Protokollierung. Was allerdings der Fall zu sein scheint ist, dass die Kamera-Vorschau kann aber nicht wachsen, um die volle Größe eines riesigen SurfaceView.

Mein Versuch:

Ich habe ein relatives layout ein FrameLayout, und ich erstellen Sie eine SurfaceView. Die Breite der gesamte relative layout wird unten 635dp, die ~doppelte Gerät die Bildschirmgröße. Das FrameLayout entspricht, ist die Größe und damit auch die SurfaceView (programmgesteuert Hinzugefügt später)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/camera_activity_layout"
    android:layout_width="635dp"
    android:layout_height="match_parent" >

    <FrameLayout
        android:id="@+id/camera_preview"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </FrameLayout>

</RelativeLayout>

Folgende code ist der code, erhält und setzt die Größe der Vorschau. Hier möchte ich, um die Kamera-Vorschau zu erweitern, um die gesamte FrameLayout (doppelte Bildschirmbreite). Die Ansicht zeigt und sich völlig normal, so bin ich entfernen-code nicht mit dieser bestimmten Frage, denn es lenkt von der wesentlichen Frage, und mein Versuch, leicht und wachsen einfach die Ansicht um einige größer-als-Darstellung.

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback {

    ...

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
        Camera.Parameters parameters = mCamera.getParameters();
        final DisplayMetrics dm = this.getResources().getDisplayMetrics();
            //getBestPreviewSize returns the best preview size, don't worry
            //but some devices do not return one for all camera matching the aspect ratio
        cameraSize = getBestPreviewSize(parameters, dm.heightPixels, dm.widthPixels);

        if (cameraSize!=null) {
            parameters.setPreviewSize(cameraSize.width, cameraSize.height);
            mCamera.setParameters(parameters);
        }

        FrameLayout.LayoutParams frameParams = (FrameLayout.LayoutParams) this.getLayoutParams();

        frameParams.width = 800; //For argument's sake making this ~double the width of the display. Same result occurs if I use MATCH_PARENT
        frameParams.height = LayoutParams.MATCH_PARENT;
        this.setLayoutParams(frameParams);

        try {
            mCamera.setPreviewDisplay(mHolder);
            mCamera.startPreview();

            Log.d("surfChange","W/H of CamPreview (child) is "+this.getWidth()+"/"+this.getHeight()+" while parent is ");
            Log.d("surfChange","W/H of holder (child) is "+mHolder.getSurfaceFrame().width()+"/"+mHolder.getSurfaceFrame().height()+" while parent is ");
        } catch (Exception e){
        }
    }
};

Ich bin besorgt darüber, dass der einzige Weg zum Erfolg in diesem bemühen ist das irgendwie machen, um eine openGL-Oberfläche, aber das offenbar könnte zu langsam sein in Farbe. Es ist auch ein Schmerz, wenn die Kamera in der Vorschau können Sie einfach gestreckt und abgeschnitten.

Vielen Dank im Voraus für alle versuche auf die Lösung.

InformationsquelleAutor der Frage Daniel Smith | 2012-07-04

Schreibe einen Kommentar