2011-03-22 87 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