在Android View视图是没有边界的,Canvas是没有边界的,只不过我们通过绘制特定的View时对
Canvas对象进行了一定的操作,例如 : translate(平移)、clipRect(剪切)等,以便达到我们的对该Canvas对象绘制的要求 ,我们可以将这种无边界的视图称为“视图坐标”—–它不受物理屏幕限制。通常我们所理解的一个Layout布局文件只是该视
图的显示区域,超过了这个显示区域将不能显示到父视图的区域中 ,对应的,我们可以将这种有边界的视图称为“布局坐标” —— 父视图给子视图分配的布局(layout)大小。
mScrollX: 该视图内容相当于视图起始坐标的偏移量, X轴方向
mScrollY: 该视图内容相当于视图起始坐标的偏移量, Y轴方向
mScrollX 与 mScrollY 代表我们当前偏移的位置
oldX与oldY代表之前的偏移位置
方法:
scrollBy():移动组件滑动位置,会导致onScrollChanged()方法被调用,和视图会被抛弃。在当前视图内容继续偏移(x , y)个单位,显示(可视)区域也跟着偏移(x,y)个单位。
scrollTo():设置组件滑动位置,同上。在当前视图内容偏移至(x , y)坐标处,即显示(可视)区域位于(x , y)坐标处。
调用View的scrollTo()和scrollBy()是用于滑动View中的内容,而不是把某个View的位置进行改变。
例子:
/*这个方法是发生在左右滑动组件,设置其左右边界,使之到达边界时不超过边界,边界值视具体情况而定*/
private void handleMove(MotionEvent ev){
final int historySize = ev.getHistorySize();
final int pointerCount = ev.getPointerCount();
float tx = 0,ty = 0;
for(int h=0;h<historySize;h++){
for(int p=0;p<pointerCount;p++){
tx = ev.getHistoricalX(p, h);
ty = ev.getHistoricalY(p, h);
/*使用getScrollX获得当前滚动组件左边的坐标,小于0则超出了左边界,大于?值则超出了右边界/
if(this.getScrollX() < 0) {
scrollTo(0, 0);
continue;
}else if(this.getScrollX() > this.getWidth()/3*2) {
scrollTo(this.getWidth()/3*2,0);
continue;
}
this.scrollBy((int) (x-tx),0);
x = tx;
y = ty;
}
}
for(int p = 0;p<pointerCount;p++){
tx = ev.getX(p);
ty = ev.getY(p);
if(this.getScrollX() < 0) {
scrollTo(0,0);
continue;
} else if(this.getScrollX() > this.getWidth()) {
scrollTo(this.getWidth(),0);
continue;
}
this.scrollBy((int)(x-tx),0);
x = tx;
y = ty;
}
}