Hallo,
in meiner app soll auch die Kamera benutzt werden. Habe dazu das Beispiel aus dem Sdk (unter "android-8") mehr oder weniger 1:1 übernommen und etwas modifiziert. Aber das preview-Bild ist verzerrt und ausserdem um 90 Grad nach links gedreht.
Ich benutze kein XML-Layout, sondern baue den Screen per Programmcode zusammen. Ausserdem ist nicht nur die SurfaceView zu sehen, sondern noch zwei Buttons, eingebettet in ein LinearLayout, welches wiederum in einem anderen LinearLayout steckt.
Egal, ob da im Programmcode steht (in FotoPreview.surfaceChanged)
parameters.setPreviewSize(200,300);
parameters.setRotation(90);
oder nicht, es hat keinen Einfluss. Das Preview-Bild füllt IMMER den gesamten Platz, den die SurfaceView auf dem Display hat, und es ist IMMER um 90 Grad gedreht. Kann mir da einer helfen? Auch bei allen Beispielen die ich gefunden und ausprobiert hab (das aus dem SDK sowie zwei, allerdings fast identische, aus dem Internet) waren ebenfalls verzerrt und nach links gedreht. Anbei der Code:
Die Klasse, die die view zusammenbaut (wird von der acitivty aufgerufen, "ViewGroup parent" ist ein LinearLayout):
public void addView(Activity a, ViewGroup parent)
{
act=a;
LinearLayout ll=new LinearLayout(act);
ll.setOrientation(LinearLayout.VERTICAL);
parent.addView(ll);
camButton=new Button(act);
camButton.setText("Foto machen");
camButton.setId(foto_id);
camButton.setOnClickListener(this);
ll.addView(camButton);
focusButton=new Button(act);
focusButton.setText("Fokussieren");
focusButton.setId(focus_id);
focusButton.setOnClickListener(this);
ll.addView(focusButton);
preview=new FotoPreview(act);
ll.addView(preview);
}
Preview-Klasse:
class FotoPreview extends SurfaceView implements SurfaceHolder.Callback
{
SurfaceHolder mHolder;
Camera mCamera;
FotoPreview(Context context)
{
super(context);
mHolder=getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder)
{
mCamera=Camera.open();
try
{
mCamera.setPreviewDisplay(holder);
}
catch (IOException exception)
{
mCamera.release();
mCamera=null;
}
}
public void surfaceDestroyed(SurfaceHolder holder)
{
mCamera.stopPreview();
mCamera.release();
mCamera=null;
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h)
{
Camera.Parameters parameters=mCamera.getParameters();
parameters.setPreviewSize(200,300);
parameters.setRotation(90);
mCamera.setParameters(parameters);
mCamera.startPreview();
}
public Camera getCamera()
{
return mCamera;
}
}
Alles anzeigen