当前位置: 首页 > news >正文

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 -> {velocityTracker.computeCurrentVelocity(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 (overScroller.computeScrollOffset()) {scrollTo(overScroller.currX, overScroller.currY)postInvalidateOnAnimation()}}
}

相关文章:

  • Redis7--基础篇2(Redis的十大数据类型及常用命令)
  • freertos任务参数
  • 【计算机组成】实模式/保护模式下地址分段(基段地址+偏移地址)的原因
  • 找到【SVM】中最优的惩罚项系数C
  • Python中CAN通讯学习
  • Appium 移动端自动化测试,触摸(TouchAction) 与多点触控(MultiAction)
  • QT学习之QT概述
  • -Xms8g -Xmx8g -Xmn3g 生产事故-记一次特殊的OOM排查
  • 深入理解 Django 模板系统
  • asp.net生产线远程故障诊断系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
  • Hadoop知识点全面总结
  • 3.4、Linux小程序:进度条
  • px、rpx、em以及rem的区别与用法
  • linux的美化工具 oh-my-zsh的安装与使用 神器工具
  • 使用 Java Timer 实现任务调度
  • 0基础学习移动端适配
  • Bytom交易说明(账户管理模式)
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • java正则表式的使用
  • JAVA之继承和多态
  • JS函数式编程 数组部分风格 ES6版
  • Js基础——数据类型之Null和Undefined
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Odoo domain写法及运用
  • rabbitmq延迟消息示例
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • vue-cli在webpack的配置文件探究
  • 规范化安全开发 KOA 手脚架
  • 码农张的Bug人生 - 见面之礼
  • 浅谈web中前端模板引擎的使用
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 入门到放弃node系列之Hello Word篇
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 消息队列系列二(IOT中消息队列的应用)
  • 正则与JS中的正则
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • ​比特币大跌的 2 个原因
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • $jQuery 重写Alert样式方法
  • (SpringBoot)第七章:SpringBoot日志文件
  • (二)构建dubbo分布式平台-平台功能导图
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (译)计算距离、方位和更多经纬度之间的点
  • (转载)Linux网络编程入门
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .cn根服务器被攻击之后
  • .desktop 桌面快捷_Linux桌面环境那么多,这几款优秀的任你选
  • .FileZilla的使用和主动模式被动模式介绍
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .net core 连接数据库,通过数据库生成Modell
  • .NET 表达式计算:Expression Evaluator
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .NET/C# 的字符串暂存池
  • .net流程开发平台的一些难点(1)