Android应用开发Android 中 scrollTo和scrollBy及Scroller 的使用
白羽 2019-04-09 来源 :网络 阅读 1671 评论 0

摘要:本文将带你了解Android应用开发Android 中 scrollTo和scrollBy及Scroller 的使用,希望本文对大家学Android有所帮助。

    本文将带你了解Android应用开发Android 中 scrollTo和scrollBy及Scroller 的使用,希望本文对大家学Android有所帮助。



Android应用开发Android 中 scrollTo和scrollBy及Scroller 的使用


Android   Scroller完全解析,关于Scroller你所需知道的一切
    本文基于郭神给出的教程,在结合自己的编码总结这个几个东西的使用。
   
    先来说 scrollTo()与scrollBy()的使用与区别:
    这两个函数都是在View.java中,所以这两个都可以对View视图进行滚动。
    阅读这两个函数的源码就可以找出它们的区别了。
   
    这里写图片描述
   
    可以发现scrollBy()最终调用的还是scrollTo(),只是对参数进行了改变;mScrollX、mScrollY代表的就是View   x、y轴当前滑动的距离。 通过分析我们可以看出一点:
    scrollTo() 是将View滚动到指定的一个位置A(x,y) scrollBy() 是将View从上次滚动的位置 继续滚动一定的距离   这两个函数一般都是作用于ViewGroup的,滚动其内部子View;如果作用于View上的话 效果会很糟糕的(不信你试试)
    区别说完了,那就动手来写代码实践吧!
    效果图
    这里写图片描述
   
    使用一个LinearLayout内部放置两个Button即可,用来分别调用scrollBy()和scrollTo()函数。
   
    scrollTo

      final   LinearLayout layout = findViewById(R.id.layout);
    final Button scrollTo = findViewById(R.id.scroll_to);
    /*
     *   第一个参数x表示相对于当前位置横向移动的距离,正值向左移动,负值向右移动,
     *   第二个参数y表示相对于当前位置纵向移动的距离,正值向上移动,负值向下移动
     */
    scrollTo.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v)   {
            //移动到相对于容器的左上角 x 200 y   200的一个位置
            //绝对坐标计算
            layout.scrollTo(-200,   -200);
        }
    });

    scrollBy


    final   LinearLayout layout = findViewById(R.id.layout);
    final Button scrollBy = findViewById(R.id.scroll_by);
    /*
     *   第一个参数x表示相对于当前位置横向移动的距离,正值向左移动,负值向右移动,
     *   第二个参数y表示相对于当前位置纵向移动的距离,正值向上移动,负值向下移动
     */
    scrollBy.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v)   {
            //在相对于上次的位置移动50个px
            layout.scrollBy(-50,   -50);
        }
      });

    接下来说Scroller这个类的使用,封装了滚动的操作
    在布局中放置一个自定义的ViewGroup,并添加一个子View。
    看下我们最终实现的效果,让View竖直向下滚动:
   
    这里写图片描述
 
   

    自定义的ViewGroup MyViewGroup

      class   MyViewGroup extends LinearLayout {
     
        private Scroller scroller;
     
        public MyViewGroup(Context   context) {
            super(context);
        }
     
        public MyViewGroup(Context   context, @Nullable AttributeSet attrs) {
            super(context, attrs);
            scroller = new   Scroller(context);
        }
     
        public void startScroll() {
             /*
               调用startScroll()方法来初始化滚动数据并刷新界面
                 startScroll()第一个参数是滚动开始时X的坐标,第二个参数是滚动开始时Y的坐标,
                 第三个参数是横向滚动的距离,正值表示向左滚动,第四个参数是纵向滚动的距离,正值表示向上滚动
              */
            scroller.startScroll(0,   getScrollY(), 0, -200);
            invalidate();
        }
     
        @Override
        public void computeScroll()   {
            //判断是否滚动完成
            if   (scroller.computeScrollOffset()) {
                  scrollTo(scroller.getCurrX(), scroller.getCurrY());
            }
        }
      }

    通过点击TextView触发滚动逻辑MyViewGroup中的startScroll()

      final   MyViewGroup myView = findViewById(R.id.view);
    final View tv = findViewById(R.id.tv);
    tv.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v)   {
            myView.startScroll();
          }

    第一步:在ViewGroup的构造函数中初始化Scroller scroller = new Scroller(context);   第二步:调用scroller.startScroll(0, getScrollY(), 0, -200);   设置View需要滚动到的位置,参数意思已经在上面代码中给出。这个函数只是对View滚动的一些参数设置,并没有开始滚动。 第三步:调用View   的invalidate();对界面进行刷新,从而调用onDraw()函数而onDraw()函数中又调用了computeScroll()函数。   第四步:重写computeScroll()函数对View进行滚动,一般情况下代码也就是上面这样固定的写法。scroller.getCurrX()、scroller.getCurrY()获取当前滚动的偏移量,
    基础说完了,就可以自己动手写个案例练练手熟悉熟悉。
    自定义ViewGroup 仿系统的ViewPage效果
    自定义实现的效果:
   
    这里写图片描述
   
    布局代码:摆放三个View

    自定义Group的逻辑:宽度充满屏幕、里面的子View充满Group并水平排列View 先处理自定Group逻辑,摆放子view   逻辑都写在注释里了

   

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程