关于#xamarin#扫码的问题,如何解决?有没有CustomOverlay属性?

xamarin.forms用Zxing 2.4.1开发安卓扫码程序时,我想指定屏幕上的一块为解码区域,以规避对象有多个二维码时目标不明确的问题,ChatGPT上总是提到使用CustomOverlay,于是我调用自己定义的zxingscanview,加上一些boxview,作遮蔽,实质上没用,zxing仍然是全屏解码,他似乎是从摄像头拿数据,而不是从屏幕,最后的结果总是给出屏幕最右下角的一个二维码结果,怎么才能指定扫码区域?

基于new bing的回答
可能的原因和解决方法有:

【1】您没有正确地引用ZXing.Net.Mobile.Forms命名空间,导致VS无法识别CustomOverlay属性。您可以在您的代码文件中添加using ZXing.Net.Mobile.Forms;语句,或者在XAML文件中添加xmlns:zxing="clr-namespace:ZXing.Net.Mobile.Forms;assembly=ZXing.Net.Mobile.Forms"属性。
【2】您没有正确地设置CustomOverlay属性的值,导致VS无法识别您的自定义视图。您需要创建一个继承自View的类,例如ZxingOverlayView,并将其实例赋值给CustomOverlay属性,例如scanner.CustomOverlay = new ZxingOverlayView(this, scanner);。
【3】您没有正确地设置UseCustomOverlay属性的值,导致VS无法启用您的自定义视图。您需要将UseCustomOverlay属性设置为true,例如scanner.UseCustomOverlay = true;。
【4】您可以参考以下链接来了解更多关于Zxing 2.4.1和CustomOverlay的用法和示例:

https://stackoverflow.com/questions/57303386/how-to-create-and-implement-a-android-customoverlay-for-zxing-scanner
https://stackoverflow.com/questions/56189090/how-do-i-add-a-custom-overlay-for-zxingscannerview-in-xamarin-forms-using-the-mv
https://github.com/Redth/ZXing.Net.Mobile
https://social.msdn.microsoft.com/Forums/en-US/5792b06f-4672-4f84-94bd-9c14a232b23e/text-overlay-on-full-screen-zxing-barcodescanner?forum=xamarinforms
希望这能帮到您。👍可以的话采纳

该回答参考ChatGPT:
在 Xamarin.Forms 中使用 ZXing 2.4.1 的时候,可以通过自定义视图实现扫码程序的定制。为了实现在屏幕上指定一块解码区域,可以创建一个自定义的视图,将其作为 ZXingScannerView 的子视图,并设置其位置和大小。在这个自定义的视图中,可以添加任何你想要的 UI 元素,包括矩形、文本标签等等。

要创建自定义视图,可以使用 Xamarin.Forms 中的绘图 API,例如 BoxView、Label 等等。下面是一个示例代码片段,演示如何创建一个矩形作为解码区域:

var overlay = new AbsoluteLayout();
var rect = new BoxView
{
    BackgroundColor = Color.Transparent,
    BorderColor = Color.White,
    BorderWidth = 2,
};
overlay.Children.Add(rect, new Rectangle(0.2, 0.2, 0.6, 0.6), AbsoluteLayoutFlags.All);

var scannerView = new ZXingScannerView
{
    HorizontalOptions = LayoutOptions.FillAndExpand,
    VerticalOptions = LayoutOptions.FillAndExpand,
    AutomationId = "zxingScannerView",
};
scannerView.Options = new MobileBarcodeScanningOptions
{
    UseCustomOverlay = true,
};
scannerView.CustomOverlay = overlay;

在上面的代码中,我们首先创建了一个 AbsoluteLayout,然后在其中添加了一个 BoxView,作为解码区域的矩形。接着,我们将 BoxView 添加到了 ZXingScannerView 的 CustomOverlay 属性中,以此来自定义扫码程序的界面。

需要注意的是,CustomOverlay 是 ZXingScannerView 的一个属性,而不是 CustomOverlay 类的一个属性。因此,如果你在代码中出现了类似“ZXingScannerView”未包含“CustomOverlay”的定义的提示,可能是因为你没有正确地引用 ZXingScannerView 类。

如果你在 Visual Studio 中使用 NuGet 安装了 ZXing,你应该可以正常地访问 ZXingScannerView 和其属性。如果你仍然无法访问 CustomOverlay 属性,你可以尝试升级 ZXing 的版本或者重新安装 ZXing。

我发现,既使我使用了customoverlay,并将背景设置为不透明,遮住了二维码,仍然不影响Zxing的解码,似乎Zxing解码是直接坐镜头拿数据,你在屏上加什么遮盖都没用,怎么破?

该回答引用ChatGPT
在 Xamarin.Forms 中使用 Zxing 2.4.1 进行扫码时,可以通过自定义 Overlay 来指定扫码区域。具体实现步骤如下:
1. 创建一个自定义视图,用于作为 Overlay。这个视图可以包含一些 BoxView,用于遮蔽不需要扫描的区域。例如:
csharp
public class CustomOverlay : ContentView
{
public CustomOverlay()
{
var overlayColor = Color.FromRgba(0, 0, 0, 128);
var topBox = new BoxView { BackgroundColor = overlayColor };
var bottomBox = new BoxView { BackgroundColor = overlayColor };
var leftBox = new BoxView { BackgroundColor = overlayColor };
var rightBox = new BoxView { BackgroundColor = overlayColor };
Content = new Grid
{
Children =
{
topBox,
bottomBox,
leftBox,
rightBox
}
};
// 设置 BoxView 的位置和大小
topBox.SetValue(Grid.RowProperty, 0);
topBox.SetValue(Grid.ColumnSpanProperty, 2);
bottomBox.SetValue(Grid.RowProperty, 2);
bottomBox.SetValue(Grid.ColumnSpanProperty, 2);
leftBox.SetValue(Grid.RowProperty, 1);
leftBox.SetValue(Grid.ColumnProperty, 0);
rightBox.SetValue(Grid.RowProperty, 1);
rightBox.SetValue(Grid.ColumnProperty, 1);
}
}

2. 在扫码页面中,使用自定义视图作为 Overlay。例如:
csharp
var scanPage = new ZXingScannerPage
{
// 设置 Overlay
CustomOverlay = new CustomOverlay()
};
// 打开扫码页面
await Navigation.PushAsync(scanPage);

这样就可以在扫码页面上显示自定义的 Overlay,从而指定扫码区域。注意,这种方式只是遮蔽了不需要扫描的区域,而不是真正限制了扫码区域。如果需要限制扫码区域,可以在扫码页面的扫码回调中进行判断。
参考代码如下:
csharp
var scanPage = new ZXingScannerPage
{
// 设置 Overlay
CustomOverlay = new CustomOverlay()
};
// 设置扫码回调
scanPage.OnScanResult += (result) =>
{
// 判断扫描结果是否在指定区域内
var overlay = scanPage.CustomOverlay as CustomOverlay;
var overlayBounds = overlay.Bounds;
var resultBounds = result.ResultPoints.Select(p => new Point(p.X, p.Y));
if (!overlayBounds.Contains(resultBounds))
{
// 不在指定区域内,继续扫描
scanPage.IsScanning = true;
return;
}
// 在指定区域内,处理扫描结果
// ...
};
// 打开扫码页面
await Navigation.PushAsync(scanPage);

引用chatGPT作答,您可以尝试通过在扫描器启动时设置扫描区域来指定zxing解码的区域。在Xamarin.Forms中,您可以使用CustomOverlay来自定义扫描视图并添加一个扫描区域。

以下是一些步骤,以指定ZXing解码区域:

1.创建一个自定义视图,用于扫描区域,例如ScanView。

public class ScanView : ContentView
{
    public ScanView()
    {
        //添加扫描区域的boxview或者其他视图
        // ...
    }
}

2.在您的页面中,将ZXingScannerView与自定义视图结合使用。在这里,我们将自定义的扫描区域添加到ZXingScannerView的Overlay上。

public class MyPage : ContentPage
{
    public MyPage()
    {
        var zxing = new ZXingScannerView
        {
            //将自定义视图添加到Overlay上
            Overlay = new ScanView()
        };

        //设置扫描器的Options, ScanArea是用于设置扫描区域的属性
        zxing.Options = new MobileBarcodeScanningOptions
        {
            ScanArea = new Xamarin.Forms.Rectangle(0.2, 0.2, 0.6, 0.6) //示例:设置为屏幕中央的一个正方形
        };

        //添加扫描器到页面上
        Content = zxing;
    }
}

在上面的代码中,我们使用MobileBarcodeScanningOptions中的ScanArea属性来指定扫描区域。您可以根据自己的需要调整ScanArea的大小和位置。

这样设置后,ZXingScannerView仅在指定的区域中解码二维码,从而避免了多个二维码时的目标不明确问题。