2016-04-11 27 views
1

タッチ入力のx座標とy座標を取得したいとします。私が使ってこれを行うにしようとしています:タッチ入力のx座標とy座標を取得する(Androidスタジオ、Java)

package com.example.benjamin.labb3; 

import android.app.Activity; 
import android.content.Context; 
import android.content.res.AssetManager; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Point; 
import android.os.Bundle; 
import android.view.Display; 
import android.view.MotionEvent; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.Window; 
import java.io.IOException; 
import java.io.InputStream; 
import java.util.Random; 

import android.view.View.OnTouchListener; 

    public class Main extends Activity implements OnTouchListener { 

    DrawView drawView; 
    String inputAction = ""; 
    Point touch; 

    @Override public void onCreate(Bundle savedInstanceState){ 
     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 

     drawView = new DrawView(this); 
     setContentView(drawView); 
     drawView.setOnTouchListener(this); 
    } 

    @Override public void onResume(){ 
     super.onResume(); 
     drawView.resume(); 
    } 

    @Override public void onPause(){ 
     super.onPause(); 
     drawView.pause(); 
    } 

    public boolean onTouch (View v, MotionEvent event) { 
     touch.x = (int)event.getX(); 
     touch.y= (int)event.getY(); 
     return true; 
    } 

    public class DrawView extends SurfaceView implements Runnable { 
     Thread gameloop = null; 
     SurfaceHolder surface; 
     volatile boolean running = false; 
     AssetManager assets = null; 
     BitmapFactory.Options options = null; 
     Bitmap incect[]; 
     int frame = 0; 

     public DrawView(Context context){ 
      super(context); 
      surface = getHolder(); 
      assets = context.getAssets(); 
      options = new BitmapFactory.Options(); 
      options.inPreferredConfig = Bitmap.Config.ARGB_8888; 

      incect = new Bitmap[2]; 

      try { 
       for (int n = 0; n < 2; n++){ 
        String fileName = "incect"+Integer.toString(n+1)+".png"; 
        InputStream istream = assets.open(fileName); 
        incect[n] = BitmapFactory.decodeStream(istream,null,options); 
        istream.close(); 
       } 
      } catch (IOException e){ 
       e.printStackTrace(); 
      } 
     } 

     public void resume() { 
      running = true; 
      gameloop = new Thread(this); 
      gameloop.start(); 
     } 

     public void pause() { 
      running = false; 
      boolean retry = true; 
      while (retry) { 
       try { 
        gameloop.join(); 
        retry = false; 
       } catch (InterruptedException e){} 
      } 
     } 

     @Override public void run(){ 

      Point size = new Point(); 
      Display display = getWindowManager().getDefaultDisplay(); 
      display.getSize(size); 
      Random wR = new Random(); 
      Random hR = new Random(); 
      int width = size.x; 
      int height = size.y; 
      int randomW = wR.nextInt(width-20)+20; 
      int randomH = hR.nextInt(height-20)+20; 

      while (running){ 

       if(!surface.getSurface().isValid()) 
        continue; 

       Canvas canvas = surface.lockCanvas(); 
       canvas.drawColor(Color.rgb(85,107,47)); 
       canvas.drawBitmap(incect[frame],randomW-10,randomH-10,null); 
       surface.unlockCanvasAndPost(canvas); 
       frame ++; 
       if (frame > 1){ 
        frame = 0; 
       } 

       try { 
        Thread.sleep(500); 
       }catch (InterruptedException e){ 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 

しかし、私は、以前の活動に戻って送信されます私の携帯電話上でアプリケーションを実行します(と画面をタッチ)してみてください。現時点ではアンドロイドスタジオのログを使用できませんので、回答するのが難しい質問であるかどうかはわかります。

+0

こんにちは、もうコードはありますか?あなたは他の活動を投稿できますか? –

+1

なぜログを使用できないのか分かりません。あなたのonTouch関数で 'Toast.makeText(this、touch.x +" "+ touch.y、Toast.LENGTH_SHORT).show();'を使うことも考えられます。 – Elye

+0

私のエミュレータには何か問題があります。起動しません。私はアンドロイドのスプラッシュ画面に行く。私は全体のスクリプトを投稿することができます。 – Bonbin

答えて

1

PointあなたのタッチはいつもNULLですか? は、おそらくあなたはそれを初期化するのを忘れ:この行なし

touch = new Point(); 

を、変数touchは、すべての時間nullであるので、onTouch()が呼び出されたときに、Logcatは言うだろう: のjava.lang.NullPointerException:書き込もうとしだから、nullオブジェクト参照

に「int型android.graphics.Point.xを」フィールドするonCreate()に上記の行を追加したり、どこかにそれがonTouch()前に初期化することができ ・ホープ、このことができますと呼ばれています。

関連する問題