谈谈 mScrollX


属性的意义


/**

* The offset, in pixels, by which the content of this view is scrolled

* horizontally.

* {@hide}

*/

@ViewDebug.ExportedProperty(category="scrolling")

protected intmScrollX;

手机的展示区域是有限的。当所需展示内容过宽时,有一部分就会被隐藏。

而 mScrollX 就是用来表示被隐藏部分的宽度。


直观的例子1


谈谈 mScrollX_第1张图片

这是 4 个高宽皆为 300 像素的正方形,并排放置在一个线性布局中。

宽度仅有 1080 像素的手机无法完整地展示整个布局,黄色正方形的一部分超出了屏幕。


谈谈 mScrollX_第2张图片

findViewById(R.id.view).scrollTo(300,0);

使用 scrollTo 改变 mScrollX 为 300。

理解方式一,线性布局滚动了 300 像素。

理解方式二,线性布局被隐藏的部分是 300 像素。


直观的例子2


谈谈 mScrollX_第3张图片

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 像素,背景紫色,绘制的内容是居中的红色小圆。


谈谈 mScrollX_第4张图片

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 的原点已经发生了改变。

具体源码尚未找到。

你可能感兴趣的:(谈谈 mScrollX)