有时候咱们想依据本人的须要调整下Camera的预览方向,那么是调用哪个API能够达到咱们的目标呢?

 咱们看下下图拍的几张小可爱的照片,别离是失常方向、旋转180度、90度拍的照片。

 

 

一、Camera API

Camera1上,咱们能够通过setDisplayOrientation(int degress);来设置camera预览的方向。

mCamera.setDisplayOrientation(Surface.ROTATION_180);

这里也贴下源码外面对于setDisplayOrientaion接口的具体阐明。

 /**     * Set the clockwise rotation of preview display in degrees. This affects     * the preview frames and the picture displayed after snapshot. This method     * is useful for portrait mode applications. Note that preview display of     * front-facing cameras is flipped horizontally before the rotation, that     * is, the image is reflected along the central vertical axis of the camera     * sensor. So the users can see themselves as looking into a mirror.     *     * <p>This does not affect the order of byte array passed in {@link     * PreviewCallback#onPreviewFrame}, JPEG pictures, or recorded videos. This     * method is not allowed to be called during preview.     *     * <p>If you want to make the camera image show in the same orientation as     * the display, you can use the following code.     * <pre>     * public static void setCameraDisplayOrientation(Activity activity,     *         int cameraId, android.hardware.Camera camera) {     *     android.hardware.Camera.CameraInfo info =     *             new android.hardware.Camera.CameraInfo();     *     android.hardware.Camera.getCameraInfo(cameraId, info);     *     int rotation = activity.getWindowManager().getDefaultDisplay()     *             .getRotation();     *     int degrees = 0;     *     switch (rotation) {     *         case Surface.ROTATION_0: degrees = 0; break;     *         case Surface.ROTATION_90: degrees = 90; break;     *         case Surface.ROTATION_180: degrees = 180; break;     *         case Surface.ROTATION_270: degrees = 270; break;     *     }     *     *     int result;     *     if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {     *         result = (info.orientation + degrees) % 360;     *         result = (360 - result) % 360;  // compensate the mirror     *     } else {  // back-facing     *         result = (info.orientation - degrees + 360) % 360;     *     }     *     camera.setDisplayOrientation(result);     * }     * </pre>     *     * <p>Starting from API level 14, this method can be called when preview is     * active.     *     * <p><b>Note: </b>Before API level 24, the default value for orientation is 0\. Starting in     * API level 24, the default orientation will be such that applications in forced-landscape mode     * will have correct preview orientation, which may be either a default of 0 or     * 180\. Applications that operate in portrait mode or allow for changing orientation must still     * call this method after each orientation change to ensure correct preview display in all     * cases.</p>     *     * @param degrees the angle that the picture will be rotated clockwise.     *                Valid values are 0, 90, 180, and 270.     * @throws RuntimeException if setting orientation fails; usually this would     *    be because of a hardware or other low-level error, or because     *    release() has been called on this Camera instance.     * @see #setPreviewDisplay(SurfaceHolder)     */    public native final void setDisplayOrientation(int degrees);

二、Camera2 API

 Camera2的API上,找了一通,发现并没有像Camera1上,能够通过相似的接口来设置预览方向,不过能够通过TextureView.setTransform(matrix);来通过调整textureView的显示来达到目标。

  public void openCamera(){        CameraManager manager = (CameraManager) mContext.getSystemService(Context.CAMERA_SERVICE);        try {           ......//调整预览画面显示方向configureTextureViewTransform(mTextureView.getWidth(),mTextureView.getHeight());            manager.openCamera(cameraId, mStateCallback, null);           ......        }}private void configureTextureViewTransform(int viewWidth, int viewHeight) {        if (null == mTextureView) {            return;        }        int rotation = 0 ;/*activity.getWindowManager().getDefaultDisplay().getRotation();*/        Matrix matrix = new Matrix();        RectF viewRect = new RectF(0, 0, viewWidth, viewHeight);        RectF bufferRect = new RectF(0, 0, mPreviewSize.getHeight(), mPreviewSize.getWidth());        float centerX = viewRect.centerX();        float centerY = viewRect.centerY();        if (Surface.ROTATION_90 == rotation || Surface.ROTATION_270 == rotation) {            bufferRect.offset(centerX - bufferRect.centerX(), centerY - bufferRect.centerY());            matrix.setRectToRect(viewRect, bufferRect, Matrix.ScaleToFit.FILL);            float scale = Math.max(                    (float) viewHeight / mPreviewSize.getHeight(),                    (float) viewWidth / mPreviewSize.getWidth());            matrix.postScale(scale, scale, centerX, centerY);            matrix.postRotate(90 * (rotation - 2), centerX, centerY);        }else if (Surface.ROTATION_180 == rotation) {            matrix.postRotate(180, centerX, centerY);        }        mTextureView.setTransform(matrix);    }

自己从事Android Camera相干开发已有5年

目前在深圳下班

欢送大家关注我的微信公众号“小驰笔记”

大家一起学习交换