Прежде всего я знаю этот вопрос: Штрих-код API Vision - ограничьте область обнаружения центральным прямоугольником экрана , но это не помогло мне, поэтому я должен спросить.
У меня есть следующий код:
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Set our view from the "main" layout resource
SetContentView(Resource.Layout.activity_main);
ScanValueText = FindViewById<TextView>(Resource.Id.ScanValueText);
CameraView = FindViewById<SurfaceView>(Resource.Id.CameraView);
ZoomBar = FindViewById<SeekBar>(Resource.Id.ZoomBar);
CropView = FindViewById<TextView>(Resource.Id.CropView);
ZoomBar.ProgressChanged += ZoomBar_ProgressChanged;
CropView.Touch += CropView_Touch;
barcodeDetector = new BarcodeDetector.Builder(this)
.SetBarcodeFormats(BarcodeFormat.QrCode)
.Build();
cameraSource = new CameraSource
.Builder(this, barcodeDetector)
.SetRequestedPreviewSize(1920, 1080)
.SetAutoFocusEnabled(true)
.SetRequestedFps(15.0f)
.Build();
CameraView.Holder.AddCallback(this);
barcodeDetector.SetProcessor(this);
}
#region Permissions
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Permission[] grantResults)
{
switch (requestCode)
{
case RequestCameraPermisionID:
{
if (grantResults[0] == Permission.Granted)
{
if (ActivityCompat.CheckSelfPermission(ApplicationContext, Manifest.Permission.Camera) != Android.Content.PM.Permission.Granted)
{
//Request Permision
ActivityCompat.RequestPermissions(this, new string[]
{
Manifest.Permission.Camera
}, RequestCameraPermisionID);
return;
}
try
{
cameraSource.Start(CameraView.Holder);
}
catch (InvalidOperationException)
{
}
}
}
break;
}
}
public void SurfaceChanged(ISurfaceHolder holder, [GeneratedEnum] Format format, int width, int height)
{
}
public void SurfaceCreated(ISurfaceHolder holder)
{
if (ActivityCompat.CheckSelfPermission(ApplicationContext, Manifest.Permission.Camera) != Android.Content.PM.Permission.Granted)
{
//Request Permision
ActivityCompat.RequestPermissions(this, new string[]
{
Manifest.Permission.Camera
}, RequestCameraPermisionID);
return;
}
try
{
cameraSource.Start(CameraView.Holder);
}
catch (InvalidOperationException)
{
}
Camera = CameraHelper.GetCamera(cameraSource);
CameraParameters = Camera.GetParameters();
ZoomBar.Max = CameraParameters.MaxZoom;
}
public void SurfaceDestroyed(ISurfaceHolder holder)
{
cameraSource.Stop();
}
public void Release()
{
}
#endregion
#region Detection
public void ReceiveDetections(Detections detections)
{
SparseArray qrcodes = detections.DetectedItems;
if (qrcodes.Size() != 0)
{
ScanValueText.Post(() => {
ScanValueText.Text = ((Barcode)qrcodes.ValueAt(0)).RawValue;
});
}
}
#endregion
#region Eventhandler
private void ZoomBar_ProgressChanged(object sender, SeekBar.ProgressChangedEventArgs e)
{
CameraParameters.Zoom = e.Progress;
Camera.SetParameters(CameraParameters);
}
private void CropView_Touch(object sender, View.TouchEventArgs e)
{
List<Area> areaList = new List<Area>();
MotionEvent me = (MotionEvent)e.Event;
int x = (int)me.GetX();
int y = (int)me.GetY();
int width = CropView.LayoutParameters.Width;
int height = CropView.LayoutParameters.Height;
if ((x - width <= 20 && x - width > 0) || (width - x <= 20 && width - x > 0))
{
switch (me.Action)
{
case MotionEventActions.Down:
break;
case MotionEventActions.Move:
CropView.LayoutParameters.Width = x;
CropView.LayoutParameters.Height = y;
CropView.RequestLayout();
break;
case MotionEventActions.Up:
break;
}
}
}
А это вид
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:minWidth="25px"
android:minHeight="25px">
<FrameLayout
android:minWidth="25px"
android:minHeight="25px"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/frameLayout1" >
<SurfaceView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/CameraView" />
<LinearLayout
android:orientation="vertical"
android:minWidth="25px"
android:minHeight="25px"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/linearLayout1">
<TextView
android:text="Medium Text"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/ScanValueText"
android:gravity="center"
android:layout_marginTop="10.0dp"
android:layout_marginBottom="10.0dp"
android:layout_marginLeft="10.0dp"
android:layout_marginRight="10.0dp" />
<FrameLayout
android:minWidth="25px"
android:minHeight="25px"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/frameLayout2">
<TextureView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/textureView1" />
<TextView
android:text="TextView"
android:textAppearance="?android:attr/textAppearanceMedium"
android:layout_width="400px"
android:layout_height="500px"
android:id="@+id/CropView"
android:background="@drawable/back"
android:layout_gravity="center" />
<SeekBar
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/ZoomBar"
android:layout_marginRight="5.0dp"
android:layout_marginBottom="5.0dp"
android:layout_marginLeft="5.0dp"
android:layout_gravity="bottom" />
</FrameLayout>
</LinearLayout>
</FrameLayout>
</RelativeLayout>
Я рисую синий прямоугольник вокруг TextView, и его можно изменять с помощью сенсорных событий.
Все работает, но есть некоторые проблемы.
Я хочу, чтобы детектор штрих-кода сканировал только область в синем прямоугольнике. Я верю, что мне нужно установить процессор в этой области, но я не знаю, как это сделать и какой процессор нужен.