Media App播放器界面左右滑动切换上下曲

1.布局

xml 复制代码
        <View
            android:id="@+id/v_moveUp"
            android:layout_width="@dimen/dp_0"
            android:layout_height="@dimen/dp_0"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_TopOf="parent"
            app:layout_constraintBottom_toBottomOf="parent" >
        </View>

2.监听事件

kotlin 复制代码
    private lateinit var gestureHandler: BaseGestureHandler //左右滑动切歌

------------------------------------------------------------------------------------
        gestureHandler = object : BaseGestureHandler() {
            override fun onSwipeRight() {
                playNext()
            }

            override fun onSwipeLeft() {
                playPrevious()
            }
        }

        vMoveUp.isSoundEffectsEnabled = false
        vMoveUp.setOnTouchListener { v, event ->
            event?.let {
                if (it.pointerCount >= 2) {
                    return@setOnTouchListener false
                }
                gestureHandler.onTouchEvent(it) } ?: true
        }

        vMoveUp.setOnSingleClickListener {

        }

3.核心实现

kotlin 复制代码
abstract class BaseGestureHandler {
    val gestureDetector: GestureDetector

    init {
        gestureDetector = GestureDetector(object : GestureDetector.SimpleOnGestureListener() {
            private val swipeThreshold = 100
            private val swipeVelocityThreshold = 100

            override fun onFling(e1: MotionEvent, e2: MotionEvent, velocityX: Float, velocityY: Float): Boolean {
                val pointCount = e1.pointerCount
                val pointCount2 = e2.pointerCount
                if (pointCount > 1 || pointCount2 > 1) {
                    return false
                }

                val diffY = e2.y - e1.y
                val diffX = e2.x - e1.x
                if (Math.abs(diffX) > Math.abs(diffY)) {
                    if (Math.abs(diffX) > swipeThreshold && Math.abs(velocityX) > swipeVelocityThreshold) {
                        if (diffX > 0) {
                            onSwipeRight()
                        } else {
                            onSwipeLeft()
                        }
                        return true
                    }
                }
                return false
            }
        })
    }

    fun onTouchEvent(event: MotionEvent): Boolean {
        return gestureDetector.onTouchEvent(event)
    }

    abstract fun onSwipeRight()
    abstract fun onSwipeLeft()
}
相关推荐
纳于大麓16 分钟前
Android Maven私服搭建(Windows)
java·maven
哈基米喜欢哈哈哈1 小时前
低版本的JVM遇到高版本的class字节码是否会报错
java·jvm
235161 小时前
【并发编程】详解volatile
java·开发语言·jvm·分布式·后端·并发编程·原理
洛小豆2 小时前
java 中 char 类型变量能不能储存一个中文的汉字,为什么?
java·后端·面试
爱吃烤鸡翅的酸菜鱼2 小时前
从数据库直连到缓存预热:城市列表查询的性能优化全流程
java·数据库·后端·spring·个人开发
一只学java的小汉堡2 小时前
Java 面试高频题:HashMap 与 ConcurrentHashMap 深度解析(含 JDK1.8 优化与线程安全原理)
java·开发语言·面试
huohaiyu3 小时前
Hashtable,HashMap,ConcurrentHashMap之间的区别
java·开发语言·多线程·哈希
信奥卷王4 小时前
[GESP202503 五级] 原根判断
java·数据结构·算法
小咕聊编程4 小时前
【含文档+源码】基于SpringBoot的过滤协同算法之网上服装商城设计与实现
java·spring boot·后端
Zz_waiting.4 小时前
Spring 原理
java·spring·spring自动管理