diff --git a/sample/src/main/res/layout/capture_appcompat.xml b/sample/src/main/res/layout/capture_appcompat.xml index 444f4119d..c62f1579c 100644 --- a/sample/src/main/res/layout/capture_appcompat.xml +++ b/sample/src/main/res/layout/capture_appcompat.xml @@ -38,6 +38,7 @@ android:layout_below="@+id/my_awesome_toolbar" android:layout_alignParentBottom="true" android:id="@+id/zxing_barcode_scanner" + app:zxing_framing_offset_y="100dp" app:zxing_use_texture_view="true"/> diff --git a/sample/src/main/res/layout/capture_small.xml b/sample/src/main/res/layout/capture_small.xml index efe2d4a2e..944e23d4c 100644 --- a/sample/src/main/res/layout/capture_small.xml +++ b/sample/src/main/res/layout/capture_small.xml @@ -33,6 +33,7 @@ android:layout_marginTop="150dp" android:layout_marginBottom="150dp" android:id="@+id/zxing_barcode_scanner" + app:zxing_framing_offset_y_ratio="0.32" app:zxing_use_texture_view="false" app:zxing_preview_scaling_strategy="fitXY"/> diff --git a/zxing-android-embedded/res/values/zxing_attrs.xml b/zxing-android-embedded/res/values/zxing_attrs.xml index 70eaece1a..e715f94da 100755 --- a/zxing-android-embedded/res/values/zxing_attrs.xml +++ b/zxing-android-embedded/res/values/zxing_attrs.xml @@ -8,6 +8,8 @@ + + diff --git a/zxing-android-embedded/src/com/journeyapps/barcodescanner/CameraPreview.java b/zxing-android-embedded/src/com/journeyapps/barcodescanner/CameraPreview.java index f96f613be..98ed29830 100644 --- a/zxing-android-embedded/src/com/journeyapps/barcodescanner/CameraPreview.java +++ b/zxing-android-embedded/src/com/journeyapps/barcodescanner/CameraPreview.java @@ -8,7 +8,6 @@ import android.graphics.Matrix; import android.graphics.Rect; import android.graphics.SurfaceTexture; -import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; @@ -139,6 +138,12 @@ public interface StateListener { // must be smaller than 0.5; private double marginFraction = 0.1d; + // Frame rectangle Y axis offset + private int framingOffsetY; + + // Frame rectangle Y axis offset percentage + private float framingOffsetYRatio = 0.5f; + private PreviewScalingStrategy previewScalingStrategy = null; private boolean torchOn = false; @@ -276,6 +281,13 @@ protected void initializeAttributes(AttributeSet attrs) { this.framingRectSize = new Size(framingRectWidth, framingRectHeight); } + this.framingOffsetY = styledAttributes.getDimensionPixelSize(R.styleable.zxing_camera_preview_zxing_framing_offset_y, -1); + + float framingOffsetYRatio = styledAttributes.getFloat(R.styleable.zxing_camera_preview_zxing_framing_offset_y_ratio, 0.5f); + if (framingOffsetYRatio >= 0.0f && framingOffsetYRatio <= 1.0f) { + this.framingOffsetYRatio = framingOffsetYRatio; + } + this.useTextureView = styledAttributes.getBoolean(R.styleable.zxing_camera_preview_zxing_use_texture_view, true); // See zxing_attrs.xml for the enum values @@ -840,6 +852,14 @@ protected Rect calculateFramingRect(Rect container, Rect surface) { int horizontalMargin = Math.max(0, (intersection.width() - framingRectSize.width) / 2); int verticalMargin = Math.max(0, (intersection.height() - framingRectSize.height) / 2); intersection.inset(horizontalMargin, verticalMargin); + + // Y axis offset + if (framingOffsetY == -1) { + intersection.offset(0, (int) ((container.height() - intersection.height()) * framingOffsetYRatio - verticalMargin)); + } else { + intersection.offset(0, framingOffsetY - verticalMargin); + } + return intersection; } // margin as 10% (default) of the smaller of width, height @@ -849,6 +869,14 @@ protected Rect calculateFramingRect(Rect container, Rect surface) { // We don't want a frame that is taller than wide. intersection.inset(0, (intersection.height() - intersection.width()) / 2); } + + // Y axis offset + if (framingOffsetY == -1) { + intersection.offset(0, (int) ((container.height() - intersection.height()) * (framingOffsetYRatio - 0.5f))); + } else { + intersection.offset(0, (int) (framingOffsetY - ((container.height() - intersection.height()) * 0.5f))); + } + return intersection; }