Android自定义View实现相机对焦框

 更新时间:2022年05月19日 10:19:24   作者:吐尔洪江Coding  
这篇文章主要为大家详细介绍了Android自定义View实现相机对焦框,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

前言

在相机APP中,手动对焦时都会出现一个对焦框,告诉用户相机正在对焦。那么这种对焦框是怎么实现的呢?
最近项目中有几个需求,实现手动对焦,自动对焦和对焦框。总体来说不是很复杂,在这片文章中我简单介绍一下。

效果展示

对焦框:

对焦框是用自定义view实现的,实现方法还是和以前一样,继承View类,重载构造方法,初始化画笔,在onTouchEvent里面获取当前点击位置的x y轴坐标,在onDraw方法里面调用canvas的drawCircle方法,把我门刚才记录下来的x y轴坐标,半径,画笔等参数传给drawCircle方法就可以画出对焦框了。

点击事件:

如果在外部直接调用view的setOnclickListener方法是获取不到点击事件的,所以点击事件需要使用interface来实现,在外部实现ClickEvent这个接口就可以获取到view的点击事件了。

interface ClickEvent {
         fun clicked()
    }
 
private var clickEvent: ClickEvent? = null 
    
fun setClickEvent(clickEvent: ClickEvent) {
        this.clickEvent = clickEvent
    }

因为相机app刚打开时,对焦框是不可见的,所以我把默认颜色设置成透明色。当view点击时才会显示出来,这里就修改paint的颜色为白色即可。然后对焦完成后把对焦框隐藏掉,把对焦框颜色设置为透明。

其实还有一种方法是可以使用view的visibility属性,调用invisible或gone方法。但是当你修改view的显示状态时会间接地调用invalidate方法,随后onDraw方法就会被调用。我们在onDraw方法里面传递的x y坐标是全局变量,所以每次调用invisible/visible方法会调用onDraw方法,这里传进去的x y坐标是我们上一次点击位置,所以当你点击屏幕时对焦框的位置是不对的,有可能是显示在上次点击的那个位置上。为了避免这种情况就用了改变颜色的方式。

完整代码

import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View
 
class CircleView@JvmOverloads constructor(
    context: Context,
    attrs: AttributeSet? = null,
    defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr){
 
    interface ClickEvent {
         fun clicked()
    }
 
    private var clickEvent: ClickEvent? = null
 
    fun setClickEvent(clickEvent: ClickEvent) {
        this.clickEvent = clickEvent
    }
 
    private val paint: Paint
    private val radius = 80f
    private var currentX = 0.0f
    private var currentY = 0.0f
 
    init {
        paint = Paint()
        paint.color = Color.TRANSPARENT
        paint.style = Paint.Style.STROKE
        paint.strokeWidth = 4f
    }
 
    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        canvas?.drawCircle(currentX, currentY, radius, paint)
    }
 
    @SuppressLint("ClickableViewAccessibility")
    override fun onTouchEvent(event: MotionEvent?): Boolean {
 
        when (event?.action) {
            MotionEvent.ACTION_DOWN -> {
                currentX = event.x
                currentY = event.y
                paint.color = Color.WHITE
                clickEvent?.clicked()
                invalidate()
            }
        }
        return true
    }
 
    fun invisible(){
        paint.color = Color.TRANSPARENT
        invalidate()
    }
 
}

xml代码

<com.example.camera.CircleView
        android:id="@+id/circle"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_gravity="center">
 

</com.example.camera.CircleView>

Main Activity

private var myAutoFocusCallback : Camera.AutoFocusCallback? = null
 
    private fun focusListener(){
        myAutoFocusCallback = Camera.AutoFocusCallback {isFocused , _ ->
            if (isFocused) {
                Log.d("test", "对焦成功")
                circle.invisible()
                showToast("对焦成功")
            } else {
                Log.d("test", "对焦失败")
            }
        }
    }
 
    private fun getFocus() {
        Log.d("test", "正在对焦")
        camera?.autoFocus(myAutoFocusCallback)
    }
 
    override fun clicked() {
        getFocus()
    }

这里简单介绍介绍一下对焦功能的实现方法:

核心代码是camera的autoFocus方法。

手动对焦:每次点击surface时可以调用camera的autoFocus方法进行对焦。

如果想要实现自动对焦功能,可以借助计时器,比如每隔200毫秒校准一次,校准完成后关闭计时器等。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • android自定义toast(widget开发)示例

    android自定义toast(widget开发)示例

    这篇文章主要介绍了android自定义toast(widget开发)示例,需要的朋友可以参考下
    2014-03-03
  • Android实现NFC读取校园卡

    Android实现NFC读取校园卡

    这篇文章主要为大家详细介绍了Android实现NFC读取校园卡,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Android开发返回键明暗点击效果的实例代码

    Android开发返回键明暗点击效果的实例代码

    这篇文章主要介绍了Android开发返回键明暗点击效果的实例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-04-04
  • 安装android开发环境原始版(windows版)

    安装android开发环境原始版(windows版)

    安装android开发环境原始版(windows版)的详细步骤
    2013-03-03
  • Android自定义View制作仪表盘界面

    Android自定义View制作仪表盘界面

    这篇文章主要介绍了Android自定义View制作仪表盘界面的相关资料,首先需要自定义仪表盘的属性,在构造方法种获取自定义属性,本文介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下
    2016-11-11
  • Android实现横向二级菜单

    Android实现横向二级菜单

    这篇文章主要为大家详细介绍了Android实现横向二级菜单的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • 基于VideoView自定义控制面板的视频播放器

    基于VideoView自定义控制面板的视频播放器

    这篇文章主要为大家详细介绍了基于VideoView自定义控制面板的视频播放器,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-07-07
  • Android性能优化以及数据优化方法

    Android性能优化以及数据优化方法

    我和大家之前一起探讨了在Android中对SQLite数据库的操作优化细节。今天谈谈Android性能数据优化方法,需要的朋友可以参考下
    2016-05-05
  • 一文带你深入理解Android Window系统

    一文带你深入理解Android Window系统

    Android中的窗口系统是应用程序用户界面的核心组件之一,它负责管理可视化区域、处理用户输入事件以及与系统UI交互,本文将深入介绍与Android窗口系统相关的重要概念,需要的朋友可以参考下
    2023-10-10
  • Android自定义钟表特效

    Android自定义钟表特效

    这篇文章主要为大家详细介绍了Android自定义钟表特效,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12

最新评论