Я использую следующий ресурс 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.