2016-04-11 153 views
1

我想獲得觸摸輸入的x和y座標。我想用這個做:獲取觸摸輸入的x和y座標(Android studio,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(); 
       } 
      } 
     } 
    } 
} 

但是,當我嘗試運行我的手機上的應用程序(和觸摸屏)我送回到以前的活動。截至目前,我不能使用Android工作室的日誌,所以我明白,如果這是一個難以回答的問題。

+0

嗨,你還有什麼代碼?你可以發佈其他活動嗎? –

+1

不明白你爲什麼不能使用日誌。你也可以考慮在你的onTouch函數中使用'Toast.makeText(this,touch.x +「」+ touch.y,Toast.LENGTH_SHORT).show();'。 – Elye

+0

我的模擬器有問題,它不會啓動。我只能進入android初始屏幕..我可以發佈整個腳本。 – Bonbin

回答

1

您的Point touch一直是NULL,不是嗎? 也許你忘了初始化:

touch = new Point(); 

沒有這一行,變量touch爲空所有的時間,所以當onTouch()被調用時,logcat的會說: 顯示java.lang.NullPointerException:嘗試寫入田對空對象引用

「詮釋android.graphics.Point.x」所以添加上述行onCreate()或某個地方,這可以初始化onTouch()被稱爲 希望這有助於之前。