新增 AspectRatioCameraConfig 和 ResolutionCameraConfig
This commit is contained in:
@@ -21,7 +21,7 @@ import android.widget.TextView;
|
|||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import com.google.zxing.Result;
|
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.CaptureActivity;
|
||||||
import com.king.zxing.DecodeConfig;
|
import com.king.zxing.DecodeConfig;
|
||||||
import com.king.zxing.DecodeFormatManager;
|
import com.king.zxing.DecodeFormatManager;
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import com.king.zxing.analyze.AreaRectAnalyzer;
|
|||||||
import com.king.zxing.analyze.BarcodeFormatAnalyzer;
|
import com.king.zxing.analyze.BarcodeFormatAnalyzer;
|
||||||
import com.king.zxing.analyze.ImageAnalyzer;
|
import com.king.zxing.analyze.ImageAnalyzer;
|
||||||
import com.king.zxing.analyze.MultiFormatAnalyzer;
|
import com.king.zxing.analyze.MultiFormatAnalyzer;
|
||||||
|
import com.king.zxing.config.CameraConfig;
|
||||||
|
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.camera.core.CameraSelector;
|
import androidx.camera.core.CameraSelector;
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import com.google.zxing.BarcodeFormat;
|
|||||||
import com.google.zxing.DecodeHintType;
|
import com.google.zxing.DecodeHintType;
|
||||||
import com.google.zxing.common.GlobalHistogramBinarizer;
|
import com.google.zxing.common.GlobalHistogramBinarizer;
|
||||||
import com.google.zxing.common.HybridBinarizer;
|
import com.google.zxing.common.HybridBinarizer;
|
||||||
|
import com.king.zxing.config.CameraConfig;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import android.app.Activity;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.util.DisplayMetrics;
|
import android.util.DisplayMetrics;
|
||||||
import android.util.Size;
|
|
||||||
import android.view.MotionEvent;
|
import android.view.MotionEvent;
|
||||||
import android.view.ScaleGestureDetector;
|
import android.view.ScaleGestureDetector;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
@@ -16,6 +15,7 @@ import com.google.zxing.ResultPoint;
|
|||||||
import com.google.zxing.common.detector.MathUtils;
|
import com.google.zxing.common.detector.MathUtils;
|
||||||
import com.king.zxing.analyze.Analyzer;
|
import com.king.zxing.analyze.Analyzer;
|
||||||
import com.king.zxing.analyze.MultiFormatAnalyzer;
|
import com.king.zxing.analyze.MultiFormatAnalyzer;
|
||||||
|
import com.king.zxing.config.CameraConfig;
|
||||||
import com.king.zxing.manager.AmbientLightManager;
|
import com.king.zxing.manager.AmbientLightManager;
|
||||||
import com.king.zxing.manager.BeepManager;
|
import com.king.zxing.manager.BeepManager;
|
||||||
import com.king.zxing.util.LogUtils;
|
import com.king.zxing.util.LogUtils;
|
||||||
@@ -98,7 +98,6 @@ public class DefaultCameraScan extends CameraScan {
|
|||||||
private boolean isClickTap;
|
private boolean isClickTap;
|
||||||
private float mDownX;
|
private float mDownX;
|
||||||
private float mDownY;
|
private float mDownY;
|
||||||
private Size mTargetSize;
|
|
||||||
|
|
||||||
public DefaultCameraScan(@NonNull FragmentActivity activity,@NonNull PreviewView previewView){
|
public DefaultCameraScan(@NonNull FragmentActivity activity,@NonNull PreviewView previewView){
|
||||||
this.mFragmentActivity = activity;
|
this.mFragmentActivity = activity;
|
||||||
@@ -155,23 +154,6 @@ public class DefaultCameraScan extends CameraScan {
|
|||||||
mScreenHeight = displayMetrics.heightPixels;
|
mScreenHeight = displayMetrics.heightPixels;
|
||||||
|
|
||||||
LogUtils.d(String.format("displayMetrics:%dx%d",mScreenWidth,mScreenHeight));
|
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);
|
mBeepManager = new BeepManager(mContext);
|
||||||
mAmbientLightManager = new AmbientLightManager(mContext);
|
mAmbientLightManager = new AmbientLightManager(mContext);
|
||||||
@@ -250,8 +232,7 @@ public class DefaultCameraScan extends CameraScan {
|
|||||||
mCameraProviderFuture.addListener(() -> {
|
mCameraProviderFuture.addListener(() -> {
|
||||||
|
|
||||||
try{
|
try{
|
||||||
Preview preview = mCameraConfig.options(new Preview.Builder()
|
Preview preview = mCameraConfig.options(new Preview.Builder());
|
||||||
.setTargetResolution(mTargetSize));
|
|
||||||
|
|
||||||
//相机选择器
|
//相机选择器
|
||||||
CameraSelector cameraSelector = mCameraConfig.options(new CameraSelector.Builder());
|
CameraSelector cameraSelector = mCameraConfig.options(new CameraSelector.Builder());
|
||||||
@@ -260,7 +241,6 @@ public class DefaultCameraScan extends CameraScan {
|
|||||||
|
|
||||||
//图像分析
|
//图像分析
|
||||||
ImageAnalysis imageAnalysis = mCameraConfig.options(new ImageAnalysis.Builder()
|
ImageAnalysis imageAnalysis = mCameraConfig.options(new ImageAnalysis.Builder()
|
||||||
.setTargetResolution(mTargetSize)
|
|
||||||
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST));
|
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST));
|
||||||
imageAnalysis.setAnalyzer(Executors.newSingleThreadExecutor(), image -> {
|
imageAnalysis.setAnalyzer(Executors.newSingleThreadExecutor(), image -> {
|
||||||
if(isAnalyze && !isAnalyzeResult && mAnalyzer != null){
|
if(isAnalyze && !isAnalyzeResult && mAnalyzer != null){
|
||||||
|
|||||||
@@ -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 <a href="mailto:jenly1314@gmail.com">Jenly</a>
|
||||||
|
*/
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.king.zxing;
|
package com.king.zxing.config;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.camera.core.CameraSelector;
|
import androidx.camera.core.CameraSelector;
|
||||||
@@ -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 <a href="mailto:jenly1314@gmail.com">Jenly</a>
|
||||||
|
*/
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user