相信用过自定义滑动控件的同志们对 Scroller不陌生,那Scroller到底是什么,带着疑问,我哭着来了

1. Scroller 是什么?

在讲到 view的位置改变方式 篇中,有用到 scrollBy(x, y);  scrollTo(x, y);这两个方法是 View 自带的 滑动 公开方法,这两个方法实现的移动方式是“变”,使的控件的移动很突兀,不美观,与我们希望的平滑的移动相去甚远,为了实现平滑的移动,于是 Scroller 出生了

2.  Scroller  有哪些基本用法

mScroller.getCurrX();//获取当前触点的 X 坐标
     mScroller.getCurrY();//获取当前触点的 Y 坐标
     mScroller.computeScrollOffset();//判断当前是否在

mScroller.startScroll(startX, startY, dx, dy);//移动方法,startX, startY是view当前坐标,dx, dy为偏移量
      mScroller.startScroll(startX, startY, dx, dy, duration);//前四个参数就补介绍了,最后一个是移动耗时

3.  Scroller    的使用

主要分三步:

1.初始化 Scroller

2.重写自定义view类中的 computeScroll 方法

3. Scroller    模拟移动  mScroller.startScroll(startX, startY, dx, dy);

还是以 《 view的位置改变方式》篇中的随手指移动的view为例,下面分步解说

首先,当然是得自定义view了:

@SuppressLint("ClickableViewAccessibility")
public class DragView extends View {private Context mContext;private int mLastX;private int mLastY;private int mOfferX;private int mOfferY;private Scroller mScroller;public DragView(Context context, AttributeSet attrs) {super(context, attrs);this.mContext=context;initData();}

好,然后来看 initData 方法中是怎么初始化  Scroller 的

 private void initData(){mScroller=new Scroller(mContext);}

看view的重写方法 computeScroll

 @Overridepublic void computeScroll(){super.computeScroll();//Scroller提供computeScrollOffset方法判断是否完成滚动,滚动的时候computeScrollOffset返回trueif(mScroller.computeScrollOffset()){((View)getParent()).scrollTo(mScroller.getCurrX(), mScroller.getCurrY());//通过重绘不断调用computeScrollinvalidate();}}

此处要注意的几点:

1.computeScrollOffset 对于滚动的判断

2. scrollTo 方法的调用者为 (View)getParent(),而非view ,scrollTo(x,y)中的参数为当前坐标,这点要和scrollBy(dx,dy)区分开

3. 调用完毕后,记得重绘 invalidate();

好的,现在准备就绪,就看 touch事件的处理了

 @Overridepublic boolean onTouchEvent(MotionEvent event) {int currentX = (int) event.getX();int currentY = (int) event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:mLastX=currentX;mLastY=currentY;break;case MotionEvent.ACTION_MOVE:mOfferX=currentX-mLastX;mOfferY=currentY-mLastY;//当前layout上面添加偏移量mScroller.startScroll(mScroller.getCurrX(), mScroller.getCurrY(), -20, 0);invalidate();break;case MotionEvent.ACTION_UP://重新设置坐标mLastX=currentX;mLastY=currentY;break;default:break;}return true;}

主要还是看Action—move中的处理,先是 startScroll(x,y,dx,dy),然后重绘

Ok,搞定,现在把整个代码贴出来

package com.example.androidtexta;import android.annotation.SuppressLint;
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Scroller;/**** 移动控件三步骤:* 1.在 MotionEvent.ACTION_DOWN 中记录摁下的坐标* 2.在 ACTION_MOVE 后算出 坐标移动差值,重新设置view的位置* 3.更新最后的xy坐标记录**/
@SuppressLint("ClickableViewAccessibility")
public class DragView extends View {private Context mContext;private int mLastX;private int mLastY;private int mOfferX;private int mOfferY;private Scroller mScroller;public DragView(Context context, AttributeSet attrs) {super(context, attrs);this.mContext=context;initData();}private void initData(){mScroller=new Scroller(mContext);}@Overridepublic boolean onTouchEvent(MotionEvent event) {int currentX = (int) event.getX();int currentY = (int) event.getY();switch (event.getAction()) {case MotionEvent.ACTION_DOWN:mLastX=currentX;mLastY=currentY;break;case MotionEvent.ACTION_MOVE:mOfferX=currentX-mLastX;mOfferY=currentY-mLastY;//当前layout上面添加偏移量mScroller.startScroll(mScroller.getCurrX(), mScroller.getCurrY(), -20, 0);invalidate();break;case MotionEvent.ACTION_UP://重新设置坐标mLastX=currentX;mLastY=currentY;break;default:break;}return true;}@Overridepublic void computeScroll(){super.computeScroll();//Scroller提供computeScrollOffset方法判断是否完成滚动,滚动的时候computeScrollOffset返回trueif(mScroller.computeScrollOffset()){((View)getParent()).scrollTo(mScroller.getCurrX(), mScroller.getCurrY());//通过重绘不断调用computeScrollinvalidate();}}}

好,搞定

猎影-----Scroller的基本使用相关推荐

  1. 代码解说Android Scroller、VelocityTracker

    在编写自己定义滑动控件时经常会用到Android触摸机制和Scroller及VelocityTracker.Android Touch系统简单介绍(二):实例具体解释onInterceptTouchE ...

  2. flex Scroller

    <?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="ht ...

  3. Android Scroller与computeScroll方法的调用关系

    2019独角兽企业重金招聘Python工程师标准>>> Android ViewGroup中的Scroller与computeScroll的有什么关系? 答:没有直接的关系 知道了答 ...

  4. 通过Scroller.js制作上拉加载和下拉刷新

    为什么80%的码农都做不了架构师?>>>    之前做移动端webAPP开发,一直是用的IScroll来做滚动列表,但是IScroll没有直接提供上下拉刷新的功能,虽然我们基于ISc ...

  5. Android Scroller简单用法

    Android里Scroller类是为了实现View平滑滚动的一个Helper类.通常在自定义的View时使用,在View中定义一个私有成员mScroller = new Scroller(conte ...

  6. Egret之eui.Scroller

    (纯码农制作 ,不喜勿喷)先看看结果 : 一 : Cell(render) Skin 的制作: 看结果是横向的滚动 , 向左 . 如果第一次显示第二个cell , 那么需向左滑动Cell的宽度 + C ...

  7. Android自己定义组件系列【2】——Scroller类

    在上一篇中介绍了View类的scrollTo和scrollBy两个方法,对这两个方法不太了解的朋友能够先看<自己定义View及ViewGroup> scrollTo和scrollBy尽管实 ...

  8. Android Scroller 使用详解

    1.Scroller到底是什么? 答:Scroller只是个计算器,提供插值计算,让滚动过程具有动画属性,但它并不是View,只是单纯地为滑动提供计算. 2.Scroller只是提供计算,那谁来让Vi ...

  9. 使用Scroller实现弹性滑动

    scrollTo.scrollBy View内部为了实现滑动提供了这两个方法,但是使用这两个方法滑动的效果是瞬间的不够平滑,如何实现View的弹性滑动呢?这正是本博文讨论的主题.另外这两个函数滑动的是 ...

最新文章

  1. 抽象工厂模式 java实例 tclhaier_Unity常用的设计模式_工厂模式系列之抽象工厂模式...
  2. drools规则中调用其它规则_简化机器学习中的关联规则
  3. gnome mysql client_configure: error: Not found mysqlclient library
  4. ansible-playbook jdk安装
  5. Handlebars.js 模板引擎
  6. 2B.处女座与cf(C++)
  7. HTML/CSS/动画
  8. 牛客 - 红蓝图(克鲁斯卡尔重构树的dfs序上建主席树)
  9. fpga中wire和reg的区别
  10. 不管什么事,只要用心做,总不会太差!
  11. mysql 表上限_mysql 数据库表的上限
  12. Fancybox丰富的弹出层效果
  13. 导航守卫与keep-alive
  14. java官方网站下载_java下载 7.0 官方版
  15. 通用mrp手机必备新手安装包
  16. win10电脑状态栏图标不见消失解决办法
  17. 名字中间一条线怎么弄_怎么在网名中间画一条横线 一条横线穿过字的网名
  18. 《机器学习实战》学习笔记(八):预测数值型数据 - 回归
  19. 2004年高考数学压轴题(利用对数齐次化或主元法解决)
  20. 转变思维,寒冬中的一把“创业火” ——猿团CEO受邀做主题演讲

热门文章

  1. 设置添加环境变量Path
  2. Java设计模式 - 管道模式
  3. 2007年微型计算机内容,2007年10月自考试题微型计算机及接口技术全国试卷
  4. Android锁屏系统重启
  5. php正则表达式替换,php正则表达式如何替换字符
  6. 某人去玩具店买小熊,小熊进价为20,卖价是30,付给老板100元,老板没有零钱,就在卖鞋的人那里换了100元零钱,找给卖家70,卖鞋的发现那100元是假币,于是找老板换回了100元,请问玩具店老板损失
  7. 实习闲余——对Pinia的整理和学习
  8. 从事互联网金融行业需具备哪些常识?
  9. 挣1万,可能靠的是体力。挣10万,也许靠的是脑力。挣100万靠什么?
  10. 计算机专业如何做技能作品,浅谈一堂计算机技能课教学