我会尽力解释我遇到的问题。
我有商品的列表视图。
只要运行scrollHorizontally
,就会触发以下功能。
功能setChildOffsets
private void setChildOffsets(@Dimension int radius, Point center, int peekDistance) {
for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
final int yOffset = (int) resolveOffsetY(radius, child.getX() + child.getWidth() / 2, center, i);
final int y = getHeight() - yOffset - child.getHeight();
child.layout(child.getLeft(), y, child.getRight(), child.getHeight() + y);
}
}
如您所见,该功能正在浏览屏幕上可见列表的每个项目。然后设置y偏移。我怀疑这就是问题所在。 请参见下面的resolveOffsetY函数:
功能resolveOffsetY
private double resolveOffsetY(double radius, double viewX, Point center, int child) {
final double adjacent = Math.abs(center.x - viewX);
final double radiusSquared = radius * radius;
final double adjacentSquared = adjacent * adjacent;
final double oppositeSideLength = Math.sqrt(radiusSquared - adjacentSquared);
return oppositeSideLength;
}
此函数基本上检索每个项目应位于的Y距离。从数学上讲,我们使用毕达哥拉斯(Pythagora),并使用斜边(radiusSquared
)和相邻的(adjacentSquared
)来找到相反的一面,即该项的“高度”。
回到setChildOffsets
,一旦确定了项目应达到的高度,便通过从布局高度中减去所得到的值来计算其在显示中的实际高度。
最后,我们在布局中设置子项。
问题是项目之间的角度不相等,并且会产生不想要的效果,您可以看到左右两个项目与其他项目相比,它们与邻居之间的距离更远。红色圆圈是项目旋转的中心。 https://imgur.com/a/6Xtp19c
我数学不好,但是我敢肯定,有一种方法可以使这些项目围绕圆以均匀的圆形方式运动,以使项目之间保持相等的角度。
我将不胜感激。
谢谢!