diff --git a/app/src/main/java/com/king/zxing/app/CustomCaptureActivity.java b/app/src/main/java/com/king/zxing/app/CustomCaptureActivity.java
index 736994d..7521286 100644
--- a/app/src/main/java/com/king/zxing/app/CustomCaptureActivity.java
+++ b/app/src/main/java/com/king/zxing/app/CustomCaptureActivity.java
@@ -21,7 +21,7 @@ import android.widget.TextView;
import android.widget.Toast;
import com.google.zxing.Result;
-import com.king.zxing.CameraConfig;
+import com.king.zxing.config.CameraConfig;
import com.king.zxing.CaptureActivity;
import com.king.zxing.DecodeConfig;
import com.king.zxing.DecodeFormatManager;
diff --git a/zxing-lite/src/main/java/com/king/zxing/CameraScan.java b/zxing-lite/src/main/java/com/king/zxing/CameraScan.java
index 26ee8bf..bd6e3ae 100644
--- a/zxing-lite/src/main/java/com/king/zxing/CameraScan.java
+++ b/zxing-lite/src/main/java/com/king/zxing/CameraScan.java
@@ -10,6 +10,7 @@ import com.king.zxing.analyze.AreaRectAnalyzer;
import com.king.zxing.analyze.BarcodeFormatAnalyzer;
import com.king.zxing.analyze.ImageAnalyzer;
import com.king.zxing.analyze.MultiFormatAnalyzer;
+import com.king.zxing.config.CameraConfig;
import androidx.annotation.Nullable;
import androidx.camera.core.CameraSelector;
diff --git a/zxing-lite/src/main/java/com/king/zxing/DecodeConfig.java b/zxing-lite/src/main/java/com/king/zxing/DecodeConfig.java
index 3e4ec5e..0cdc18b 100644
--- a/zxing-lite/src/main/java/com/king/zxing/DecodeConfig.java
+++ b/zxing-lite/src/main/java/com/king/zxing/DecodeConfig.java
@@ -6,6 +6,7 @@ import com.google.zxing.BarcodeFormat;
import com.google.zxing.DecodeHintType;
import com.google.zxing.common.GlobalHistogramBinarizer;
import com.google.zxing.common.HybridBinarizer;
+import com.king.zxing.config.CameraConfig;
import java.util.Map;
diff --git a/zxing-lite/src/main/java/com/king/zxing/DefaultCameraScan.java b/zxing-lite/src/main/java/com/king/zxing/DefaultCameraScan.java
index 37071ba..666b901 100644
--- a/zxing-lite/src/main/java/com/king/zxing/DefaultCameraScan.java
+++ b/zxing-lite/src/main/java/com/king/zxing/DefaultCameraScan.java
@@ -4,7 +4,6 @@ import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.util.DisplayMetrics;
-import android.util.Size;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;
@@ -16,6 +15,7 @@ import com.google.zxing.ResultPoint;
import com.google.zxing.common.detector.MathUtils;
import com.king.zxing.analyze.Analyzer;
import com.king.zxing.analyze.MultiFormatAnalyzer;
+import com.king.zxing.config.CameraConfig;
import com.king.zxing.manager.AmbientLightManager;
import com.king.zxing.manager.BeepManager;
import com.king.zxing.util.LogUtils;
@@ -98,7 +98,6 @@ public class DefaultCameraScan extends CameraScan {
private boolean isClickTap;
private float mDownX;
private float mDownY;
- private Size mTargetSize;
public DefaultCameraScan(@NonNull FragmentActivity activity,@NonNull PreviewView previewView){
this.mFragmentActivity = activity;
@@ -155,23 +154,6 @@ public class DefaultCameraScan extends CameraScan {
mScreenHeight = displayMetrics.heightPixels;
LogUtils.d(String.format("displayMetrics:%dx%d",mScreenWidth,mScreenHeight));
- //因为为了保持流畅性和性能,限制在1080p,在此前提下尽可能的找到屏幕接近的分辨率
- if(mScreenWidth < mScreenHeight){
- float ratio = mScreenWidth / (float)mScreenHeight;
- if(ratio > 0.7){//一般应用于平板
- mTargetSize = new Size(mScreenWidth,mScreenWidth / 3 * 4);
- }else{
- mTargetSize = new Size(mScreenWidth,mScreenWidth / 9 * 16);
- }
- }else{
- float ratio = mScreenHeight / (float)mScreenWidth;
- if(ratio > 0.7){//一般应用于平板
- mTargetSize = new Size(mScreenHeight / 3 * 4, mScreenHeight);
- }else{
- mTargetSize = new Size(mScreenHeight / 9 * 16, mScreenHeight);
- }
- }
- LogUtils.d("targetSize:" + mTargetSize);
mBeepManager = new BeepManager(mContext);
mAmbientLightManager = new AmbientLightManager(mContext);
@@ -250,8 +232,7 @@ public class DefaultCameraScan extends CameraScan {
mCameraProviderFuture.addListener(() -> {
try{
- Preview preview = mCameraConfig.options(new Preview.Builder()
- .setTargetResolution(mTargetSize));
+ Preview preview = mCameraConfig.options(new Preview.Builder());
//相机选择器
CameraSelector cameraSelector = mCameraConfig.options(new CameraSelector.Builder());
@@ -260,7 +241,6 @@ public class DefaultCameraScan extends CameraScan {
//图像分析
ImageAnalysis imageAnalysis = mCameraConfig.options(new ImageAnalysis.Builder()
- .setTargetResolution(mTargetSize)
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST));
imageAnalysis.setAnalyzer(Executors.newSingleThreadExecutor(), image -> {
if(isAnalyze && !isAnalyzeResult && mAnalyzer != null){
diff --git a/zxing-lite/src/main/java/com/king/zxing/config/AspectRatioCameraConfig.java b/zxing-lite/src/main/java/com/king/zxing/config/AspectRatioCameraConfig.java
new file mode 100644
index 0000000..bdabd49
--- /dev/null
+++ b/zxing-lite/src/main/java/com/king/zxing/config/AspectRatioCameraConfig.java
@@ -0,0 +1,62 @@
+package com.king.zxing.config;
+
+import android.content.Context;
+import android.util.DisplayMetrics;
+
+
+import com.king.zxing.util.LogUtils;
+
+import androidx.annotation.NonNull;
+import androidx.camera.core.AspectRatio;
+import androidx.camera.core.CameraSelector;
+import androidx.camera.core.ImageAnalysis;
+import androidx.camera.core.Preview;
+
+/**
+ * 相机配置:根据纵横比配置相机,使预览和输出的图像尽可能的接近屏幕比例
+ * @author Jenly
+ */
+public final class AspectRatioCameraConfig extends CameraConfig {
+
+ private int mAspectRatio;
+
+ public AspectRatioCameraConfig(Context context) {
+ super();
+
+ DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
+ int width = displayMetrics.widthPixels;
+ int height = displayMetrics.heightPixels;
+
+ mAspectRatio = aspectRatio(width, height);
+ LogUtils.d("aspectRatio:" + mAspectRatio);
+
+ }
+
+ private int aspectRatio(float width, float height){
+ float ratio = Math.max(width, height) / Math.min(width, height);
+ if (Math.abs(ratio - 4.0f / 3.0f) < Math.abs(ratio - 16.0f / 9.0f)) {
+ return AspectRatio.RATIO_4_3;
+ }
+ return AspectRatio.RATIO_16_9;
+ }
+
+ @NonNull
+ @Override
+ public Preview options(@NonNull Preview.Builder builder) {
+ builder.setTargetAspectRatio(mAspectRatio);
+ return super.options(builder);
+ }
+
+ @NonNull
+ @Override
+ public CameraSelector options(@NonNull CameraSelector.Builder builder) {
+ return super.options(builder);
+ }
+
+ @NonNull
+ @Override
+ public ImageAnalysis options(@NonNull ImageAnalysis.Builder builder) {
+ builder.setTargetAspectRatio(mAspectRatio);
+ return super.options(builder);
+ }
+}
diff --git a/zxing-lite/src/main/java/com/king/zxing/CameraConfig.java b/zxing-lite/src/main/java/com/king/zxing/config/CameraConfig.java
similarity index 96%
rename from zxing-lite/src/main/java/com/king/zxing/CameraConfig.java
rename to zxing-lite/src/main/java/com/king/zxing/config/CameraConfig.java
index 1457415..8a36749 100644
--- a/zxing-lite/src/main/java/com/king/zxing/CameraConfig.java
+++ b/zxing-lite/src/main/java/com/king/zxing/config/CameraConfig.java
@@ -1,4 +1,4 @@
-package com.king.zxing;
+package com.king.zxing.config;
import androidx.annotation.NonNull;
import androidx.camera.core.CameraSelector;
diff --git a/zxing-lite/src/main/java/com/king/zxing/config/ResolutionCameraConfig.java b/zxing-lite/src/main/java/com/king/zxing/config/ResolutionCameraConfig.java
new file mode 100644
index 0000000..097cdd8
--- /dev/null
+++ b/zxing-lite/src/main/java/com/king/zxing/config/ResolutionCameraConfig.java
@@ -0,0 +1,73 @@
+package com.king.zxing.config;
+
+import android.content.Context;
+import android.util.DisplayMetrics;
+import android.util.Size;
+
+
+import com.king.zxing.util.LogUtils;
+
+import androidx.annotation.NonNull;
+import androidx.camera.core.CameraSelector;
+import androidx.camera.core.ImageAnalysis;
+import androidx.camera.core.Preview;
+
+/**
+ * 相机配置:根据尺寸配置相机的目标图像,使预览和输出的图像尽可能的接近屏幕尺寸
+ * @author Jenly
+ */
+public class ResolutionCameraConfig extends CameraConfig {
+
+ private Size mTargetSize;
+
+ public ResolutionCameraConfig(Context context) {
+ super();
+
+ DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
+ int width = displayMetrics.widthPixels;
+ int height = displayMetrics.heightPixels;
+
+ LogUtils.d(String.format("displayMetrics:%d x %d",width,height));
+ //因为为了保持流畅性和性能,限制在1080p,在此前提下尽可能的找到屏幕接近的分辨率
+ if(width < height){
+ int size = Math.min(width, 1080);
+ float ratio = width / (float)height;
+ if(ratio > 0.7){//一般应用于平板
+ mTargetSize = new Size(size, (int)(size / 3.0f * 4.0f));
+ }else{
+ mTargetSize = new Size(size, (int)(size / 9.0f * 16.0f));
+ }
+ }else{
+ int size = Math.min(height, 1080);
+ float ratio = height / (float)width;
+ if(ratio > 0.7){//一般应用于平板
+ mTargetSize = new Size((int)(size / 3.0f * 4.0f), size);
+ }else{
+ mTargetSize = new Size((int)(size / 9.0f * 16.0), size);
+ }
+ }
+ LogUtils.d("targetSize:" + mTargetSize);
+ }
+
+
+
+ @NonNull
+ @Override
+ public Preview options(@NonNull Preview.Builder builder) {
+ builder.setTargetResolution(mTargetSize);
+ return super.options(builder);
+ }
+
+ @NonNull
+ @Override
+ public CameraSelector options(@NonNull CameraSelector.Builder builder) {
+ return super.options(builder);
+ }
+
+ @NonNull
+ @Override
+ public ImageAnalysis options(@NonNull ImageAnalysis.Builder builder) {
+ builder.setTargetResolution(mTargetSize);
+ return super.options(builder);
+ }
+}