Я хочу повернуть свой собственный FrameLayout в 3d в android. Должен ли я использовать класс GlSurfaceView. Я новичок в компьютерной графике, но знаю теорию вращения и переводов. Для того, чтобы сделать 3d opengl вращения, мы делаем следующее.
В классе активности мы создаем объект GLSurfaceView и устанавливаем его средство визуализации. Объект Renderer создается из класса, который реализует интерфейс 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)
Однако у меня есть пользовательская функция frameelayout, которая объявляется как
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 Источник слишком длинный. На самом деле я не ленив читать, но я хочу быть уверенным, правильно ли я.
Framelayouts (и любой расширяемый вид) предназначены для рисования на элементе 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"
/>
Теперь я смотрю анимации, которые я никогда не использовал. В api demos есть пример вращения по оси 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);
}