android 3d垂直旋转木马视图
我正在使用代码创建垂直旋转木马视图。我可以看到垂直旋转木马使用下面代码中的更改,但中心项目未正确放置在屏幕中,如果列表项目大小增加,则直径向上移动android 3d垂直旋转木马视图,android,carousel,coverflow,Android,Carousel,Coverflow,我正在使用代码创建垂直旋转木马视图。我可以看到垂直旋转木马使用下面代码中的更改,但中心项目未正确放置在屏幕中,如果列表项目大小增加,则直径向上移动 private void setUpChild(CarouselImageView child, int index, float angleOffset) { // Ignore any layout parameters for child, use wrap content addViewInLayout(child, -1 /*ind
private void setUpChild(CarouselImageView child, int index, float angleOffset) {
// Ignore any layout parameters for child, use wrap content
addViewInLayout(child, -1 /*index*/, generateDefaultLayoutParams());
child.setSelected(index == mSelectedPosition);
int h;
int w;
if (mInLayout)
{
h = (getMeasuredHeight() - getPaddingBottom()-getPaddingTop())/3;
w = getMeasuredWidth() - getPaddingLeft() - getPaddingRight()/3;
}
else
{
h = (getMeasuredHeight() - getPaddingBottom()-getPaddingTop())/3;
w = getMeasuredWidth() - getPaddingLeft() - getPaddingRight()/3;
}
child.setCurrentAngle(angleOffset);
// modify the diameter.
Calculate3DPosition(child, w*(getAdapter().getCount()/4), angleOffset);
// Measure child
child.measure(w, h);
int childLeft;
// Position vertically based on gravity setting
int childTop = calculateTop(child, true);
childLeft = 0;
child.layout(childLeft, childTop, w, h);
}
calculate3position
功能的更改如下
float x = (float) (-diameter/2 * Math.cos(angleOffset) * 0.00001);
float z = diameter/2 * (1.0f - (float)Math.cos(angleOffset));
float y = (float) (diameter/2 * Math.sin(angleOffset)) + diameter/2 - child.getWidth();
child.setX(x);
child.setZ(z);
child.setY(y);
我认为这个计算:
float x = (float) (-diameter/2 * Math.cos(angleOffset) * 0.00001);
float z = diameter/2 * (1.0f - (float)Math.cos(angleOffset));
float y = (float) (diameter/2 * Math.sin(angleOffset)) + diameter/2 - child.getWidth();
应该是这样的:
float x = 0.0f
float z = diameter/2.0f * (1.0f - (float)Math.cos(angleOffset));
float y = (diameter/2.0f * Math.sin(angleOffset)) + diameter/2.0f - child.getHeight()/2.0f;
您的x位置应始终为零,y位置应基于sin,并应偏移子对象高度的1/2,而不是宽度的1/2。您好请尝试此代码,并在您的Calculate3DPosition方法中替换为此代码
angleOffset = angleOffset * (float) (Math.PI / 180.0f);
float y = (float) (((diameter * 60) / 100) * Math.sin(angleOffset)) + ((diameter * 50) / 100);
float z = diameter / 2 * (1.0f - (float) Math.cos(angleOffset));
float x = (float) (((diameter * 5) / 100) * Math.cos(angleOffset) * 0.3);
child.setItemX(x);
child.setItemZ((z * 30) / 100);
child.setItemY(-(y));
它解决了我的问题请试试这个谢谢你的回复,我尝试了上面的计算,但它不起作用:这对我来说是一个非常令人惊讶的结果。也许我不理解那个演示的坐标系。您是否尝试添加宽度偏移?如下所示:float y=(diameter/2.0f*Math.sin(angleOffset))+diameter/2.0f+child.getHeight()/2.0f;是的,我也试过。如果我做y=y-250,那么我可以看到中间位置的列表项,但它不支持多屏幕分辨率和列表项的数量。你找到解决方案了吗。?