Android ViewGroup 浅析一

编程入门 行业动态 更新时间:2024-10-17 21:19:12

<a href=https://www.elefans.com/category/jswz/34/1771384.html style=Android ViewGroup 浅析一"/>

Android ViewGroup 浅析一

measureChildren(widthMeasureSpec, heightMeasureSpec) 将子View宽高设为同等大小
parent.requestDisallowInterceptTouchEvent(true) 当前若是滑动控件,且拦截子View,除了子View cancel,还要通知上一级View不再拦截,如果在滑动控件,触摸到子View则父View会收到InterTouch,子View收到TouchDown,而父View收不到TouchDown,scrollTo参数是相反
.coerceAtLeast(0) 上限
.coerceAtMost(width)下限
VelocityTracker 记速器

code 

package com.example.myapplication.viewimport android.content.Context
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.VelocityTracker
import android.view.ViewConfiguration
import android.view.ViewGroup
import android.widget.OverScroller
import androidx.core.view.children
import kotlin.math.absclass TwoPager(context: Context, attrs: AttributeSet) : ViewGroup(context, attrs) {var downX = 0fvar downY = 0fvar downScrollX = 0fvar scrolling = falsevar overScroller: OverScroller = OverScroller(context)var viewConfiuration = ViewConfiguration.get(context)var velocityTracker = VelocityTracker.obtain()var minVelocity = viewConfiuration.scaledMinimumFlingVelocity //最小快滑var maxVelocity = viewConfiuration.scaledMaximumFlingVelocity //最大快滑var pagingSlop = viewConfiuration.scaledPagingTouchSlopoverride fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {measureChildren(widthMeasureSpec, heightMeasureSpec)super.onMeasure(widthMeasureSpec, heightMeasureSpec)}override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {var childLeft = 0val childTop = 0var childRight = widthval childBottom = heightfor (child in children) {child.layout(childLeft, childTop, childRight, childBottom)childLeft += widthchildRight += width}}override fun onInterceptHoverEvent(event: MotionEvent): Boolean {if (event.actionMasked == MotionEvent.ACTION_DOWN) {velocityTracker.clear()}velocityTracker.addMovement(event)var result = falsewhen (event.actionMasked) {MotionEvent.ACTION_DOWN -> {scrolling = falsedownX = event.xdownY = event.ydownScrollX = scrollX.toFloat()}MotionEvent.ACTION_MOVE -> if (!scrolling) {val dx = downX - event.xif (abs(dx) > pagingSlop) {scrolling = trueparent.requestDisallowInterceptTouchEvent(true)result = true}}}return result}override fun onTouchEvent(event: MotionEvent): Boolean {if (event.actionMasked == MotionEvent.ACTION_DOWN) {velocityTracker.clear()}velocityTracker.addMovement(event)when (event.actionMasked) {MotionEvent.ACTION_DOWN -> {downX = event.xdownY = event.ydownScrollX = scrollX.toFloat()}MotionEvent.ACTION_MOVE -> {val dx = (downX - event.x + downScrollX).toInt().coerceAtLeast(0).coerceAtMost(width)scrollTo(dx, 0)}MotionEvent.ACTION_UP -> {velocityTrackerputeCurrentVelocity(1000, maxVelocity.toFloat()) //计算速度val vx = velocityTracker.xVelocity //取出计算val scrollX = scrollXval targetPage = if (abs(vx) < minVelocity) {if (scrollX > width / 2) 1 else 0} else {if (vx < 0) 1 else 0}val scrollDistance = if (targetPage == 1) width - scrollX else -scrollXoverScroller.startScroll(getScrollX(), 0, scrollDistance, 0) //给一个位置,然后自动计算postInvalidateOnAnimation()}}return true}//draw调用 这个也会调用override fun computeScroll() {if (overScrollerputeScrollOffset()) {scrollTo(overScroller.currX, overScroller.currY)postInvalidateOnAnimation()}}
}

更多推荐

Android ViewGroup 浅析一

本文发布于:2023-11-16 04:22:19,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1612405.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Android   ViewGroup

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!