2016-04-11 26 views
1

Dokunmatik girişin x ve y coords'larını almak istiyorum.Dokunmatik girişin x ve y kozları alın (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(); 
       } 
      } 
     } 
    } 
} 

Ama (ekran ve dokunmatik) telefonumda uygulamayı çalıştırmayı denediğinizde geri önceki etkinliğe gönderilen olsun: Bunu kullanarak yapmaya çalışıyorum. Şu andan itibaren android stüdyosunda günlüğü kullanamıyorum, bu yüzden cevaplamanın zor bir soru olup olmadığını anlayabiliyorum.

+0

Merhaba, artık kodunuz var mı? Diğer etkinliği yayınlayabilir misin? –

+1

Log'u neden kullanamadığınızı anlamıyorum. Ayrıca, onTouch işlevinizde Toast.makeText (this, touch.x + "" + touch.y, Toast.LENGTH_SHORT) .show(); – Elye

+0

Emülatörümde bir sorun var, başlamadı. Sadece android açılış ekranına gidiyorum .. Bütün senaryoyu yayınlayabilirim. – Bonbin

cevap

1

Point Dokunmanız her zaman NULL değil mi? Muhtemelen bunu başlatmak için unuttum: bu hat olmadan

touch = new Point(); 

, değişken touch her zaman boş, bu nedenle onTouch() çağrıldığında, Logcat diyecekler: java.lang.NullPointerException: yazma girişimi Yani onCreate() yukarıdaki satırı ekleyin ya da bir yere onTouch() bu yardımcı olur Umut çağrılmadan önce başlatılabilir boş bir nesne başvurusu

üzerinde 'int android.graphics.Point.x' alana girin.