最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android自定義View實現(xiàn)相機對焦框

 更新時間:2022年05月19日 10:19:24   作者:吐爾洪江Coding  
這篇文章主要為大家詳細介紹了Android自定義View實現(xiàn)相機對焦框,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

前言

在相機APP中,手動對焦時都會出現(xiàn)一個對焦框,告訴用戶相機正在對焦。那么這種對焦框是怎么實現(xiàn)的呢?
最近項目中有幾個需求,實現(xiàn)手動對焦,自動對焦和對焦框??傮w來說不是很復雜,在這片文章中我簡單介紹一下。

效果展示

對焦框:

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

點擊事件:

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

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

因為相機app剛打開時,對焦框是不可見的,所以我把默認顏色設(shè)置成透明色。當view點擊時才會顯示出來,這里就修改paint的顏色為白色即可。然后對焦完成后把對焦框隱藏掉,把對焦框顏色設(shè)置為透明。

其實還有一種方法是可以使用view的visibility屬性,調(diào)用invisible或gone方法。但是當你修改view的顯示狀態(tài)時會間接地調(diào)用invalidate方法,隨后onDraw方法就會被調(diào)用。我們在onDraw方法里面?zhèn)鬟f的x y坐標是全局變量,所以每次調(diào)用invisible/visible方法會調(diào)用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()
? ? }

這里簡單介紹介紹一下對焦功能的實現(xiàn)方法:

核心代碼是camera的autoFocus方法。

手動對焦:每次點擊surface時可以調(diào)用camera的autoFocus方法進行對焦。

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

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 仿餓了嗎點餐界面ListView聯(lián)動的實現(xiàn)

    仿餓了嗎點餐界面ListView聯(lián)動的實現(xiàn)

    這篇文章主要介紹了仿餓了嗎點餐界面ListView聯(lián)動的實現(xiàn)的相關(guān)資料,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • Android AsyncTask實現(xiàn)機制詳細介紹及實例代碼

    Android AsyncTask實現(xiàn)機制詳細介紹及實例代碼

    這篇文章主要介紹了Android AsyncTask實現(xiàn)機制詳細介紹及實例代碼的相關(guān)資料,這里附有示例代碼,幫助大家學習理解,需要的朋友可以參考下
    2016-12-12
  • Android開發(fā)兩個activity之間傳值示例詳解

    Android開發(fā)兩個activity之間傳值示例詳解

    這篇文章主要為大家介紹了Android開發(fā)兩個activity之間傳值示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Android Studio gradle 編譯提示‘default not found’ 解決辦法

    Android Studio gradle 編譯提示‘default not found’ 解決辦法

    這篇文章主要介紹了Android Studio gradle 編譯提示‘default not found’ 解決辦法的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • 解析android截屏問題

    解析android截屏問題

    筆者做過一段時間的截屏開發(fā),稍微了解了一下這方面的知識,于是拿來分享一下,也許對你有一些幫助吧
    2013-07-07
  • android 簡單圖片動畫播放的實例代碼

    android 簡單圖片動畫播放的實例代碼

    android 簡單圖片動畫播放的實例代碼,需要的朋友可以參考一下
    2013-06-06
  • 一文講解Kotlin中的contract到底有什么用

    一文講解Kotlin中的contract到底有什么用

    我們在開發(fā)中肯定會經(jīng)常用Kotlin提供的一些通用拓展函數(shù),當我們進去看源碼的時候會發(fā)現(xiàn)許多函數(shù)里面有contract{}包裹的代碼塊,那么這些代碼塊到底有什么作用呢?下面這篇文章主要給大家介紹了關(guān)于Kotlin中contract到底有什么用的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • Android 獲取IP地址的實現(xiàn)方法

    Android 獲取IP地址的實現(xiàn)方法

    這篇文章主要介紹了Android 獲取IP地址的實現(xiàn)方法的相關(guān)資料,這里提供了具體實現(xiàn)的方法及代碼,使用WIFI 和GPRS的思路,需要的朋友可以參考下
    2016-11-11
  • Android實現(xiàn)手機多點觸摸畫圓

    Android實現(xiàn)手機多點觸摸畫圓

    這篇文章主要為大家詳細介紹了Android實現(xiàn)手機多點觸摸畫圓,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Android中再按一次退出提醒實現(xiàn)的兩種方法

    Android中再按一次退出提醒實現(xiàn)的兩種方法

    今天小編就為大家分享一篇關(guān)于Android中再按一次退出提醒實現(xiàn)的兩種方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04

最新評論

禹州市| 临清市| 安丘市| 柯坪县| 无锡市| 峡江县| 南京市| 桐乡市| 德惠市| 秦皇岛市| 沁水县| 黔南| 龙江县| 阿鲁科尔沁旗| 西和县| 阿拉善左旗| 榆树市| 福泉市| 阳西县| 盱眙县| 吉木萨尔县| 泸西县| 无棣县| 玉屏| 高阳县| 合江县| 大庆市| 安康市| 伊川县| 门源| 乐昌市| 周宁县| 湾仔区| 垦利县| 新源县| 罗江县| 云林县| 寻乌县| 子长县| 余姚市| 修武县|