首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Camerapagerenderer中用Android实现AutoFocus

如何在Camerapagerenderer中用Android实现AutoFocus
EN

Stack Overflow用户
提问于 2021-08-10 04:25:03
回答 2查看 563关注 0票数 1

我在没有AutoFocus实现的地方使用了AutoFocus。我不知道如何在Xamarin Android中实现它。

代码语言:javascript
复制
public async void OnSurfaceTextureAvailable(SurfaceTexture surface, int width, int height)
        {
            camera = global::Android.Hardware.Camera.Open((int)cameraType);
            textureView.LayoutParameters = new FrameLayout.LayoutParams(width, height);
            surfaceTexture = surface;

            camera.SetPreviewTexture(surface);
            PrepareAndStartCamera();
        }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-08-12 06:16:36

CameraPageRenderer中,通过在CameraPageRenderer中实现IAutoFocusCallback,在相机属性中设置“焦点模式”。

代码语言:javascript
复制
  public class CameraPageRenderer : PageRenderer, TextureView.ISurfaceTextureListener, IAutoFocusCallback
{

然后实现OnAutoFocus方法,设置AutoFocus。

代码语言:javascript
复制
 public void OnAutoFocus(bool success, Camera camera)
    {
        var parameters = camera.GetParameters();
        if (parameters.FocusMode != Android.Hardware.Camera.Parameters.FocusModeContinuousPicture)
        {
            parameters.FocusMode = Android.Hardware.Camera.Parameters.FocusModeContinuousPicture;

            if (parameters.MaxNumFocusAreas > 0)
            {
                parameters.FocusAreas = null;
            }
            camera.SetParameters(parameters);
            camera.StartPreview();
        }
    }

更新:

我遵循这个线程(如何实现摄像机聚焦时的视觉指示器),为CameraPageRenderer添加AutoFocus。

代码语言:javascript
复制
  private void TextureView_Touch(object sender, TouchEventArgs e)
    {
        if (camera != null)
        {
            var parameters = camera.GetParameters();
            camera.CancelAutoFocus();
            Rect focusRect = CalculateTapArea(e.Event.GetX(), e.Event.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(this);

                MarginLayoutParams margin = new MarginLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WrapContent,
       ViewGroup.LayoutParams.WrapContent));
                margin.SetMargins(focusRect.Left, focusRect.Top,
                    focusRect.Right, focusRect.Bottom);
                FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(margin);
                layoutParams.Height = 200;
                layoutParams.Width = 200;
                takePhotoButton.LayoutParameters = layoutParams;
                takePhotoButton.Visibility = ViewStates.Visible;
            }
            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 void OnAutoFocus(bool success, Camera camera)
    {
        var parameters = camera.GetParameters();
        if (parameters.FocusMode != Android.Hardware.Camera.Parameters.FocusModeContinuousPicture)
        {
            parameters.FocusMode = Android.Hardware.Camera.Parameters.FocusModeContinuousPicture;

            if (parameters.MaxNumFocusAreas > 0)
            {
                parameters.FocusAreas = null;
            }
            camera.SetParameters(parameters);
            camera.StartPreview();
            
        }
        if(success)
        {
            Task.Delay(1000);
            this.takePhotoButton.Visibility = ViewStates.Invisible;
        }
       
    }

更新:

票数 1
EN

Stack Overflow用户

发布于 2021-08-10 06:18:19

如果您使用的是照相机API 1(旧的),您可以将焦点模式设置为连续模式,如下所示:

代码语言:javascript
复制
public void OnSurfaceTextureAvailable(SurfaceTexture surface, int width, int height)
{
    try
    {
        var camera = Camera.Open((int)cameraType);
        var parameters = camera.GetParameters();

        //SET FOCUS MODE HERE
        parameters.FocusMode = Camera.Parameters.FocusModeContinuousPicture;

        camera.SetParameters(parameters);
    }
    catch (Exception ex)
    {
        //log error
        return;
    }

    //other code related to the camera
    textureView.LayoutParameters = new FrameLayout.LayoutParams(width, height);
    surfaceTexture = surface;

    camera.SetPreviewTexture(surface);
    PrepareAndStartCamera();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68721099

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档