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

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

ただいまの
回答率

90.46%

  • Java

    16235questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android Studio

    4375questions

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

  • XML

    769questions

    XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

surfaceview内に表示されない

受付中

回答 1

投稿 編集

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

退会済みユーザー

お世話になります

今、この画像のような状態で、下にボタンを付けていくつもりなのですが、
イメージ説明

しかしどこを変えたらいいかわからずこのようになってしまっています。どこを変えたらいいかわかりますか?
イメージ説明

少し雑ですがこういう風に灰色のsurfaceview内に表示したいと思っています
イメージ説明

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:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.pc632g.a3d.ds"
    android:orientation="vertical"
    android:weightSum="2">

    <SurfaceView
        android:layout_width="fill_parent"
        android:layout_weight="1"
        android:layout_height="0dp"
        android:id="@+id/surfaceView2"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentTop="true"
        android:layout_above="@+id/button3" />

</LinearLayout>

javaファイル

import java.nio.ByteOrder;
import java.nio.FloatBuffer;
import java.util.List;

import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.opengl.GLSurfaceView;
import android.opengl.GLU;
import android.opengl.GLSurfaceView.Renderer;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.util.Log;
import android.widget.Toast;

public class MainActivity extends Activity {
 private MainSurface surface = null;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);

  //画面の向きを縦に固定
  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

  surface = new MainSurface(getApplicationContext());
  surface.setRenderer(surface);
  surface.setFocusable(true);
  surface.setKeepScreenOn(true);
  setContentView(surface);
 }

 @Override
 protected void onResume() {
  super.onResume();
  surface.onResume();
 }

 @Override
 protected void onPause() {
  super.onPause();
  surface.onPause();
 }

 private class MainSurface extends GLSurfaceView implements Renderer, SensorEventListener {
  //センサー
  private SensorManager sensorManager = null;
  //センサーのフラグ
  private boolean sensorMRegisted = false;
  private boolean sensorARegisted = false;

  //回転行列
  private static final int MATRIX_SIZE = 16;
  float[] inR = new float[MATRIX_SIZE];
  float[] outR = new float[MATRIX_SIZE];
  float[] I = new float[MATRIX_SIZE];

  //センサーの値保持
  private float[] orientationValues = new float[3];
  private float[] magneticValues = new float[3];
  private float[] accelerometerValues = new float[3];

  //傾きの角度
  private int[] orientDgrees = new int[3];

  //ポリゴン
  private float box[] = new float[] {
   //前面
   -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f,
   //背面
   -0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f,
   //左面
   -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f,
   //右面
   0.5f, -0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, 0.5f, 0.5f,
   //上面
   -0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f,
   //下面
   -0.5f, -0.5f, 0.5f, -0.5f, -0.5f, -0.5f, 0.5f, -0.5f, 0.5f, 0.5f, -0.5f, -0.5f, 
  };

  private FloatBuffer cubeBuff; //頂点座標バッファ

  public MainSurface(Context context) {
   super(context);
   Log.d(MainSurface.class.getName(), "constractor");

   //バッファの生成
   cubeBuff = makeFloatBuffer(box);
  }

  @Override
  public void onSurfaceCreated(GL10 gl, EGLConfig config) {
   Log.d(MainSurface.class.getName(), "onSurfaceCreated");
  }

  @Override
  public void onDrawFrame(GL10 gl) {
   //背面塗り潰し
   gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

   //モデルビュー行列の指定
   gl.glMatrixMode(GL10.GL_MODELVIEW);
   gl.glLoadIdentity();
   GLU.gluLookAt(gl, 0, 0, 3, 0, 0, 0, 0, 1, 0);

   //頂点配列の指定
   gl.glVertexPointer(3, GL10.GL_FLOAT, 0, cubeBuff);
   gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

   gl.glPushMatrix();

   gl.glRotatef(orientDgrees[1], -1.0f, 0.0f, 0.0f);
   gl.glRotatef(orientDgrees[2], 0.0f, -1.0f, 0.0f);
   gl.glRotatef(orientDgrees[0], 0.0f, 0.0f, -1.0f);

   //前面と背面のプリミティブの描画
   gl.glColor4f(1.0f, 0, 0, 1.0f);
   gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
   gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 4, 4);

   //左面と右面のプリミティブの描画
   gl.glColor4f(0, 1.0f, 0, 1.0f);
   gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 8, 4);
   gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 12, 4);

   //上面と下面のプリミティブの描画
   gl.glColor4f(0, 0, 1.0f, 1.0f);
   gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 16, 4);
   gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 20, 4);

   gl.glPopMatrix();
  }

  @Override
  public void onSurfaceChanged(GL10 gl, int width, int height) {
   // ここから四角形を表示?
   gl.glMatrixMode(GL10.GL_PROJECTION);
   gl.glLoadIdentity();
   gl.glViewport(0, 0, width, height);
   GLU.gluPerspective(gl, 45.0f, ((float) width) / height, 1f, 100f);

   //背面塗り潰し色の指定
   gl.glClearColor(1.0f, 1.0f, 1.0f, 1.0f);

   //デプスバッファ
   gl.glEnable(GL10.GL_DEPTH_TEST);
   gl.glEnable(GL10.GL_CULL_FACE);
   gl.glDepthFunc(GL10.GL_LEQUAL);
   gl.glClearDepthf(1.0f);

   //シェーディング
   gl.glShadeModel(GL10.GL_SMOOTH);
  }

  @Override
  public void onResume() {
   super.onResume();

   //センサーのインスタンス初期化
   if (sensorManager == null) {
    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
   }

   //磁界センサーのリスナー登録
   List<Sensor> sensorsMagnetic = sensorManager.getSensorList(Sensor.TYPE_MAGNETIC_FIELD);
   //加速度センサーのリスナー登録
   List<Sensor> sensorsAcceler = sensorManager.getSensorList(Sensor.TYPE_ACCELEROMETER);

   if (sensorsMagnetic.size() > 0 && sensorsAcceler.size() > 0) {
    sensorMRegisted = sensorManager.registerListener(this, sensorsMagnetic.get(0), SensorManager.SENSOR_DELAY_FASTEST);
    sensorARegisted = sensorManager.registerListener(this, sensorsAcceler.get(0), SensorManager.SENSOR_DELAY_FASTEST);
   } else {
    //センサーが不足していればメッセージを表示
    Toast.makeText(getApplicationContext(), "Sensors are running short!", Toast.LENGTH_LONG).show();
   }
  }

  @Override
  public void onPause() {
   super.onPause();

   //センサー解除
   if (sensorMRegisted || sensorARegisted) {
    sensorManager.unregisterListener(this);
    sensorMRegisted = false;
    sensorARegisted = false;
   }
  }

  /*
   * onSensorChanged()はセンサの値が変更された際に呼び出されるメソッド
   */
  @Override
  public void onSensorChanged(SensorEvent event) {
   switch (event.sensor.getType()) {
   case Sensor.TYPE_MAGNETIC_FIELD:
    magneticValues = event.values.clone();
    break;
   case Sensor.TYPE_ACCELEROMETER:
    accelerometerValues = event.values.clone();
    break;
   }

   //センサーから得た値を端末の傾き角度に変換する処理
   if (magneticValues != null && accelerometerValues != null) {
    SensorManager.getRotationMatrix(inR, I, accelerometerValues, magneticValues);
    //Activityの表示が縦固定の場合。横向きになる場合は要修正
    SensorManager.remapCoordinateSystem(inR, SensorManager.AXIS_X, SensorManager.AXIS_Z, outR);

    SensorManager.getOrientation(outR, orientationValues);

    //ラジアンを角度に変換
    orientDgrees[0] = (int) Math.toDegrees(orientationValues[0]);
    orientDgrees[1] = (int) Math.toDegrees(orientationValues[1]);
    orientDgrees[2] = (int) Math.toDegrees(orientationValues[2]);
   }
  }

  @Override
  public void onAccuracyChanged(Sensor sensor, int accuracy) {
  }
 }

 private static FloatBuffer makeFloatBuffer(float[] values) {
  ByteBuffer bb = ByteBuffer.allocateDirect(values.length * 4);
  bb.order(ByteOrder.nativeOrder());
  FloatBuffer fb = bb.asFloatBuffer();
  fb.put(values);
  fb.position(0);
  return fb;
 }
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • yona

    2016/09/28 11:38

    Javaのソースコードも追記してください

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2016/09/29 09:44

    文字数が多いと出てたのでコード記述でも多過ぎるとダメだと思っていました。すみません

    キャンセル

回答 1

0

下記の勘違いをしていませんか?
・レイアウトファイルを作成するだけでActivityが自動で読み取って、画面に表示してくれる。
・Activity#setContentViewは画面にViewを追加するメソッドでsetContentViewを複数回使用することで画面に複数のViewを追加できる。

上記のどちらかの勘違いをしていたら以前の質問でうまくいかなかったことも納得できます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/09/29 09:49

    後者は分かりませんが多分前者だと思います。

    キャンセル

  • 2016/09/29 10:05

    やっぱりレイアウトファイルを使用していませんね。

    setContentViewの引数にレイアウトファイルを渡してあげてください。
    また、レイアウトファイル内のSurfaceViewタグをMainSurfaceの完全修飾名にしてください。
    併せてMainSurfaceのprivate属性を外し、publicにしてください。

    キャンセル

  • 2016/09/29 13:28

    ありがとうございます。

    まずはsetContentViewの引数にレイアウトファイルを渡すというのは
    setContentView(surface);のsurfaceという部分をactivity_main.xmlにかえるということでしょうか?

    キャンセル

  • 2016/09/29 14:07

    その通りです。

    キャンセル

  • 2016/09/29 14:19

    かしこまりました。

    次のレイアウトファイル内のSurfaceViewタグをMainSurfaceの完全修飾名にするというところなのですが
    変えるのはimport android.opengl.GLSurfaceView;のSurfaceViewというところですか?

    キャンセル

  • 2016/09/29 14:29

    違います。
    MainSurfaceの完全修飾名をレイアウトファイルのSurfaceViewのところに上書きします。

    キャンセル

  • 2016/09/29 14:34

    すみません。わからないので場所指定してもらってもよろしいですか?

    キャンセル

  • 2016/09/29 14:51

    レイアウトファイルのSurfaceViewタグをMainSurfaceの完全修飾名に変えるとしか言えないです。
    自身でもカスタムViewをxmlで使う方法を調べてください。

    キャンセル

  • 2016/09/30 09:13

    勘違いしていました

    xmlファイルの空白を入れて14行目をMainSurfaceの完全修飾名に変えるということですか?

    キャンセル

  • 2016/09/30 09:19

    レイアウトファイルの<SurfaceViewの箇所を書き換えてください。

    キャンセル

  • 2016/09/30 09:50

    完全修飾名は
    <com.example.pc~.MainSurface
    でいいのでしょうか

    キャンセル

  • 2016/09/30 10:17

    私にはわからないですよ。
    たぶん、そんな感じだと思います。

    キャンセル

  • 2016/09/30 10:29

    ありがとうございます

    それではMainSurfaceのprivate属性を外し、publicにするというのは
    private MainSurface surface = null;
    の部分であっているでしょうか

    キャンセル

  • 2016/09/30 10:34

    クラスの宣言部分の方です。

    全部聞いてなんとかしようと思っていませんか?とりあえず実行してエラーについて調べてわからなかったら聞くの方が効率いいですよ。

    キャンセル

  • 2016/09/30 10:43

    すみません。

    とりあえず調べます

    キャンセル

  • 2016/09/30 12:59

    それとは別にsetContentViewの引数にレイアウトファイルを渡すところで
    Cannot resolve sinbol のエラーが出ていました。

    キャンセル

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

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

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

  • Java

    16235questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • Android Studio

    4375questions

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

  • XML

    769questions

    XMLは仕様の1つで、マークアップ言語群を構築するために使われています。