在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;
}
}