###前提・実現したいこと
SurfaceView を使い、円を連続的に表示させて、画面の端にぶつかったら跳ね返らせたい。
###発生している問題・エラーメッセージ
エミュレータで実行させると強制終了してしまいます。
以下がログです。
05-19 04:18:21.178 7879-7879/? I/art: Not late-enabling -Xcheck:jni (already on) 05-19 04:18:21.178 7879-7879/? W/art: Unexpected CPU variant for X86 using defaults: x86 05-19 04:18:21.324 7879-7879/numa.surfaceviewtestactivity W/System: ClassLoader referenced unknown path: /data/app/numa.surfaceviewtestactivity-2/lib/x86 05-19 04:18:21.330 7879-7879/numa.surfaceviewtestactivity I/InstantRun: Starting Instant Run Server for numa.surfaceviewtestactivity 05-19 04:18:21.844 7879-7929/numa.surfaceviewtestactivity E/AndroidRuntime: FATAL EXCEPTION: Thread-4 Process: numa.surfaceviewtestactivity, PID: 7879 java.lang.NullPointerException: Attempt to invoke interface method 'android.graphics.Canvas android.view.SurfaceHolder.lockCanvas()' on a null object reference at numa.surfaceviewtestactivity.MainActivity.onDrow(MainActivity.java:51) at numa.surfaceviewtestactivity.MainActivity.run(MainActivity.java:72) at java.lang.Thread.run(Thread.java:761)
###該当のソースコード
以下がSurfaceViewをセットするActivityです。
Java
1package numa.surfaceviewtestactivity; 2 3import android.app.Activity; 4import android.os.Bundle; 5import android.widget.LinearLayout; 6 7/** 8 * Created by user on 2017/05/17. 9 */ 10 11public class DrawActivity extends Activity { 12 13 @Override 14 public void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 //SurfaceViewをセットする 17 setContentView(new MainActivity(this)); 18 } 19 20
以下がSurfaceViewの中身です。
Java
1package numa.surfaceviewtestactivity; 2 3import android.app.Activity; 4import android.content.Context; 5import android.graphics.Canvas; 6import android.graphics.Color; 7import android.graphics.Paint; 8import android.support.v7.app.AppCompatActivity; 9import android.os.Bundle; 10import android.util.Log; 11import android.view.SurfaceHolder; 12import android.view.SurfaceView; 13 14public class MainActivity extends SurfaceView implements SurfaceHolder.Callback,Runnable { 15 16 private SurfaceHolder holder; 17 Paint paint=null; 18 Thread thread =null; 19 int X = 0; 20 int Y = 0; 21 int Xv=5; 22 int Yv=5; 23 24 public MainActivity(Context context) { 25 super(context); 26 getHolder().addCallback(this); 27 paint = new Paint(); 28 paint.setColor(Color.RED); 29 thread=new Thread(this); 30 thread.start(); 31 } 32 33 @Override 34 public void surfaceCreated(SurfaceHolder holder) { 35 Canvas canvas = holder.lockCanvas(); 36 canvas.drawColor(Color.WHITE); 37 holder.unlockCanvasAndPost(canvas); 38 } 39 40 @Override 41 public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 42 43 } 44 45 @Override 46 public void surfaceDestroyed(SurfaceHolder holder) { 47 thread=null; 48 } 49 50 public void onDrow(SurfaceHolder holder) { 51 Canvas canvas = holder.lockCanvas(); 52 if (canvas != null) { 53 canvas.drawCircle(X, Y, 10, paint); 54 holder.unlockCanvasAndPost(canvas); 55 } 56 } 57 58 @Override 59 public void run() { 60 61 while (thread!=null){ 62 63 if (X<0||getWidth()<X){ 64 X*=-1; 65 }else if (Y<0||getHeight()<Y){ 66 Y*=-1; 67 } 68 69 X+=Xv; 70 Y+=Yv; 71 72 onDrow(holder); 73 } 74 75 } 76 77 }
###補足情報(言語/FW/ツール等のバージョンなど)
AndroidStudio2.3
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。