質問: result.Text; page.DisplayAlert("result", result.Text, "OK"); }); }; return page; } ``` よみとった内容に応じて下側に内容を表示するため、表示部分は常に表示されている状態です。 困っていること ------- もともとは、ZXingScannerPageを使用して上にLayoutを重ねたりして表示していたのですが、上に表示したLayoutに隠れている部分にあるQRコードが認識されてしまうため、ZXingScannerViewを使用してカメラ部分は隠れないように配置しようと考えました。 上記のようなコードでは、IOSでは問題なく表示され想定通りなのですが、Androidではカメラ部分の表示しているサイズに合わせて縮小されてしまいます。 下記スクリーンショットはわかりやすくディスクを表示しています。 ![Androidスクリーンショット](https://teratail.storage.googleapis.com/uploads/contributed_images/94251c0ae215b7d17ad3a5dbd9b22394.png) ![IOSスクリーンショット](https://teratail.storage.googleapis.com/uploads/contributed_images/c7024ed477a865d3ea45fb2ae57fe543.png) 解決したいこと ------- Androidで画面の一部にカメラの表示ビューがある場合でもできる限り元のアスペクト比で表示する。 または、Layoutを上に配置している場合に、何か目で見えている範囲を指定したらその部分しか認識対象にならないような設定などがあれば、その方法で解決したいです。 追記 -- amay077さんの回答を受け座標位置で判定しようと考えました。 ResultPointsはQRコードを認識した4か所の四角の位置が返ってくるらしく、そこから判定できるかと思い、試しに画面右下で認識させて返ってくる値を確認したところ、 IOSでは画面サイズに近い値が返ってきましたが、Androidでは設定されている解像度のためか、画面サイズを超える値が返ってきました。
回答: > > または、Layoutを上に配置している場合に、何か目で見えている範囲を指定したらその部分しか認識対象にならないような設定などがあれば、その方法で解決したいです。 > > > についてですが。 * Study/XFP_ZXingSample at master · ytabuchi/Study のサンプル(これは `ZXingScannerPage` を使っています)を例にして説明します。 このサンプルでスキャン画面を起動すると、 ! のように、中心部分だけカメラ画像が表示され、上下はマスクされているように見えます。 が、実際には上下の透過でマスクされた部分でも QR コードは認識します。 > > 上に表示したLayoutに隠れている部分にあるQRコードが認識されてしまう > > > とは、こういう認識で良いかと思います。 では、「目的の範囲でしか認識させたくない」を実現する方法ですがー 以下は、前述のサンプルの「スキャン結果を受け取る」イベントハンドラです。 ``` scanPage.OnScanResult += (result) => { // スキャン停止 scanPage.IsScanning = false; // PopAsyncで元のページに戻り、結果をダイアログで表示 Device.BeginInvokeOnMainThread(async () => { await Navigation.PopAsync(); await DisplayAlert("スキャン完了", result.Text, "OK"); }); }; ``` ここで、 結果である `result` に注目します。これは `ZXing.Result` 型であり、 `ResultPoints` プロパティを持っています。 これは、「QRコードを認識した座標」を返すようなので、これを利用して、「QRコードを認識した座標が目的の範囲外だったら、認識をやめない(結果を使用しない)」とすることができます。 例えば以下の例は、「QRコードを認識したY座標の値が500未満なら、認識をやめない」というものです。 ``` scanPage.OnScanResult += (result) => { // QRコードのY座標値が500未満なら無視する if (result.ResultPoints[0].Y < 500) { return; } // スキャン停止 scanPage.IsScanning = false; // PopAsyncで元のページに戻り、結果をダイアログで表示 Device.BeginInvokeOnMainThread(async () => { await Navigation.PopAsync(); await DisplayAlert("スキャン完了", result.Text, "OK"); }); }; ``` この結果、画面の上部にQRコードが表示されても、アプリとして認識されたことにはなりません。 このようにすることで、「目的の範囲でしか認識させたくない」を実現することができるとおもいます。