属性的意义
/**
* 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 的原点已经发生了改变。
具体源码尚未找到。