Как передать метод функциональности xamarin. android Speci c в xamarin.forms, используя DependencyService и делегат интерфейса? - PullRequest
1 голос
/ 26 января 2020

Я использую следующий ресурс https://msicc.net/how-to-avoid-a-distorted-android-camera-preview-with-zxing-net-mobile/, чтобы решить проблему искажения сканера штрих-кода zxing. Я пришел к точке, где метод SelectLowestResolutionMatchingDisplayAspectRatio реализован в проекте android, но мне нужно передать его CameraResolutionSelectorDelegate, как заявил автор. Для этого я создал интерфейс под названием IZXingHelper, который должен содержать делегата, который я до сих пор не знаю, как это должно быть написано. Позвольте мне поделиться своим фрагментом кода и объяснить, где я столкнулся с проблемой.

public class ZxingHelperAndroid : IZXingHelper
    {

     //What code goes here?

        public CameraResolution SelectLowestResolutionMatchingDisplayAspectRatio(List<CameraResolution> availableResolutions)
        {
            CameraResolution result = null;
            //a tolerance of 0.1 should not be visible to the user
            double aspectTolerance = 0.1;
            var displayOrientationHeight = DeviceDisplay.MainDisplayInfo.Orientation == DisplayOrientation.Portrait ? DeviceDisplay.MainDisplayInfo.Height : DeviceDisplay.MainDisplayInfo.Width;
            var displayOrientationWidth = DeviceDisplay.MainDisplayInfo.Orientation == DisplayOrientation.Portrait ? DeviceDisplay.MainDisplayInfo.Width : DeviceDisplay.MainDisplayInfo.Height;
            //calculatiing our targetRatio
            var targetRatio = displayOrientationHeight / displayOrientationWidth;
            var targetHeight = displayOrientationHeight;
            var minDiff = double.MaxValue;
            //camera API lists all available resolutions from highest to lowest, perfect for us
            //making use of this sorting, following code runs some comparisons to select the lowest resolution that matches the screen aspect ratio and lies within tolerance
            //selecting the lowest makes Qr detection actual faster most of the time
            foreach (var r in availableResolutions.Where(r => Math.Abs(((double)r.Width / r.Height) - targetRatio) < aspectTolerance))
            {
                //slowly going down the list to the lowest matching solution with the correct aspect ratio
                if (Math.Abs(r.Height - targetHeight) < minDiff)
                    minDiff = Math.Abs(r.Height - targetHeight);
                result = r;
            }
            return result;
        }
    }

и здесь, где именно я не мог определить, что написать, чтобы понять это правильно:

zxing.Options = new ZXing.Mobile.MobileBarcodeScanningOptions
            {
                CameraResolutionSelector = DependencyService.Get<IZXingHelper>().CameraResolutionSelectorDelegateImplementation
            };
public interface IZXingHelper
{
 //What code goes here?
}

Я не знаю, как реализовать CameraResolutionSelectorDelegateImplementation в интерфейсе и как связать его с методом SelectLowestResolutionMatchingDisplayAspectRatio объекта ZxingHelper Android.

1 Ответ

1 голос
/ 27 января 2020

Создайте интерфейс IZXingHelper в демоверсии Xamarin.forms.

public interface IZXingHelper
{
    //CameraResolutionSelectorDelegateImplementation
    CameraResolution SelectLowestResolutionMatchingDisplayAspectRatio(List<CameraResolution> availableResolutions);
}

Создайте ZXingHelper.cs в проекте. Android для его реализации.

using System;
using System.Collections.Generic;
using System.Linq;
using Xamarin.Essentials;
using ZXing.Mobile;

// Because the assembly dependency decoration is outside of the namespace,
// the namespace "using" must be added or be explicitly prefixed to the
// typeof parameter.

using ScorellViewDemo.Droid;

[assembly: Xamarin.Forms.Dependency(typeof(ZXingHelper))]
namespace ScorellViewDemo.Droid
{
  public class ZXingHelper : IZXingHelper
  {
    public CameraResolution SelectLowestResolutionMatchingDisplayAspectRatio(List<CameraResolution> availableResolutions)
    {
      CameraResolution result = null;

      //a tolerance of 0.1 should not be visible to the user
      double aspectTolerance = 0.1;
      var displayOrientationHeight = DeviceDisplay.MainDisplayInfo.Orientation == DisplayOrientation.Portrait ? DeviceDisplay.MainDisplayInfo.Height : DeviceDisplay.MainDisplayInfo.Width;
      var displayOrientationWidth = DeviceDisplay.MainDisplayInfo.Orientation == DisplayOrientation.Portrait ? DeviceDisplay.MainDisplayInfo.Width : DeviceDisplay.MainDisplayInfo.Height;

      //calculating our targetRatio
      var targetRatio = displayOrientationHeight / displayOrientationWidth;
      var targetHeight = displayOrientationHeight;
      var minDiff = double.MaxValue;

      //camera API lists all available resolutions from highest to lowest, perfect for us
      //making use of this sorting, following code runs some comparisons to select the lowest resolution that matches the screen aspect ratio and lies within tolerance
      //selecting the lowest makes Qr detection actual faster most of the time
      foreach (var r in availableResolutions.Where(r => Math.Abs(((double)r.Width / r.Height) - targetRatio) < aspectTolerance))
      {
        //slowly going down the list to the lowest matching solution with the correct aspect ratio
        if (Math.Abs(r.Height - targetHeight) < minDiff)
            minDiff = Math.Abs(r.Height - targetHeight);
        result = r;
      }

      return result;
    }
  }
}

Использование в MainPage .xaml.cs

 var options = new ZXing.Mobile.MobileBarcodeScanningOptions()
 {
   PossibleFormats = new List<ZXing.BarcodeFormat>() { ZXing.BarcodeFormat.QR_CODE },
   CameraResolutionSelector = DependencyService.Get<IZXingHelper>().SelectLowestResolutionMatchingDisplayAspectRatio
 };
...