Android 手写viewpager

以下是一个简化的ViewPager实现示例:


import android.content.Context
import android.util.AttributeSet
import android.view.GestureDetector
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.widget.Scroller

class SimpleViewPager : ViewGroup {

    private var currentPage = 0
    private var scroller: Scroller? = null
    private var gestureDetector: GestureDetector? = null

    constructor(context: Context) : super(context) {
        init(null, 0)
    }

    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
        init(attrs, 0)
    }

    constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {
        init(attrs, defStyleAttr)
    }

    private fun init(attrs: AttributeSet?, defStyleAttr: Int) {
        scroller = Scroller(context)
        gestureDetector = GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
            override fun onScroll(e1: MotionEvent?, e2: MotionEvent?, distanceX: Float, distanceY: Float): Boolean {
                val childCount = childCount
                if (childCount > 0) {
                    val childWidth = getChildAt(0).width
                    val scrollDelta = (distanceX * -1).toInt()
                    scrollBy(scrollDelta, 0)
                    val newPage = currentPage + scrollDelta / childWidth
                    if (newPage >= 0 && newPage < childCount) {
                        currentPage = newPage
                        scrollTo(currentPage * childWidth, 0)
                    }
                }
                return true
            }
        })
    }

    override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
        return gestureDetector?.onTouchEvent(ev) ?: super.onInterceptTouchEvent(ev)
    }

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

    override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
        val childCount = childCount
        for (i in 0 until childCount) {
            val child = getChildAt(i)
            child.layout(i * child.width, 0, (i + 1) * child.width, child.height)
        }
    }

    override fun addView(child: View?, index: Int, params: ViewGroup.LayoutParams?) {
        super.addView(child, index, params)
        child.layoutParams = LayoutParams(
            LayoutParams.MATCH_PARENT,
            LayoutParams.MATCH_PARENT
        )
    }

    fun setCurrentPage(page: Int) {
        if (page >= 0 && page < childCount) {
            currentPage = page
            scrollTo(currentPage * getChildAt(0).width, 0)
        }
    }
}


这个SimpleViewPager类只是一个基础的实现,它使用了Scroller来处理滚动,并使用GestureDetector来检测滑动事件。当滑动发生时,它会计算滑动的距离,并据此决定要切换到哪个页面。

注意:这个实现非常基础,并且没有处理很多ViewPager的常用功能,如页面间的过渡动画、页面指示器等。如果你需要更完整的功能,建议使用Android提供的ViewPager或第三方库,如ViewPager2。

你可能感兴趣的:(android)