亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android?控件自動貼邊實現(xiàn)實例詳解

 更新時間:2022年11月27日 14:37:41   作者:ChenYhong  
這篇文章主要為大家介紹了Android?控件自動貼邊實現(xiàn)實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

正文

最近接到個需求,需要在用戶與App交互時,把SDK中之前實現(xiàn)過的懸浮控件貼邊隱藏,結束交互后延遲一段時間再自動顯示。本篇文章介紹一下實現(xiàn)的思路。

判斷交互

用戶與App交互、結束交互可以通過監(jiān)聽觸摸事件來實現(xiàn)。建議使用的ActivitydispatchTouchEvent,Activity下的所有觸摸事件分發(fā)時都會回調此方法,代碼如下:

class AutoEdgeHideActivity : BaseGestureDetectorActivity() {
    override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
        when (ev.action) {
            MotionEvent.ACTION_DOWN -> {
                // 手指按下,開始本次交互
                // 在此實現(xiàn)隱藏邏輯
            }
            MotionEvent.ACTION_UP -> {
                // 手指抬起,結束本次交互
                // 在此實現(xiàn)延遲顯示功能
            }
        }
        return super.dispatchTouchEvent(ev)
    }
}

隱藏與顯示

想要實現(xiàn)的效果是當用戶與App交互時,懸浮控件平移貼邊,但保留一部分顯示。結束交互延遲一段時間后,懸浮控件平移回原來的位置。

此處通過ValueAnimator來實現(xiàn),計算好控件的起始和結束位置,然后改變控件的x坐標,代碼如下:

private fun xCoordinateAnimator(view: View, startX: Float, endX: Float) {
    val animator = ValueAnimator.ofFloat(startX, endX)
    animator.addUpdateListener {
        // 不斷更改控件的X坐標
        view.x = it.animatedValue as Float
    }
    // 設置插值器,速度由快變慢
    animator.interpolator = DecelerateInterpolator()
    // 設置動畫的持續(xù)時間
    animator.duration = 500
    animator.start()
}

示例

整合之后做了個示例Demo,完整代碼如下:

class AutoEdgeHideActivity : BaseGestureDetectorActivity() {
    private lateinit var binding: LayoutAutoEdgeHideActivityBinding
    private var widthPixels: Int = 0
    private val autoShowInterval = 2
    private var interacting = false
    private var hidden = false
    private var lastPositionX: Float = 0f
    private val handler = Handler(Looper.myLooper() ?: Looper.getMainLooper())
    private val autoShowRunnable = Runnable { autoShow() }
    @SuppressLint("SetTextI18n")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this, R.layout.layout_auto_edge_hide_activity)
        widthPixels = resources.displayMetrics.widthPixels
        binding.includeTitle.tvTitle.text = "AutoEdgeHideExample"
        binding.vFloatView.setOnClickListener {
            if (hidden) {
                // 當前為隱藏狀態(tài),先顯示
                // 把之前的延遲線程先取消
                handler.removeCallbacks(autoShowRunnable)
                autoShow()
                Toast.makeText(this, "手動顯示控件", Toast.LENGTH_SHORT).show()
            } else {
                // 相應正常的事件
                Toast.makeText(this, "點擊了浮標控件", Toast.LENGTH_SHORT).show()
            }
        }
    }
    override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
        when (ev.action) {
            MotionEvent.ACTION_DOWN -> {
                if (!checkIsTouchFloatView(ev, binding.vFloatView)) {
                    // 起始ACTION_DOWN事件在浮標控件外,自動隱藏浮標控件,標記正在交互
                    interacting = true
                    handler.removeCallbacks(autoShowRunnable)
                    autoHide()
                }
            }
            MotionEvent.ACTION_UP -> {
                if (interacting) {
                    // 交互結束,一定時間后自動顯示,時間可以自由配置
                    interacting = false
                    handler.postDelayed(autoShowRunnable, autoShowInterval * 1000L)
                }
            }
        }
        return super.dispatchTouchEvent(ev)
    }
    /**
     * 檢查是否觸摸浮標控件
     */
    private fun checkIsTouchFloatView(ev: MotionEvent, view: View): Boolean {
        val screenLocation = IntArray(2)
        view.getLocationOnScreen(screenLocation)
        val viewX = screenLocation[0]
        val viewY = screenLocation[1]
        return (ev.x >= viewX && ev.x <= (viewX + view.width)) && (ev.y >= viewY && ev.y <= (viewY + view.height))
    }
    private fun autoShow() {
        if (hidden) {
            hidden = false
            binding.vFloatView.let {
                xCoordinateAnimator(it, it.x, lastPositionX)
            }
        }
    }
    private fun autoHide() {
        if (!hidden) {
            hidden = true
            binding.vFloatView.let {
                // 記錄一下顯示狀態(tài)下的x坐標
                lastPositionX = it.x
                // 隱藏時的x坐標,留一點控件的邊緣顯示(示例中默認控件在屏幕右側)
                val endX = widthPixels - it.width * 0.23f
                xCoordinateAnimator(it, lastPositionX, endX)
            }
        }
    }
    private fun xCoordinateAnimator(view: View, startX: Float, endX: Float) {
        val animator = ValueAnimator.ofFloat(startX, endX)
        animator.addUpdateListener {
            view.x = it.animatedValue as Float
        }
        animator.interpolator = DecelerateInterpolator()
        animator.duration = 500
        animator.start()
    }
}

效果如圖:

以上就是Android 控件自動貼邊實現(xiàn)實例詳解的詳細內容,更多關于Android 控件自動貼邊的資料請關注腳本之家其它相關文章!

相關文章

  • Android線性布局與相對布局的實現(xiàn)

    Android線性布局與相對布局的實現(xiàn)

    大家好,本篇文章主要講的是Android線性布局與相對布局的實現(xiàn),感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • Android之Gallery使用例子

    Android之Gallery使用例子

    本篇文章主要介紹了Android之Gallery使用例子,Gallery用來顯示圖片列表,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-01-01
  • Android斬首行動接口預請求

    Android斬首行動接口預請求

    這篇文章主要為大家介紹了Android斬首行動之接口預請求實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-03-03
  • Android仿微信加載H5頁面進度條

    Android仿微信加載H5頁面進度條

    這篇文章主要為大家詳細介紹了Android仿微信加載H5頁面進度條,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Android WebView交互傳遞json字符串并解析的方法

    Android WebView交互傳遞json字符串并解析的方法

    這篇文章主要給大家介紹了關于Android中WebView交互傳遞json字符串并解析的相關資料,文中通過示例代碼介紹的非常詳細,對各位Android開發(fā)者具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-05-05
  • Flutter自動路由插件auto_route使用詳解

    Flutter自動路由插件auto_route使用詳解

    這篇文章主要為大家介紹了Flutter自動路由插件auto_route的基本使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Android LitePal的使用詳解

    Android LitePal的使用詳解

    這篇文章主要介紹了Android LitePal的使用,幫助大家更好的進行Android開發(fā),感興趣的朋友可以了解下
    2020-12-12
  • Android Camera2實現(xiàn)最簡單的預覽框顯示

    Android Camera2實現(xiàn)最簡單的預覽框顯示

    這篇文章主要為大家詳細介紹了Android Camera2實現(xiàn)最簡單的預覽框顯示,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Flutter UI實現(xiàn)側拉抽屜菜單

    Flutter UI實現(xiàn)側拉抽屜菜單

    這篇文章主要為大家詳細介紹了Flutter UI實現(xiàn)側拉抽屜菜單,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Android動態(tài)繪制餅狀圖的示例代碼

    Android動態(tài)繪制餅狀圖的示例代碼

    這篇文章主要介紹了Android動態(tài)繪制餅狀圖的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03

最新評論