Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
android 3d垂直旋转木马视图_Android_Carousel_Coverflow - Fatal编程技术网

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,那么我可以看到中间位置的列表项,但它不支持多屏幕分辨率和列表项的数量。你找到解决方案了吗。?