2011-03-22 134 views
1

我想在android中以3D旋转我自己的FrameLayout。我必须使用GlSurfaceView类吗?我是计算机图形学的新手,但知道旋转和翻译背后的理论。为了进行3D opengl旋转,我们通常会进行以下操作。Android ViewGroup 3D旋转

在活动类中,我们创建一个GLSurfaceView对象并设置其渲染器。 Renderer对象是从实现GlSurfaceView.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) 

然而,随着

public class RotatedMapView extends FrameLayout 

我要让我有被宣告自定义的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找到的链接是http://code.google.com/p/apps-for-android/source/browse/trunk/SpriteMethodTest/src/com/android/spritemethodtest/GLSurfaceView.java?r=150 来源太长。事实上,我并不懒得阅读它,但我想确定我是否以正确的方式。

回答

0

Framelayouts(以及任何扩展视图)都被设计为在2D中的Canvas元素上绘制。使用openGL绘制这些图形是不可能的。如果你想在3D/GL中绘制一个图形用户界面,那么你必须从头开始编写代码或找到一个已经完成了这个工作的库。我确信那里有几个,但我还没有需要。

通过使用缩放动画,您可以在视图上获得一些假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" 
/> 

+0

其实我需要在3D旋转的MapView。有没有办法做到这一点? – 2011-03-22 23:48:02

+0

您可以尝试使用上述动画。这将围绕y轴进行半3D旋转。如果你想要什么比你运气好 – skorulis 2011-03-22 23:56:00

+0

你说扩展视图的任何东西都被设计成在2d的canvas元素上绘制,但是glsurfaceview也扩展了viewview,它扩展了视图。关键点是渲染器对象。 Glsurfaceview与其他视图不同,因为它具有渲染器对象。我不确定你是否正确。 – 2011-03-25 07:36:48

2

现在我在看,我从来没有使用动画。在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); 

}

+0

我想申请这个http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/animation/Transition3d.html在x轴上。它适用于负角度,但不适合正角度。 – 2011-03-24 11:55:27