Przeglądaj źródła

@task: QR code adaptation

bai 3 lat temu
rodzic
commit
28639b527e

+ 9 - 0
demo/src/main/java/com/sybotan/android/demo/view/CameraPreview.java

@@ -2,6 +2,7 @@ package com.sybotan.android.demo.view;
 
 import android.content.Context;
 import android.hardware.Camera;
+import android.util.AttributeSet;
 import android.view.SurfaceHolder;
 import android.view.SurfaceView;
 
@@ -27,6 +28,14 @@ public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback
         mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
     }
 
+    public CameraPreview(Context context, AttributeSet attrs){
+        super(context, attrs);
+        mHolder = getHolder();
+        mHolder.addCallback(this);
+        //下面一行适用于Android3.0之前的设备适配,一般可以省略
+        mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
+    }
+
     @Override
     public void surfaceCreated(SurfaceHolder holder) {
         //制定相机图像的绘制区域为这个SurfaceView,并且启动相机的预览

+ 5 - 10
demo/src/main/java/com/zbar/lib/CaptureActivity.java

@@ -76,16 +76,11 @@ public class CaptureActivity extends Activity implements SurfaceHolder.Callback
     }
 
     private void initView() {
-        scanPreview = (SurfaceView) findViewById(R.id.capture_preview);
-        scanContainer = (RelativeLayout) findViewById(R.id.capture_container);
-        scanCropView = (RelativeLayout) findViewById(R.id.capture_crop_view);
-        scanLine = (ImageView) findViewById(R.id.capture_scan_line);
-        findViewById(R.id.capture_imageview_back).setOnClickListener(new View.OnClickListener() {
-            @Override
-            public void onClick(View v) {
-                finish();
-            }
-        });
+        scanPreview = findViewById(R.id.capture_preview);
+        scanContainer = findViewById(R.id.capture_container);
+        scanCropView = findViewById(R.id.capture_crop_view);
+        scanLine = findViewById(R.id.capture_scan_line);
+        findViewById(R.id.capture_imageview_back).setOnClickListener(v -> finish());
         isHasSurface = false;
         beepManager = new BeepManager(this);
 

+ 77 - 4
demo/src/main/java/com/zbar/lib/camera/CameraConfigurationManager.java

@@ -8,6 +8,7 @@ import android.util.Log;
 import android.view.Display;
 import android.view.WindowManager;
 
+import java.util.List;
 import java.util.regex.Pattern;
 
 /**
@@ -41,15 +42,16 @@ final class CameraConfigurationManager {
 		Display display = manager.getDefaultDisplay();
 		screenResolution = new Point(display.getWidth(), display.getHeight());
 		
-	    Point screenResolutionForCamera = new Point();
-	    screenResolutionForCamera.x = screenResolution.x;   
+	    // Point screenResolutionForCamera = new Point();
+	    /*screenResolutionForCamera.x = screenResolution.x;
 	    screenResolutionForCamera.y = screenResolution.y;
 	    
 	    if (screenResolution.x < screenResolution.y) {  
 	         screenResolutionForCamera.x = screenResolution.y;  
 	         screenResolutionForCamera.y = screenResolution.x;
-	    }
-		cameraResolution = getCameraResolution(parameters, screenResolutionForCamera);
+	    }*/
+		//cameraResolution = getCameraResolution(parameters, screenResolutionForCamera);
+		cameraResolution = getCameraResolution1(parameters, screenResolution);
 	}
 	
 	void setDesiredCameraParameters(Camera camera) {
@@ -101,6 +103,77 @@ final class CameraConfigurationManager {
 		return cameraResolution;
 	}
 
+	private static Point getCameraResolution1(Camera.Parameters parameters, Point screenResolution) {
+
+		String previewSizeValueString = parameters.get("preview-size-values");
+		// saw this on Xperia
+		if (previewSizeValueString == null) {
+			previewSizeValueString = parameters.get("preview-size-value");
+		}
+
+		Point cameraResolution = null;
+
+		if (previewSizeValueString != null) {
+			Log.d(TAG, "preview-size-values parameter: " + previewSizeValueString);
+//            cameraResolution = findBestPreviewSizeValue(previewSizeValueString, screenResolution);
+
+			List<Camera.Size> sizeList = parameters.getSupportedPreviewSizes();//获取所有支持的camera尺寸
+			cameraResolution = getOptimalPreviewSize(true, sizeList, screenResolution.x, screenResolution.y);//获取一个最为适配的屏幕尺寸
+		}
+
+		if (cameraResolution == null) {
+			// Ensure that the camera resolution is a multiple of 8, as the screen may not be.
+			cameraResolution = new Point(
+					(screenResolution.x >> 3) << 3,
+					(screenResolution.y >> 3) << 3);
+		}
+
+		return cameraResolution;
+	}
+
+	/**
+	 * 通过对比得到与宽高比最接近的预览尺寸(如果有相同尺寸,优先选择)
+	 *
+	 * @param isPortrait 是否竖屏
+	 * @param surfaceWidth 需要被进行对比的原宽
+	 * @param surfaceHeight 需要被进行对比的原高
+	 * @param preSizeList 需要对比的预览尺寸列表
+	 * @return 得到与原宽高比例最接近的尺寸
+	 */
+	public static Point getOptimalPreviewSize(boolean isPortrait, List<Camera.Size> preSizeList, int surfaceWidth, int surfaceHeight) {
+		int reqTmpWidth;
+		int reqTmpHeight;
+		// 当屏幕为垂直的时候需要把宽高值进行调换,保证宽大于高
+		if (isPortrait) {
+			reqTmpWidth = surfaceHeight;
+			reqTmpHeight = surfaceWidth;
+		} else {
+			reqTmpWidth = surfaceWidth;
+			reqTmpHeight = surfaceHeight;
+		}
+		//先查找preview中是否存在与surfaceview相同宽高的尺寸
+		for(Camera.Size size : preSizeList){
+			if((size.width == reqTmpWidth) && (size.height == reqTmpHeight)){
+				return new Point(size.width, size.height);
+			}
+		}
+
+		// 得到与传入的宽高比最接近的size
+		float reqRatio = ((float) reqTmpWidth) / reqTmpHeight;
+		float curRatio, deltaRatio;
+		float deltaRatioMin = Float.MAX_VALUE;
+		Camera.Size retSize = null;
+		for (Camera.Size size : preSizeList) {
+			curRatio = ((float) size.width) / size.height;
+			deltaRatio = Math.abs(reqRatio - curRatio);
+			if (deltaRatio < deltaRatioMin) {
+				deltaRatioMin = deltaRatio;
+				retSize = size;
+			}
+		}
+		return new Point(retSize.width, retSize.height);
+	}
+
 	private static Point findBestPreviewSizeValue(
 			CharSequence previewSizeValueString, Point screenResolution) {
 		int bestX = 0;

+ 6 - 6
demo/src/main/res/layout/activity_capture.xml

@@ -4,7 +4,7 @@
     android:layout_height="match_parent"
     android:orientation="vertical" >
 
-    <com.sybotan.android.demo.view.CameraPreview
+    <SurfaceView
         android:id="@+id/capture_preview"
         android:layout_width="match_parent"
         android:layout_height="match_parent" />
@@ -25,19 +25,19 @@
             android:id="@+id/capture_crop_view"
             android:layout_width="200dp"
             android:layout_height="200dp"
-            android:layout_centerHorizontal="true"
             android:layout_below="@id/capture_mask_top"
-            android:background="@drawable/qr_code_bg" >
+            android:layout_centerHorizontal="true"
+            android:background="@drawable/qr_code_bg">
 
             <ImageView
                 android:id="@+id/capture_scan_line"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_alignParentTop="true"
-                android:layout_marginBottom="5dp"
                 android:layout_marginTop="5dp"
-                android:visibility="visible"
-                android:src="@drawable/scan_line" />
+                android:layout_marginBottom="5dp"
+                android:src="@drawable/scan_line"
+                android:visibility="visible" />
         </RelativeLayout>
 
         <ImageView