涉及到滑动,就涉及到VIEW,大家都知道,android的UI界面都是由一个一个的View以及View的派生类组成,View作为基类,而常用的布局里面的各种布局就是它派生出来的ViewGroup的子类,ViewGroup作为各个组件的容器搭建了整体的UI。以下是android
UI的结构示示意图:
查看源码
/**
* Implement this to do your drawing.
*
* @param canvas the canvas on which the background will be drawn
*/
protected void onDraw(Canvas canvas) {
}
可以发现,
View的实现一般是通过绘制onDraw方法进行,如果你要改变它的界面可以重写onDraw,达到你的效果,在源码中,你找不到
public void addView(View child) {
addView(child, -1);
}
这个方法,因为它不知道,只有在它的派生类例如
ViewGroup中会有这个方式去添加子布局。
而ViewGroup作为一个组件容器,它可以包含任何组件,可是你必须重写他的onLayout() 方法和onMeasure()来设置容器布局的位置和绘制它的大小才能正常显示。
首先 ,我们必须明白在Android View视图是没有边界的,Canvas是没有边界的,只不过我们通过绘制特定的View时对 Canvas对象进行了一定的操作,例如 : translate(平移)、clipRect(剪切)等,以便达到我们的对该Canvas对象绘制的要求 ,我们可以将这种无边界的视图称为“视图坐标”-----它不受物理屏幕限制。通常我们所理解的一个Layout布局文件只是该视图的显示区域,超过了这个显示区域将不能显示到父视图的区域中
,对应的,我们可以将这种有边界的视图称为“布局坐标”------ 父视图给子视图分配的布局(layout)大小。而且, 一个视图的在屏幕的起始坐标位于视图坐标起始处,如下图所示。
其实是相对于父类视图的左上角坐标为原点(0,0),而不是整体ViewGroup的左上角为原点。
由于布局坐标只能显示特定的一块内容,所以我们只有移动布局坐标的坐标原点就可以将视图坐标的任何位置显示出来。
(注:例如cocos2D的布局就和android的布局坐标原点坐标不一样,是左下角会原点,所以会有所差异。)
这里就大致提下View和ViewGroup,(网上很多大神都对这块进行了分析,这里只是做了少量摘抄记录)目的是为了引出今天的主角scrollTo
和 scrollBy。
查看下源码可以发现:
/**
* The offset, in pixels, by which the content of this view is scrolled
* horizontally.
* {@hide}
*/
@ViewDebug.ExportedProperty(category = "scrolling")
protected int mScrollX;
/**
* The offset, in pixels, by which the content of this view is scrolled
* vertically.
* {@hide}
*/
@ViewDebug.ExportedProperty(category = "scrolling")
protected int mScrollY;
/**
* Return the scrolled left position of this view. This is the left edge of
* the displayed part of your view. You do not need to draw any pixels
* farther left, since those are outside of the frame of your view on
* screen.
*
* @return The left edge of the displayed part of your view, in pixels.
*/
public final int getScrollX() {
return mScrollX;
}
/**
* Return the scrolled top position of this view. This is the top edge of
* the displayed part of your view. You do not need to draw any pixels above
* it, since those are outside of the frame of your view on screen.
*
* @return The top edge of the displayed part of your view, in pixels.
*/
public final int getScrollY() {
return mScrollY;
}
mScrollX:表示离视图起始位置的x水平方向的偏移量
mScrollY:表示离视图起始位置的y垂直方向的偏移量
分别通过getScrollX()
和getScrollY()方法获得。
注意:mScrollX和mScrollY指的并不是坐标,而是偏移量。
/**
* Set the scrolled position of your view. This will cause a call to
* {@link #onScrollChanged(int, int, int, int)} and the view will be
* invalidated.
* @param x the x position to scroll to
* @param y the y position to scroll to
*/
public void scrollTo(int x, int y) {
if (mScrollX != x || mScrollY != y) {
int oldX = mScrollX;
int oldY = mScrollY;
mScrollX = x;
mScrollY = y;
invalidateParentCaches();
onScrollChanged(mScrollX, mScrollY, oldX, oldY);
if (!awakenScrollBars()) {
postInvalidateOnAnimation();
}
}
}
/**
* Move the scrolled position of your view. This will cause a call to
* {@link #onScrollChanged(int, int, int, int)} and the view will be
* invalidated.
* @param x the amount of pixels to scroll by horizontally
* @param y the amount of pixels to scroll by vertically
*/
public void scrollBy(int x, int y) {
scrollTo(mScrollX + x, mScrollY + y);
}
从以上的代码可以看出,
scrollTo 和 scrollBy区别,其实2者的效果是一样的。
scrollTo(int x,int y):
如果偏移位置发生了改变,就会给mScrollX和mScrollY赋新值,改变当前位置。
注意:x,y代表的不是坐标点,而是偏移量。
例如:
我要移动view到坐标点(100,100),那么我的偏移量就是(0,,0) - (100,100) = (-100 ,-100) ,我就要执行view.scrollTo(-100,-100),达到这个效果。
scrollBy(int
x,int y):
从源码中看出,它实际上是调用了scrollTo(mScrollX
+ x, mScrollY + y);
mScrollX
+ x和mScrollY + y,即表示在原先偏移的基础上在发生偏移,通俗的说就是相对我们当前位置偏移。
根据父类VIEW里面移动,如果移动到了超出的地方,就不会显示。
查看上文中的示意图你就会知道大概。
下面通过一个小例子了解下这2个方法之间的的使用,
效果图如下:
核心代码就是本文讲的2个方法,这里就列出代码了。
提供一个简单的DEMO:下载地址
这里大致搞清楚了这2个方法后,对后面的Scroller拖动类以及实现几个拖动效果就更加有帮助了。
分享到:
相关推荐
android 布局之滑动探究 scrollTo 和 scrollBy 方法使用说明 对应的博文地址:http://blog.csdn.net/vipzjyno1/article/details/24577023
Android中滑屏初探 ---- scrollTo 以及 scrollBy方法使用说明 Android中滑屏初探 ---- scrollTo 以及 scrollBy方法使用说明 Android中滑屏初探 ---- scrollTo 以及 scrollBy方法使用说明
博客〈ListView滑动删除实现之二——scrollTo、scrollBy详解〉对应源码,博客地址:http://blog.csdn.net/harvic880925/article/details/45176813
scrollTo和scrollBy Demo演示源码
android scrollTo,scrollBy与Scroller demo 详细介绍地址: http://blog.csdn.net/i7788/article/details/17284899
在一个View中,系统提供了scrollTo、scrollBy两种方式来改变一个View的位置,下面通过本文给大家介绍Android scrollTo和scrollBy方法使用解析,需要的朋友参考下吧
关于自定义视图继承ViewGroup,主要是说明scrollTo、scrollBy、getScrollX、getScrollY这4个方法的含义
Android View api - scrollTo(),scrollBy(),getScrollX(), getScrollY(),博客地址:http://blog.csdn.net/amoscxy/article/details/77191151
ScrollTo ScrollBy 演示
我们的滑动控件如SrollView可以限定宽、高大小,以及在布局中的位置,但是滑动控件中的内容(或者里面的childView)可以是无限长、宽的,我们调用View的scrollTo、scrollBy方法,相当于是移动滑动控件中的画布C
NULL 博文链接:https://onestopweb.iteye.com/blog/2301459
NULL 博文链接:https://ipjmc.iteye.com/blog/1307565
它并不可以使View真正的滑动,而是配合scrollTo/ScrollBy让view产生缓慢的滑动,产生动画的效果,其实和属性动画是同一个原理。在我看来,Scroller跟属性动画的平移的效果是一样的。 如何使用 //①实例一个...
View内部为了实现滑动提供了这两个方法,但是使用这两个方法滑动的效果是瞬间的不够平滑,如何实现View的弹性滑动呢?这正是本博文讨论的主题。另外这两个函数滑动的是View的内容不是View本身。比如对于普通View好比...
继承自ViewGroup然后配合Scroller完成滑动效果 主要弄清楚scrollTo和scrollBy 及scroller的用法即可很容易实现
view的滑动在安卓中特别多,基本有三种方式: 1.通过view本身提供的scrollTo/scrollBy方法实现滑动。 2.通过给view添加平移动画实现滑动。 3.通过改变view的layoutparams使得view重新布局,从而实现滑动。
scrollview的使用。判断scrollview滑动到顶部和底部。scrollTo和scrollBy的区别。
此代码实现了View的滑动,利用三种方法,分别是 ScrollBy/ScrollTo、动画、LayoutParams来滑动的
3.2.1 使用scrollTo/scrollBy 129 3.2.2 使用动画 131 3.2.3 改变布局参数 133 3.2.4 各种滑动方式的对比 133 3.3 弹性滑动 135 3.3.1 使用Scroller 136 3.3.2 通过动画 138 3.3.3 使用延时策略 139 3.4 ...