私のアプリでカメラのページのためにユーザーが手動でフォーカスするとき(フォーカスをタップ)に基本サークルを表示したいとします。カメラがフォーカスされているときにビジュアルインジケータを実装する方法
私は既にタップでオートフォーカスを実装していますが、焦点が合っている円を描く方法と、ビューに焦点が合わなくなったときにそれを解除する方法がわかりません。インジケータは、最終的な写真の一部であってはならず、カメラの焦点が合っているかどうかにかかわらず、ユーザーのガイドと同じです。
は、ここで私がこれまで持っているものです。
public class AutoFocusCallback : Java.Lang.Object, IAutoFocusCallback
{
public void OnAutoFocus(bool success, Android.Hardware.Camera camera)
{
var parameters = camera.GetParameters();
var supportedFocusModes = parameters.SupportedFocusModes;
if (string.IsNullOrEmpty(parameters.FocusMode))
{
string focusModeContinuous = Android.Hardware.Camera.Parameters.FocusModeContinuousPicture;
string focusModeAuto = Android.Hardware.Camera.Parameters.FocusModeAuto;
if (supportedFocusModes != null && supportedFocusModes.Any())
{
if (supportedFocusModes.Contains(focusModeContinuous))
{
parameters.FocusMode = focusModeContinuous;
}
else if (supportedFocusModes.Contains(focusModeAuto))
{
parameters.FocusMode = focusModeAuto;
}
}
}
if (supportedFocusModes != null && supportedFocusModes.Any())
{
if (parameters.MaxNumFocusAreas > 0)
{
parameters.FocusAreas = null;
}
if (success)
{
CameraPage cameraPage = new CameraPage();
Canvas canvas = new Canvas();
cameraPage.Draw(canvas);
}
camera.SetParameters(parameters);
camera.StartPreview();
}
}
}
public bool OnTouch(Android.Views.View v, MotionEvent e)
{
if (camera != null)
{
var parameters = camera.GetParameters();
camera.CancelAutoFocus();
Rect focusRect = CalculateTapArea(e.GetX(), e.GetY(), 1f);
if (parameters.FocusMode != Android.Hardware.Camera.Parameters.FocusModeAuto)
{
parameters.FocusMode = Android.Hardware.Camera.Parameters.FocusModeAuto;
}
if (parameters.MaxNumFocusAreas > 0)
{
List<Area> mylist = new List<Area>();
mylist.Add(new Android.Hardware.Camera.Area(focusRect, 1000));
parameters.FocusAreas = mylist;
}
try
{
camera.CancelAutoFocus();
camera.SetParameters(parameters);
camera.StartPreview();
camera.AutoFocus(new AutoFocusCallback());
}
catch (System.Exception ex)
{
Console.WriteLine(ex.ToString());
Console.Write(ex.StackTrace);
}
return true;
}
else
{
return false;
}
}
private Rect CalculateTapArea(object x, object y, float coefficient)
{
var focusAreaSize = Math.Max(textureView.Width, textureView.Height)/8; //Recommended focus area size from the manufacture is 1/8 of the image
int areaSize = focusAreaSize * (int)coefficient;
int left = clamp(Convert.ToInt32(x) - areaSize/2, 0, textureView.Width - areaSize);
int top = clamp(Convert.ToInt32(y) - areaSize/2, 0, textureView.Height - areaSize);
RectF rectF = new RectF(left, top, left + areaSize, top + areaSize);
Matrix.MapRect(rectF);
return new Rect((int)System.Math.Round(rectF.Left), (int)System.Math.Round(rectF.Top), (int)System.Math.Round(rectF.Right), (int)System.Math.Round(rectF.Bottom));
}
private int clamp(int x, int min, int max)
{
if (x > max)
{
return max;
}
if (x < min)
{
return min;
}
return x;
}
public override void Draw(Canvas canvas)
{
base.Draw(canvas);
Paint p = new Paint();
p.Color = Android.Graphics.Color.White;
p.SetStyle(Paint.Style.Stroke);
p.StrokeWidth = 3;
canvas.DrawCircle(300, 300, 100, p);
}
例えばこの絵のように:
これは私のXamarin.Forms Androidアプリです。
編集:ここではカメラのAndroidのソースコードのコピーですが、わからないどこに指標を作っている:なし公式の答えと
同様のSOの記事:
How to implement tap to focus indicator in android camera?
Implement indicator on tap to focus in camera [android]
Android Camera2 - Draw circle focus area
ご覧のとおり、複数の人に同じ質問がありますが、回答はありません。まだ不明な点がある場合は教えてください。
誰かが私になぜわからないのか教えてもらえますか?私はこれをさらに編集していますが、私はかなり明確だと思います。私は描画したい視覚インジケーターの写真を追加しました。 – Euridice01
私はこれが受け入れられる質問だと思う、SOの人々は、しかし、おどることができます。 – jdmdevdotnet
私にもよく見え、完全に有効です。 – Basic