《Android进阶之光》Horizontal 读书笔记

public class HorizontalView extends ViewGroup {private int lastInterceptX;private int lastInterceptY;private int lastX;private int lastY;private int childWidth;private int curIndex;private Scroller scroller;//测试滑动速度private VelocityTracker tracker;public HorizontalView(Context context) {this(context, null);}public HorizontalView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public HorizontalView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}private void init() {scroller = new Scroller(getContext());tracker = VelocityTracker.obtain();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);measureChildren(widthMeasureSpec, heightMeasureSpec);int widthSpec = MeasureSpec.getMode(widthMeasureSpec);int heightSpec = MeasureSpec.getMode(heightMeasureSpec);int widthSize = MeasureSpec.getSize(widthMeasureSpec);int heightSize = MeasureSpec.getSize(heightMeasureSpec);//若无子元素,宽高设置为0if (getChildCount() == 0) {setMeasuredDimension(0, 0);}View childOne = getChildAt(0);int childWidth = childOne.getMeasuredWidth();int childHeight = childOne.getMeasuredHeight();if (widthSpec == MeasureSpec.AT_MOST) {//若宽为 at_most , 定义宽为所有子元素的宽widthSize = childWidth * getChildCount();}if (heightSpec == MeasureSpec.AT_MOST) {//若高为 at_most 定义高为第一个子元素的高heightSize = childHeight;}setMeasuredDimension(widthSize, heightSize);}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {int childCount = getChildCount();int left = 0;View child;for (int i = 0; i < childCount; i++) {child = getChildAt(i);if (child.getVisibility() != View.GONE) {int width = child.getMeasuredWidth();childWidth = width;child.layout(left, 0, left + width, child.getMeasuredHeight());left += width;}}}@Overridepublic boolean onInterceptTouchEvent(MotionEvent ev) {boolean intercept = false;int x = (int) ev.getX();int y = (int) ev.getY();switch (ev.getAction()) {case MotionEvent.ACTION_DOWN://滑动时再次点击停止intercept = false;if (!scroller.isFinished()) {scroller.abortAnimation();}break;case MotionEvent.ACTION_MOVE:int deltaX = x - lastInterceptX;int deltaY = y - lastInterceptY;intercept = Math.abs(deltaX) - Math.abs(deltaY) > 0;break;case MotionEvent.ACTION_UP:break;}lastInterceptX = x;lastInterceptY = y;lastX = x;lastY = y;return intercept;}//若 viewGroup 拦截则执行@Overridepublic boolean onTouchEvent(MotionEvent event) {int x = (int) event.getX();int y = (int) event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:if (!scroller.isFinished()) {scroller.abortAnimation();}break;case MotionEvent.ACTION_MOVE:int deltaX = x - lastX;scrollBy(-deltaX, 0);break;case MotionEvent.ACTION_UP:int dis = getScrollX() - curIndex * childWidth;if (Math.abs(dis) > childWidth / 2) {if (dis > 0) {curIndex++;} else {curIndex--;}} else {tracker.computeCurrentVelocity(1000);float xV = tracker.getXVelocity();if (xV > 50) {if (xV > 0) {curIndex--;} else {curIndex++;}}}//修正curIndexcurIndex = curIndex < 0 ? 0 :curIndex > getChildCount() - 1 ? getChildCount() - 1 : curIndex;//处理 Action_move 滑动结果,左滑或右滑smoothScrollTo(curIndex * childWidth, 0);//重置计算器tracker.clear();break;}lastX = x;lastY = y;return super.onTouchEvent(event);}@Overridepublic void computeScroll() {super.computeScroll();if (scroller.computeScrollOffset()) {scrollTo(scroller.getCurrX(), scroller.getCurrY());postInvalidate();}}/*** 弹性滑动*/public void smoothScrollTo(int destX, int destY) {scroller.startScroll(getScrollX(), getScrollY(),destX - getScrollX(), destY - getScrollY(), 1000);invalidate();}
}

《Android进阶之光》Horizontal 读书笔记相关推荐

  1. Android群英传神兵利器读书笔记——第三章:Android Studio奇技淫巧

    Android群英传神兵利器读书笔记--第三章:Android Studio奇技淫巧 这篇文章篇幅较长,可以使用版权声明下面的目录,找到感兴趣的进行阅读 目录 3.1 Android Studio使用 ...

  2. 《android进阶之光》——事件总线(上)

    今日阅读:<android进阶之光>的事件总线部分,整理如下 事件总线知识点: 1.EventBus:就是事件,可以是任意对象 2.Subscriber:事件的订阅者 3.Publishe ...

  3. 《Android群英传》读书笔记---10.2(终篇)

    <Android群英传>读书笔记-10.2 标签(): android中级 读书笔记 Activity过渡动画 曾经的 Android在Activity之间进行跳转的时候,只是非常生硬的切 ...

  4. 《Android群英传》---读书笔记6

    <Android群英传>-读书笔记6 标签: android中级 读书笔记 Android 5.X SVG矢量动画机制 SVG:课可伸缩矢量图形:使用XML格式定义图形:图像在放大或改变尺 ...

  5. 进阶三部曲第一部《Android进阶之光》第2版已出版

    本文首发于微信公众号「刘望舒」 其实<Android进阶之光>第二版已经在2021年4月就出版了,但是今天才发现,我去,没在CSDN发文,今天补上~~ 以下是正文 其实不打算出<An ...

  6. Android群英传神兵利器读书笔记——第一章:程序员小窝——搭建高效的开发环境

    Android群英传神兵利器读书笔记--第一章:程序员小窝--搭建高效的开发环境 目录 1.1 搭建高效的开发环境之操作系统 1.2 搭建开发环境之高效配置 基本环境配置 基本开发工具 1.3 搭建程 ...

  7. Android进阶三部曲 第一部《Android进阶之光》已出版(内含勘误)

    独立博客版本请点击这里 勘误帖请点击这里 源码地址:https://github.com/henrymorgen/android-advanced-light 进阶三部曲第二部:http://liuw ...

  8. 《Android群英传》---读书笔记4

    <Android群英传>-读书笔记4 标签: android中级 读书笔记 Android绘图机制与处理技巧 Android屏幕相关知识 略 2D绘图基础 系统通过提供的Canvans对象 ...

  9. 《Android进阶之光》续作内容简介

    <Android进阶之光>续作的书名现在还没有定,目前已经完稿,预计会在9月出版.本书基于Android8.0,理念和<Android开发艺术探索>相近,是将源码和应用开发相结 ...

最新文章

  1. 利用solr6.5,tomcat9.0和centos7.0的搭建
  2. php 换行替换成p,php 换行如何替换
  3. thinkphp删除某一学生_基于ThinkPHP实现批量删除
  4. Linux 运维必备150 个命令,值得收藏!
  5. 【原】git命令行查看全部分支与远程分支不同步问题
  6. python围棋程序在屏幕上找棋盘_用C语言编程 在屏幕上显示围棋棋盘
  7. C/C++使用Select检索MySQL中的数据
  8. 转发: Angular装饰器
  9. Java虚拟机--------JVM常见参数
  10. 为什么在加油站上班,一个月休3天,工资2000元,却有人干?
  11. JS 变量的数据类型 运算符
  12. HTTP权威指南 笔记
  13. navicat 软件查询mysql表,限制显示条数
  14. 用计算机算出别人多少岁,年龄计算器 年龄计算器查询
  15. C# 校验类(邮箱、手机号、身份证号等)
  16. 学习英文-学以致用【场景:吃饭与家务】
  17. Python学习-批量提取图片名称保存至txt文件
  18. 百度地图网站获取指定地点经纬度坐标方法
  19. 【零基础】Python3学习课后练习题(十七)
  20. BankCore记账流程以及记账核心调用方法

热门文章

  1. 【金融项目】尚融宝项目(一)
  2. (转)投资失败、女友离开、身无分文,私募大佬的牛逼都是熬出来的
  3. 百度网盘AI大赛-水印智能消除赛第3名方案
  4. League of Kingdoms【王国联盟】国内首家独发攻略
  5. 浅谈Arduino进入蓝牙模块的AT指令模式
  6. 《唐门逆天录》隐私政策
  7. 百度AI审核图片报download image error
  8. FTP部署看这一篇就够了——Linux版
  9. word里快速切换改写功能
  10. 支持预览html的解压软件,无须对文件解压 WinZIP可直接预览图片