現状
Xamarin.Formsを使用しています。
ZXingを使ってQRコードを読み取るページを作成しています。
C#
1Page ScanPage() 2 { 3 var scanner = new ZXingScannerView 4 { 5 Options = new ZXing.Mobile.MobileBarcodeScanningOptions 6 { 7 TryHarder = true, 8 PossibleFormats = new List<ZXing.BarcodeFormat> { ZXing.BarcodeFormat.QR_CODE }, 9 }, 10 IsScanning = true, 11 IsAnalyzing = true, 12 13 }; 14 var label = new Label 15 { 16 VerticalOptions = LayoutOptions.Start, 17 }; 18 var grid = new Grid(); 19 grid.Children.Add(scanner, 0, 0); 20 grid.Children.Add(new StackLayout 21 { 22 BackgroundColor = Color.White, 23 Children = { label, }, 24 }, 0, 1); 25 var page = new ContentPage 26 { 27 Content = grid 28 }; 29 scanner.OnScanResult += result => 30 { 31 Device.BeginInvokeOnMainThread(() => 32 { 33 label.Text = result.Text; 34 page.DisplayAlert("result", result.Text, "OK"); 35 }); 36 }; 37 return page; 38 }
よみとった内容に応じて下側に内容を表示するため、表示部分は常に表示されている状態です。
困っていること
もともとは、ZXingScannerPageを使用して上にLayoutを重ねたりして表示していたのですが、上に表示したLayoutに隠れている部分にあるQRコードが認識されてしまうため、ZXingScannerViewを使用してカメラ部分は隠れないように配置しようと考えました。
上記のようなコードでは、IOSでは問題なく表示され想定通りなのですが、Androidではカメラ部分の表示しているサイズに合わせて縮小されてしまいます。
下記スクリーンショットはわかりやすくディスクを表示しています。
解決したいこと
Androidで画面の一部にカメラの表示ビューがある場合でもできる限り元のアスペクト比で表示する。
または、Layoutを上に配置している場合に、何か目で見えている範囲を指定したらその部分しか認識対象にならないような設定などがあれば、その方法で解決したいです。
追記
amay077さんの回答を受け座標位置で判定しようと考えました。
ResultPointsはQRコードを認識した4か所の四角の位置が返ってくるらしく、そこから判定できるかと思い、試しに画面右下で認識させて返ってくる値を確認したところ、
IOSでは画面サイズに近い値が返ってきましたが、Androidでは設定されている解像度のためか、画面サイズを超える値が返ってきました。