@dim9044

Как вставить OpenGL ES в XML?

Я делал анимацию с помощью класса View, но так у меня подвисала анимация, мне посоветовали использовать OpenGl ES. Моя анимация располагается на 1/4 экрана и я ее вставлял через XML разметку таким образом:
<?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:baselineAligned="false">


        <ScrollView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#bbf"
            android:layout_weight="1">
            .
            .
            .
        </ScrollView>

        <ru.dima_n.elem.Anim
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/game_view"
            android:layout_weight="2"
            android:onClick="OnClickAnim"
            android:background="#000"/>

    </LinearLayout>


Я пробовал так же вставить класс OpenGl но у меня была ошибка что класс не view и не может быть отображен. Я попробовал сделать так: в XML вставляю класс View и в нем запускаю OpenGL анимацию
XML разметка:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity"
    android:orientation="horizontal">


    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/scrollView"
        android:layout_weight="1"
        android:background="#000"/>

    <ru.dima_n.opengl.Anim
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/game_view"
        android:layout_weight="2"
        android:background="#ff0360ff"

    />

</LinearLayout>


Класс Anim:
public class Anim extends View
{
    GLSurfaceView glSurfaceView;
    nRender renderer;

    public Anim(Context context, AttributeSet attrs)
    {
        super(context, attrs);

        try{	// пытаемся инициализировать OpenGL
            glSurfaceView = new GLSurfaceView(context);

            glSurfaceView.setEGLContextClientVersion(2);

            renderer = new nRender();

            glSurfaceView.setRenderer(renderer);

            glSurfaceView.setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY); 
           
            Log.e("удачно", "3456");

        }catch(RuntimeException e){
            Log.e("error","error");
        } 

    }
}


Класс nRender:
public class nRender implements GLSurfaceView.Renderer
{
    GLSurfaceView glSurfaceView;

    public nRender()
    {
    }

    public void onDrawFrame(GL10 glUnused) {
        Random rnd = new Random();

        GLES20.glClearColor(((float)rnd.nextInt(2)/2.0f), ((float)rnd.nextInt(2)/2.0f), ((float)rnd.nextInt(2)/2.0f), 1.0f);
        Log.e("test","color"); // этот лог не выводиться
        GLES20.glClear( GLES20.GL_COLOR_BUFFER_BIT ); 
    }

    public void onSurfaceChanged(GL10 glUnused, int width, int height) { 
        GLES20.glViewport(0, 0, width, height);
        
    }

    public void onSurfaceCreated(GL10 glUnused, EGLConfig config) { 

    }
}


При запуске у меня открывается приложение без ошибок я получаю лог удачной инициализации OpenGL и все, анимация не происходит, и логов из класса nRender я не получаю.

Подскажите в чем может быть ошибка, или может я вообще не так делаю.

Заранее спасибо.
  • Вопрос задан
  • 408 просмотров
Пригласить эксперта
Ответы на вопрос 1
orcDamnar
@orcDamnar
Java, C/C++, Android SDK
Ну изначально не верно то, что вы пытаетесь проинициализировать SurfaceView в конструкторе view и таким образом получаете объект, но не получаете его в своей иерархии представлений. Для реализации вашей проблемы можно использовать GLSurfaceView или SurfaceView но выше вью должно быть, например, отнаследовано от GLSurfaceView. Более подробно developer.android.com/reference/android/opengl/GLS...
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы