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); + } +}