2016-04-11 155 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()被称为 希望这有助于之前。