欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android自定義View實(shí)現(xiàn)相機(jī)對(duì)焦框

 更新時(shí)間:2022年05月19日 10:19:24   作者:吐?tīng)柡榻瑿oding  
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)相機(jī)對(duì)焦框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

前言

在相機(jī)APP中,手動(dòng)對(duì)焦時(shí)都會(huì)出現(xiàn)一個(gè)對(duì)焦框,告訴用戶相機(jī)正在對(duì)焦。那么這種對(duì)焦框是怎么實(shí)現(xiàn)的呢?
最近項(xiàng)目中有幾個(gè)需求,實(shí)現(xiàn)手動(dòng)對(duì)焦,自動(dòng)對(duì)焦和對(duì)焦框。總體來(lái)說(shuō)不是很復(fù)雜,在這片文章中我簡(jiǎn)單介紹一下。

效果展示

對(duì)焦框:

對(duì)焦框是用自定義view實(shí)現(xiàn)的,實(shí)現(xiàn)方法還是和以前一樣,繼承View類,重載構(gòu)造方法,初始化畫(huà)筆,在onTouchEvent里面獲取當(dāng)前點(diǎn)擊位置的x y軸坐標(biāo),在onDraw方法里面調(diào)用canvas的drawCircle方法,把我門(mén)剛才記錄下來(lái)的x y軸坐標(biāo),半徑,畫(huà)筆等參數(shù)傳給drawCircle方法就可以畫(huà)出對(duì)焦框了。

點(diǎn)擊事件:

如果在外部直接調(diào)用view的setOnclickListener方法是獲取不到點(diǎn)擊事件的,所以點(diǎn)擊事件需要使用interface來(lái)實(shí)現(xiàn),在外部實(shí)現(xiàn)ClickEvent這個(gè)接口就可以獲取到view的點(diǎn)擊事件了。

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

因?yàn)橄鄼C(jī)app剛打開(kāi)時(shí),對(duì)焦框是不可見(jiàn)的,所以我把默認(rèn)顏色設(shè)置成透明色。當(dāng)view點(diǎn)擊時(shí)才會(huì)顯示出來(lái),這里就修改paint的顏色為白色即可。然后對(duì)焦完成后把對(duì)焦框隱藏掉,把對(duì)焦框顏色設(shè)置為透明。

其實(shí)還有一種方法是可以使用view的visibility屬性,調(diào)用invisible或gone方法。但是當(dāng)你修改view的顯示狀態(tài)時(shí)會(huì)間接地調(diào)用invalidate方法,隨后onDraw方法就會(huì)被調(diào)用。我們?cè)趏nDraw方法里面?zhèn)鬟f的x y坐標(biāo)是全局變量,所以每次調(diào)用invisible/visible方法會(huì)調(diào)用onDraw方法,這里傳進(jìn)去的x y坐標(biāo)是我們上一次點(diǎn)擊位置,所以當(dāng)你點(diǎn)擊屏幕時(shí)對(duì)焦框的位置是不對(duì)的,有可能是顯示在上次點(diǎn)擊的那個(gè)位置上。為了避免這種情況就用了改變顏色的方式。

完整代碼

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", "對(duì)焦成功")
? ? ? ? ? ? ? ? circle.invisible()
? ? ? ? ? ? ? ? showToast("對(duì)焦成功")
? ? ? ? ? ? } else {
? ? ? ? ? ? ? ? Log.d("test", "對(duì)焦失敗")
? ? ? ? ? ? }
? ? ? ? }
? ? }
?
? ? private fun getFocus() {
? ? ? ? Log.d("test", "正在對(duì)焦")
? ? ? ? camera?.autoFocus(myAutoFocusCallback)
? ? }
?
? ? override fun clicked() {
? ? ? ? getFocus()
? ? }

這里簡(jiǎn)單介紹介紹一下對(duì)焦功能的實(shí)現(xiàn)方法:

核心代碼是camera的autoFocus方法。

手動(dòng)對(duì)焦:每次點(diǎn)擊surface時(shí)可以調(diào)用camera的autoFocus方法進(jìn)行對(duì)焦。

如果想要實(shí)現(xiàn)自動(dòng)對(duì)焦功能,可以借助計(jì)時(shí)器,比如每隔200毫秒校準(zhǔn)一次,校準(zhǔn)完成后關(guān)閉計(jì)時(shí)器等。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • android自定義toast(widget開(kāi)發(fā))示例

    android自定義toast(widget開(kāi)發(fā))示例

    這篇文章主要介紹了android自定義toast(widget開(kāi)發(fā))示例,需要的朋友可以參考下
    2014-03-03
  • Android實(shí)現(xiàn)NFC讀取校園卡

    Android實(shí)現(xiàn)NFC讀取校園卡

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)NFC讀取校園卡,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • Android開(kāi)發(fā)返回鍵明暗點(diǎn)擊效果的實(shí)例代碼

    Android開(kāi)發(fā)返回鍵明暗點(diǎn)擊效果的實(shí)例代碼

    這篇文章主要介紹了Android開(kāi)發(fā)返回鍵明暗點(diǎn)擊效果的實(shí)例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • 安裝android開(kāi)發(fā)環(huán)境原始版(windows版)

    安裝android開(kāi)發(fā)環(huán)境原始版(windows版)

    安裝android開(kāi)發(fā)環(huán)境原始版(windows版)的詳細(xì)步驟
    2013-03-03
  • Android自定義View制作儀表盤(pán)界面

    Android自定義View制作儀表盤(pán)界面

    這篇文章主要介紹了Android自定義View制作儀表盤(pán)界面的相關(guān)資料,首先需要自定義儀表盤(pán)的屬性,在構(gòu)造方法種獲取自定義屬性,本文介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-11-11
  • Android實(shí)現(xiàn)橫向二級(jí)菜單

    Android實(shí)現(xiàn)橫向二級(jí)菜單

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)橫向二級(jí)菜單的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-03-03
  • 基于VideoView自定義控制面板的視頻播放器

    基于VideoView自定義控制面板的視頻播放器

    這篇文章主要為大家詳細(xì)介紹了基于VideoView自定義控制面板的視頻播放器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • Android性能優(yōu)化以及數(shù)據(jù)優(yōu)化方法

    Android性能優(yōu)化以及數(shù)據(jù)優(yōu)化方法

    我和大家之前一起探討了在Android中對(duì)SQLite數(shù)據(jù)庫(kù)的操作優(yōu)化細(xì)節(jié)。今天談?wù)凙ndroid性能數(shù)據(jù)優(yōu)化方法,需要的朋友可以參考下
    2016-05-05
  • 一文帶你深入理解Android Window系統(tǒng)

    一文帶你深入理解Android Window系統(tǒng)

    Android中的窗口系統(tǒng)是應(yīng)用程序用戶界面的核心組件之一,它負(fù)責(zé)管理可視化區(qū)域、處理用戶輸入事件以及與系統(tǒng)UI交互,本文將深入介紹與Android窗口系統(tǒng)相關(guān)的重要概念,需要的朋友可以參考下
    2023-10-10
  • Android自定義鐘表特效

    Android自定義鐘表特效

    這篇文章主要為大家詳細(xì)介紹了Android自定義鐘表特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12

最新評(píng)論