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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

Android Studio

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

Q&A

解決済

2回答

1645閲覧

Android Studio SurfaceViewに描画されない

68kjo_pzdr

総合スコア8

Java

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

Android Studio

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

0グッド

0クリップ

投稿2018/03/13 01:15

編集2018/03/16 02:40

xmlファイルで配置したSurfaceViewにBattleViewを作り、描画を行いたいのですがViewの部分が真っ黒で何も表示されません。Log.dをDrawGameBoardメソッドの1行目に置いたらログは表示されたので、スレッドは起動していると思うのですが…。加えて、SurfaceViewにおけるコンストラクタと、SurfaceCreatedの違いがいまひとつ理解出来ていないのでご指導頂けると幸いです。

xml

1<?xml version="1.0" encoding="utf-8"?> 2<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="match_parent" 7 tools:context="com.example.kajio.sidestepgun.MainActivity"> 8 9 <LinearLayout 10 android:layout_width="match_parent" 11 android:layout_height="match_parent" 12 android:orientation="vertical"> 13 14 <LinearLayout 15 android:layout_width="match_parent" 16 android:layout_height="match_parent" 17 android:layout_weight="2" 18 android:orientation="horizontal"> 19 20 <ImageButton 21 android:layout_width="70dp" 22 android:layout_height="70dp" 23 android:background="@null" 24 android:id="@+id/left2" 25 android:layout_gravity="start|center_vertical" 26 android:layout_margin="10dp" 27 android:scaleType="fitCenter" 28 android:src="@drawable/left" /> 29 30 <View 31 android:layout_width="1dp" 32 android:layout_height="1dp" 33 android:layout_weight="1"/> 34 35 <TextView 36 android:layout_width="70dp" 37 android:layout_height="70dp" 38 android:id="@+id/bombNum2" 39 android:text="×" 40 android:textSize="50dp" 41 android:layout_gravity="center_vertical" 42 android:rotation="180"/> 43 44 <ImageButton 45 android:layout_width="70dp" 46 android:layout_height="70dp" 47 android:background="@null" 48 android:id="@+id/bombThrow2" 49 android:layout_marginRight= "20dp" 50 android:scaleType="fitCenter" 51 android:layout_gravity="center_vertical" 52 android:src="@drawable/bombbutton" 53 android:rotation="180"/> 54 55 56 <ImageButton 57 android:layout_width="70dp" 58 android:layout_height="70dp" 59 android:background="@null" 60 android:id="@+id/right2" 61 android:layout_gravity="end|center_vertical" 62 android:layout_margin="10dp" 63 android:scaleType="fitCenter" 64 android:src="@drawable/right" /> 65 66 </LinearLayout> 67 68 <SurfaceView 69 android:id="@+id/surfaceView" 70 android:layout_width="match_parent" 71 android:layout_height="match_parent" 72 android:layout_weight="1" /> 73 74 <LinearLayout 75 android:layout_width="match_parent" 76 android:layout_height="match_parent" 77 android:layout_weight="2" 78 android:layout_gravity="center_vertical" 79 android:orientation="horizontal"> 80 81 <ImageButton 82 android:layout_width="70dp" 83 android:layout_height="70dp" 84 android:background="@null" 85 android:id="@+id/left1" 86 android:layout_margin="10dp" 87 android:scaleType="fitCenter" 88 android:layout_gravity="start|center_vertical" 89 android:src="@drawable/left"/> 90 91 <ImageButton 92 android:layout_width="70dp" 93 android:layout_height="70dp" 94 android:background="@null" 95 android:id="@+id/bombThrow1" 96 android:layout_marginLeft= "20dp" 97 android:scaleType="fitCenter" 98 android:layout_gravity="center_vertical" 99 android:src="@drawable/bombbutton"/> 100 101 <TextView 102 android:layout_width="70dp" 103 android:layout_height="70dp" 104 android:id="@+id/bombNum1" 105 android:text="×" 106 android:textSize="50dp" 107 android:layout_gravity="center_vertical"/> 108 109 <View 110 android:layout_width="1dp" 111 android:layout_height="1dp" 112 android:layout_weight="1"/> 113 114 115 <ImageButton 116 android:layout_width="70dp" 117 android:layout_height="70dp" 118 android:background="@null" 119 android:id="@+id/right1" 120 android:layout_gravity="end|center_vertical" 121 android:layout_margin="10dp" 122 android:scaleType="fitCenter" 123 android:src="@drawable/right" /> 124 125 </LinearLayout> 126 127 </LinearLayout> 128</RelativeLayout> 129

Java

1package com.example.kajio.sidestepgun; 2 3 import android.app.Activity; 4 import android.graphics.drawable.Drawable; 5 import android.os.Bundle; 6 import android.provider.ContactsContract; 7 import android.view.SurfaceView; 8 import android.view.View; 9 import android.widget.ImageButton; 10 import android.widget.TextView; 11 12public class MainActivity extends Activity { 13 14 private BattleView battleView; 15 16 @Override 17 protected void onCreate(Bundle savedInstanceState) { 18 super.onCreate(savedInstanceState); 19 setContentView(R.layout.activity_main); 20 21 SurfaceView surfaceView = (SurfaceView)findViewById(R.id.surfaceView); 22 battleView = new BattleView(this, surfaceView); 23 } 24} 25

Java

1package com.example.kajio.sidestepgun; 2 3import android.content.Context; 4import android.content.res.Resources; 5import android.graphics.Bitmap; 6import android.graphics.BitmapFactory; 7import android.graphics.Canvas; 8import android.graphics.Color; 9import android.graphics.Paint; 10import android.util.Log; 11import android.view.SurfaceView; 12import android.view.SurfaceHolder; 13 14public class BattleView extends SurfaceView implements SurfaceHolder.Callback, Runnable{ 15 16 private Thread mThread; 17 private boolean isAttached; 18 private SurfaceHolder mHolder; 19 private Canvas mCanvas = null; 20 private Bitmap background; 21 private Paint mPaint; 22 private int mWidth, mHeight; 23 24 public BattleView(Context context, SurfaceView surfaceView){ 25 super(context); 26 mHolder = surfaceView.getHolder(); 27 mHolder.addCallback(this); 28 } 29 30 @Override 31 public void surfaceCreated(SurfaceHolder holder){ 32 33 //Resources res = this.getContext().getResources(); 34 //background = BitmapFactory.decodeResource(res, R.mipmap.field); 35 isAttached = true; 36 mThread = new Thread(this); 37 mThread.start(); 38 } 39 40 @Override 41 public void run(){ 42 while (isAttached){ 43 drawGameBoard(); 44 } 45 } 46 47 @Override 48 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height){ 49 50 } 51 52 @Override 53 public void surfaceDestroyed(SurfaceHolder holder){ 54 isAttached = false; 55 mThread = null; 56 } 57 58 private void drawGameBoard(){ 59 mCanvas = mHolder.lockCanvas(); 60 61 mPaint = new Paint(); 62 mWidth = getWidth(); 63 mHeight = getHeight(); 64 65 mPaint.setStyle(Paint.Style.FILL); 66 mPaint.setColor(Color.BLUE); 67 68 mCanvas.drawRect(0, 0, mWidth, mHeight, mPaint); 69 70 mHolder.unlockCanvasAndPost(mCanvas); 71 } 72}

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

コードに何か変更を入れましたか?おそらくそのままでは表示されることはないと思いますので一応コードの問題点を解説しておきます。

1. Viewはレイアウトに追加しなければ表示されない

java

1public class BattleView extends SurfaceView ...

こちらのクラスですが、SurfaceViewを継承してるクラスであるのにもかかわらず、レイアウトにこのクラスのインスタンスを追加しているコードが見当たりません。Androidでは(というよりアプリケーション開発ではほとんどの場合)Viewを継承したクラスはレイアウトに追加しない限り機能しませんし表示されることもありません。

java

1public BattleView(Context context, SurfaceView surfaceView)

コンストラクタで外部からSurfaceViewを差し込んでいることを見る限り、おそらくこのクラスはSurfaceViewの管理クラスとしてイメージされたものではないでしょうか?その場合はSurfaceViewを継承する必要はありませんし、むしろしてはいけません。
クラス名も、それとわかりやすいものに変更されるとよいかと思います。

例) BattleViewManagerBattleViewContainerなど

で、SurfaceViewの継承を外すとエラーが出ると思いますが、それが今回問題となっているコードです。

2.BattleViewのwidth/heightを参照してしまっている

java

1private void drawGameBoard(){ 2 mCanvas = mHolder.lockCanvas(); 3 4 mPaint = new Paint(); 5 mWidth = getWidth(); 6 mHeight = getHeight();

こちらで呼んでいる getWidth()/getHeight() ですが、これらはBattleViewがSurfaceViewを継承しているために呼べてしまっているメソッドです。BattleViewはレイアウトに追加されていないため当然 mWidth/mHeight は両方0になります。なのでその後で呼んでいる

java

1mCanvas.drawRect(0, 0, mWidth, mHeight, mPaint);

こちらのコードもサイズ0の四角形を描画しているだけになり、何も表示されないわけです。SurfaceViewのサイズを参照したいのであれば、Canvas経由で取得するようにしてみてください。

java

1mWidth = mCanvas.getWidth(); 2mHeight = mCanvas.getHeight();

3. SurfaceViewにおけるコンストラクタと、SurfaceCreatedの違い

ご質問にあった件についてですが、まずコンストラクタはSurfaceViewのインスタンス自体が生成される時点で呼ばれます。この時点ではSurfaceViewとして表示する準備は何も整っていないため、ほとんどのSurfaceViewの機能を利用することはできません。それに対しsurfaceCreatedはSurfaceViewがレイアウトに追加され、そこに表示するSurfaceが生成されて描画用のコードを呼ぶ準備が整った時点で呼ばれます。

投稿2018/03/16 06:36

kakajika

総合スコア3131

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

68kjo_pzdr

2018/03/16 07:17

非常に分かりやすい説明で深く納得致しました。誠にありがとうございます。 今後の参考にさせて頂きます、
guest

0

自己解決

原因は不明でしたが、2日後に再度起動したところ普通に表示されました。

投稿2018/03/16 04:41

68kjo_pzdr

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問