屬性的意義
/**
* The offset, in pixels, by which the content of this view is scrolled
* horizontally.
* {@hide}
*/
@ViewDebug.ExportedProperty(category="scrolling")
protected intmScrollX;
手機的展示區域是有限的。當所需展示內容過寬時,有一部分就會被隱藏。
而 mScrollX 就是用來表示被隱藏部分的寬度。
直觀的例子1
這是 4 個高寬皆為 300 像素的正方形,并排放置在一個線性布局中。
寬度僅有 1080 像素的手機無法完整地展示整個布局,黃色正方形的一部分超出了屏幕。
findViewById(R.id.view).scrollTo(300,0);
使用 scrollTo 改變 mScrollX 為 300。
理解方式一,線性布局滾動了 300 像素。
理解方式二,線性布局被隱藏的部分是 300 像素。
直觀的例子2
Paint paint= new Paint();
@Override
protected void onDraw(Canvas canvas) {
paint.setAntiAlias(true);
paint.setColor(Color.RED);
canvas.drawCircle(150,150,100,paint);
}
View 高寬皆為 300 像素,背景紫色,繪制的內容是居中的紅色小圓。
findViewById(R.id.custom).scrollTo(150,0);
滾動的只是內容,mScrollX 對背景沒有影響。
原理的揣測
final intscrollX =mScrollX;
final intscrollY =mScrollY;
if((scrollX | scrollY) ==0) {
background.draw(canvas);
}else{
canvas.translate(scrollX,scrollY);
background.draw(canvas);
canvas.translate(-scrollX,-scrollY);
}
當繪制背景時,有意的調整了 canvas 的原點。
這說明在繪制背景前 canvas 的原點已經發生了改變。
具體源碼尚未找到。