摘要:本文将带你了解Android应用开发Android 中 scrollTo和scrollBy及Scroller 的使用,希望本文对大家学Android有所帮助。
本文将带你了解Android应用开发Android 中 scrollTo和scrollBy及Scroller 的使用,希望本文对大家学Android有所帮助。
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频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号