質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.85%

  • Android Studio

    3279questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

activity_main.xmlで表示したい

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 325
退会済みユーザー

退会済みユーザー

回転をした立体を表示するアプリを作っているのですが、
MainActivity.javaに

GLView view = new GLView(this);
setContentView(view);


と渡しているのでGLViewが表示されactivity_main.xmlが表示されません。

activity_main.xmlのGLViewというところにGLVewクラスを渡して表示したいです。
どうしたらよいですか。
MainActivity.java

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

public class MainActivity extends AppCompatActivity {

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


GLView.java

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.content.Context;
import android.opengl.GLSurfaceView;
import android.util.Log;

class GLView extends GLSurfaceView implements GLSurfaceView.Renderer {


    private static final String TAG = "GLVIEW";



    private Cube mCube;

    public GLView(Context context) {
        super(context);

        setRenderer(this);

    }


    public void onDrawFrame(GL10 gl) {
        Log.i(TAG, "onDrawFrame()");

        gl.glClearColor(0, 0, 1, 1.0f);

        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

        gl.glEnable(GL10.GL_DEPTH_TEST);

        gl.glMatrixMode(GL10.GL_MODELVIEW);

        gl.glLoadIdentity();



        mCube.draw(gl);

    }


    public void onSurfaceChanged(GL10 gl, int width, int height) {
        Log.i(TAG, "onSurfaceChanged()");


        gl.glEnable(GL10.GL_CULL_FACE);

        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

        gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

        gl.glViewport(0, 0, width, height);

        gl.glMatrixMode(GL10.GL_PROJECTION);

        gl.glLoadIdentity();

        float ratio = (float) width / height;

        float size = 0.01f * (float) Math.tan((70.0f / 180.0f / 3.141592f) / 2.0);

        gl.glFrustumf(-size, size, -size / ratio, size / ratio, 0.01f, 100.0f);

        // gl.glOrthof(-1, 1, -1.0f/ratio, 1.0f/ratio, 0.01f, 100.0f);
    }


    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
        Log.i(TAG, "onSurfaceCreated()");
        mCube = new Cube(gl, getResources());
    }

    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        Log.i(TAG, "onDetachedFromWindow()");
    }

}


Cube.java

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.nio.ShortBuffer;

import javax.microedition.khronos.opengles.GL10;

import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.opengl.GLUtils;

class Cube {

    private FloatBuffer mVertexBuffer;
    private FloatBuffer mNormalBuffer;
    private ShortBuffer mIndexBuffer;
    private FloatBuffer mTextureBuffer;

    private int numberOfindex = 36;

    private int textureId;


    private float angle = 0f;

    public Cube(GL10 gl, Resources r) {
        float x = 2f;
        float y = 2f;
        float z = 0.1f;

        float[] vertices = {
                x, y, z,  -x, y, z,  -x,-y, z,   x,-y, z,  // v0-v1-v2-v3 front
                x, y, z,   x,-y, z,   x,-y,-z,   x, y,-z,  // v0-v3-v4-v5 right
                x, y, z,   x, y,-z,  -x, y,-z,  -x, y, z,  // v0-v5-v6-v1 top
                -x, y, z,  -x, y,-z,  -x,-y,-z,  -x,-y, z,  // v1-v6-v7-v2 left
                -x,-y,-z,   x,-y,-z,   x,-y, z,  -x,-y, z,  // v7-v4-v3-v2 bottom
                x,-y,-z,  -x,-y,-z,  -x, y,-z,   x, y,-z   // v4-v7-v6-v5 back
        };
        //テクスチャUV座標
        float[] textures = {
                1, 0,   0, 0,   0, 1,   1, 1,  // v0-v1-v2-v3 front
                0, 0,   0, 1,   1, 1,   1, 0,  // v0-v3-v4-v5 right
                0, 1,   1, 1,   0, 0,   1, 0,  // v0-v5-v6-v1 top
                1, 0,   0, 0,   0, 1,   1, 1,  // v1-v6-v7-v2 left
                0, 1,   1, 1,   1, 0,   0, 0,  // v7-v4-v3-v2 bottom
                0, 1,   1, 1,   1, 0,   0, 0   // v4-v7-v6-v5 back
        };

        float[] normals = {
                0, 0, 1,   0, 0, 1,   0, 0, 1,   0, 0, 1,   // v0-v1-v2-v3 front
                1, 0, 0,   1, 0, 0,   1, 0, 0,   1, 0, 0,   // v0-v3-v4-v5 right
                0, 1, 0,   0, 1, 0,   0, 1, 0,   0, 1, 0,   // v0-v5-v6-v1 top
                -1, 0, 0,  -1, 0, 0,  -1, 0, 0,  -1, 0, 0,   // v1-v6-v7-v2 left
                0,-1, 0,   0,-1, 0,   0,-1, 0,   0,-1, 0,   // v7-v4-v3-v2 bottom
                0, 0,-1,   0, 0,-1,   0, 0,-1,   0, 0,-1    // v4-v7-v6-v5 back
        };

        short indices[] = {
                0, 1, 2,   0, 2, 3,   // front
                4, 5, 6,   4, 6, 7,   // right
                8, 9,10,   8,10,11,   // top
                12,13,14,  12,14,15,   // left
                16,17,18,  16,18,19,   // bottom
                20,21,22,  20,22,23    // back
        };

        mVertexBuffer = makeFloatBuffer(vertices);

        mNormalBuffer = makeFloatBuffer(normals);

        mIndexBuffer = makeShortBuffer(indices);

        mTextureBuffer = makeFloatBuffer(textures);

        textureId = loadTexture(gl, r, R.drawable.anayuki);
    }



    public static final FloatBuffer makeFloatBuffer(float[] arr) {
        ByteBuffer bb = ByteBuffer.allocateDirect(arr.length * 4);
        bb.order(ByteOrder.nativeOrder());
        FloatBuffer fb = bb.asFloatBuffer();
        fb.put(arr);
        fb.position(0);
        return fb;
    }

    public static final ShortBuffer makeShortBuffer(short[] arr) {
        ByteBuffer bb = ByteBuffer.allocateDirect(arr.length * 4);
        bb.order(ByteOrder.nativeOrder());
        ShortBuffer fb = bb.asShortBuffer();
        fb.put(arr);
        fb.position(0);
        return fb;
    }

    public void draw(GL10 gl) {

        gl.glTranslatef(0, 0, -30.0f);

        gl.glRotatef(angle++, 0, 1, 0);

        gl.glEnable(GL10.GL_TEXTURE_2D);

        gl.glBindTexture(GL10.GL_TEXTURE_2D, textureId);

        gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mVertexBuffer);

        gl.glNormalPointer(GL10.GL_FLOAT,0,mNormalBuffer);
        gl.glEnableClientState(GL10.GL_NORMAL_ARRAY);

        gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTextureBuffer);


        gl.glDrawElements(GL10.GL_TRIANGLES, numberOfindex, GL10.GL_UNSIGNED_SHORT, mIndexBuffer);

    }

    public static final int loadTexture(GL10 gl, Resources r, int resId) {
        int[] textures = new int[1];


        BitmapFactory.Options options = new BitmapFactory.Options();

        options.inScaled = false;

        options.inPreferredConfig = Config.ARGB_8888;

        Bitmap bmp = BitmapFactory.decodeResource(r, resId, options);
        if (bmp == null) {
            return 0;
        }


        gl.glGenTextures(1, textures, 0);
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bmp, 0);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
        gl.glBindTexture(GL10.GL_TEXTURE_2D, 0);

        bmp.recycle();

        return textures[0];
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:baselineAligned="false">

    <GLView
        android:id="@+id/GLView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <Button
            android:id="@+id/button1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="メモ"
            android:onClick="buttonClick" />

    </RelativeLayout>
</FrameLayout>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

「今まで開いていたファイルを渡して表示したいです。 」の意味はわかりませんが、今のactivity_main.xmlをsetContentViewに渡すとエラーで落ちるはずです。
GLViewにContextとAttributeSetの引数をもつコンストラクタをオーバーライドしてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/13 10:12

    よくわからないのですがこれを足すということであってますか
    @Override
    context(){}

    @Override
    AttributeSet(){}

    キャンセル

  • 2017/01/13 10:37

    全く違います。
    @Override
    GLView(Context context ,AttributeSet set)

    キャンセル

  • 2017/01/13 11:11

    はい。直しておきました。
    MainActivityクラスにそのまま入れたら赤い波線が出てきたので調べてきます。
    またわからなくなったら質問します。

    キャンセル

  • 2017/01/13 11:25

    GLViewのコンストラクタの話をしているのに、なぜMainActivityにいれるんですか。

    キャンセル

  • 2017/01/13 11:35 編集

    GLViewクラスの中のどこに入れても@Overrideの所に赤い波線が出るのでという部分が抜けていました。

    キャンセル

  • 2017/01/16 10:15

    オーバーライドじゃなくてオーバーロードかと。

    GLView(Context context ,AttributeSet set)

    キャンセル

  • 2017/01/16 10:22

    もともとViewクラスでコンストラクタが定義されているので、この場合はオーバーライドであっていると思いますよ。

    コンストラクタにはオーバーライドっていい方を使わないんでしたっけ。ど忘れしました。

    キャンセル

  • 2017/01/16 11:18

    yonaさんがオーバーライドと言いたくなる気持ちはわかります。super呼んでるし。

    でもコンストラクタの前に@Overrideをつけたら、Eclipseだと「The annotation @Override is disallowed for this location」 javacだと「エラー: 注釈型はこの種類の宣言に使用できません」「annotation type not applicable to this kind of declaration」と怒られました。Override.java を見ると Target=METHOD だけで Target=CONSTRUCTOR がないのでエラーになってしまいます。「コンストラクタには@Overrideアノテーションを付けられない」という制約があります。なんでだろうか……。
    http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/file/0e4fc29a5ce4/src/share/classes/java/lang/Override.java#l49

    キャンセル

  • 2017/01/16 13:04

    コンストラクタをオーバーライドって言わない気がしますね
    静的メソッドみたいなもんですし。

    キャンセル

  • 2017/01/16 13:11

    よく見たら私のコメントに@Overrideって書いてますね。気づきませんでした、ごめんなさい。

    キャンセル

  • 2017/01/16 23:48

    とりあえず表示はできました

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.85%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Android Studio

    3279questions

    Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。