3d中的Android视图组旋转

3d中的Android视图组旋转,android,3d,rotation,Android,3d,Rotation,我想在android中旋转我自己的3d框架布局。我必须使用GLSURFACHEVIEW类吗。我是计算机图形学新手,但知道旋转和平移背后的理论。为了进行3d opengl旋转,我们通常会执行以下操作 在活动类中,我们创建一个GLSurfaceView对象并设置其渲染器。Renderer对象是从实现GLSURFACHEVIEW.Renderer接口的类创建的 @Override public void onCreate(Bundle savedInstanceState) { super.o

我想在android中旋转我自己的3d框架布局。我必须使用GLSURFACHEVIEW类吗。我是计算机图形学新手,但知道旋转和平移背后的理论。为了进行3d opengl旋转,我们通常会执行以下操作

在活动类中,我们创建一个GLSurfaceView对象并设置其渲染器。Renderer对象是从实现GLSURFACHEVIEW.Renderer接口的类创建的

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GLSurfaceView view = new GLSurfaceView(this);
    view.setRenderer(new OpenGLRenderer());
    setContentView(view);
}
在我们的渲染器类中,我们使用以下方法绘制图形、旋转和平移

// Called when the surface is created or recreated.
public void onSurfaceCreated(GL10 gl, EGLConfig config) 

// Called to draw the current frame.
public void onDrawFrame(GL10 gl)

// Called when the surface changed size.
public void onSurfaceChanged(GL10 gl, int width, int height)
但是,我有一个自定义的framelayout,声明为

public class RotatedMapView extends FrameLayout
我想说:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    RotatedMapView  view = new RotatedMapView (this);
    view.setRenderer(new OpenGLRenderer());
    setContentView(view);
}
但我不能,因为setRenderer是GlSurfaceView的专用工具。我现在正在浏览GlSurfaceView.java源代码,以便使其适应我的设计。我为GlSurfaceVİew.java找到的链接是 源代码太长。事实上,我并不懒得阅读它,但我想确定我的方式是否正确。

框架布局(以及任何扩展视图)设计为在二维画布元素上绘制。使用openGL绘制这些图形是不可能的。如果您想在3D/GL中绘制GUI,那么您必须从头开始编写代码,或者找到一个已经这样做的库。我肯定有一些,但我还没有必要

通过使用缩放动画,您可以在视图上获得一些假3D效果,但这些效果只有在动画完成得很快,用户不会注意到的情况下才会起作用。这可能不是你想要的

<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
    android:fromXScale="1.0" android:toXScale="0.0"
    android:fromYScale="1.0" android:toYScale="1.0"
    android:pivotX="50%" android:pivotY="0%"
    android:duration="@android:integer/config_shortAnimTime"
/>


现在我在看我从未使用过的动画。在api演示中,有一个y轴上的旋转示例。我想在x上旋转。对于负角度,它是成功的,但在正方向,它会消失在视图中。函数如下所示

@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
    final float fromDegrees = mFromDegrees;
    float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime);

    final float centerX = mCenterX;
    final float centerY = mCenterY;
    final Camera camera = mCamera;

    final Matrix matrix = t.getMatrix();

    camera.save();
    if (mReverse) {
        camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime);
    } else {
        camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime));
    }
    camera.rotateY(degrees);
    `camera.rotateX(degrees);  //i want to do this it works for negative but not` //positive angles 

camera.getMatrix(matrix);
camera.restore();

matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);

}

事实上,我需要在3d中旋转mapview。有办法吗?你可以尝试使用上面的动画。这将围绕y轴进行半3D旋转。如果您想要比luckYou更好的东西,可以说任何扩展视图的设计都是为了在2d的画布元素上绘制,但是GLSURFACHEVIEW也扩展了SURFACHEVIEW,它扩展了视图。关键点是渲染器对象。GLSURFACHEVIEW与其他视图不同,因为它具有渲染器对象。我不确定您是否正确。@kml\u ckr您找到任何解决方案了吗?@skorulis您的动画给了我错误未知的动画师名称:scale我想在x轴上应用这个。它适用于负角度,但不适用于正角度。。