Android ViewGroup Вращение в 3d - PullRequest
       19

Android ViewGroup Вращение в 3d

1 голос
/ 23 марта 2011

Я хочу повернуть свой собственный FrameLayout в 3d в Android. Должен ли я использовать класс GlSurfaceView. Я новичок в компьютерной графике, но знаю теорию вращений и переводов. Чтобы сделать 3d ротацию opengl, мы обычно делаем следующее.

В классе деятельности мы создаем объект GLSurfaceView и устанавливаем его средство визуализации. Объект рендерера создается из класса, который реализует интерфейс GlSurfaceView.Renderer.

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GLSurfaceView view = new GLSurfaceView(this);
    view.setRenderer(new OpenGLRenderer());
    setContentView(view);
}

В нашем классе Renderer мы выполняем чертежи, вращения и переводы следующими методами

// 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

Я хочу сделать это:

@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 Источник слишком длинный. На самом деле мне не лень это читать, но я хочу быть уверенным, правильно ли я поступаю.

Ответы [ 2 ]

2 голосов
/ 24 марта 2011

Теперь я смотрю анимации, которые никогда не использовал.В демоверсиях API есть пример поворота по оси Y.Я хочу сделать вращение над х.Это успешно для отрицательных углов, но в положительном направлении это исчезает из вида.Функция ниже.

@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 голосов
/ 23 марта 2011

Framelayouts (и все, что расширяет View) предназначены для рисования на элементе Canvas в 2D.Невозможно нарисовать их, используя 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"
/>

...