2012-04-24 7 views
3

Здравствуйте, спасибо, что нашли время, чтобы прочитать это. В течение нескольких дней я занимаюсь исследованием и запугиванием своего кода, чтобы получить текстовое представление, чтобы обновить счет, когда коснулся «призрак».Событие Android onTouch не происходит?

Это мое первое приложение для Android и, насколько я могу судить (я добавил Log.w() в ontouch, но журнал никогда не выкладывается, а оценка не увеличивается или даже появляется) onTouch (вид v, событие MotionEvent) никогда не вызывается. Ниже мой код, любые подсказки или вопросы приветствуются.

package com.cs461.Ian; 

//TODO:Add accelerometer support 
//TODO:Add Clickable ghosts 
//TODO:Add camera background 
/*Completed:(As of 2:30am 4/16) 
* Activity launches 
* Ghost appears on screen 
* Ghost will randomly move around the screen 
*/ 

import java.util.Random; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Canvas; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.SurfaceHolder; 
import android.view.View; 
import android.widget.TextView; 

public class CameraActivity extends Activity{ 

Bitmap g; 
Ghost a; 
Ghost still; 
SurfaceHolder mSurfaceHolder; 
boolean firsttime=true; 
int draw_x,draw_y,xSpeed,ySpeed,score=0; 
TextView t; 




@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.game); 
    a = new Ghost(getApplicationContext()); 
    still = new Ghost(getApplicationContext()); 
    //requestWindowFeature(Window.FEATURE_NO_TITLE); 
    a.Initalize(BitmapFactory.decodeResource(getResources(), R.drawable.ghost), 20, 20); 
    still.Initalize(BitmapFactory.decodeResource(getResources(), R.drawable.ghost), 120, 120); 
    t = (TextView) findViewById(R.id.t); 
    t.setText("TEST SCORE TO SEE IF TEXTVIEW SHOWS UP"); 

    a.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (event.getAction() == MotionEvent.ACTION_DOWN){ 
       score++; 
       t.setText("Score: "+score); 

      } 
      return true; 
     } 
    }); 
    still.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if (event.getAction() == MotionEvent.ACTION_DOWN){ 
       score++; 
       t.setText("Score: "+score); 
       Log.w("CLICKED","Clicked on ghost "+score+" times"); 

      } 
      return true; 
     } 
    }); 



    setContentView(new Panel(this)); 
} 


class Panel extends View { 
    public Panel(Context context) { 
     super(context); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 
     //g.Initalise(BitmapFactory.decodeFile("/res/drawable-hdpi/ghost.png"), 200, 150, 5, 5);; 
     update(canvas); 
     invalidate(); 
    } 

    /*Places ghost on screen and bounces it around in the screen. My phone is apparently only API level 4(the most up to date is 15) so i didn't code it 
    *for the accelerometer yet. 
    */ 
    public void update(Canvas canvas) { 
     Random rand = new Random(); 
     if(firsttime){ 
      draw_x = Math.round(System.currentTimeMillis() % (this.getWidth()*2)) ; 
      draw_y = Math.round(System.currentTimeMillis() % (this.getHeight()*2)) ; 
      xSpeed = rand.nextInt(10); 
      ySpeed = rand.nextInt(10); 

      firsttime=false; 
     } 
     draw_x+=xSpeed; 
     draw_y+=ySpeed; 
     draw_x = Math.round(System.currentTimeMillis() % (this.getWidth()*2)) ; 
     draw_y = Math.round(System.currentTimeMillis() % (this.getHeight()*2)) ; 
     if (draw_x>this.getWidth()){ 
      draw_x = (this.getWidth()*2)-draw_x; 
      xSpeed = rand.nextInt(10); 
      if(xSpeed >=5) 
       xSpeed=-xSpeed; 
     } 
     if (draw_y>this.getHeight()){ 
      draw_y = (this.getHeight()*2)-draw_y; 
      ySpeed = rand.nextInt(10); 
      if(ySpeed >=5) 
       ySpeed=-ySpeed; 
     } 
     g = BitmapFactory.decodeResource(getResources(), R.drawable.ghost); 
     canvas.drawBitmap(g, draw_x, draw_y, null); 
     still.draw(canvas); 
     a.update(canvas); 


     } 
    } 


} 

Забыл добавить класс Духа:

package com.cs461.Ian; 

import java.util.Random; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.Canvas; 
import android.graphics.Rect; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.View; 

public class Ghost extends View implements View.OnTouchListener{ 
public Ghost(Context context) { 
    super(context); 
    // TODO Auto-generated constructor stub 
} 

private Bitmap mAnimation; 
private int mXPos; 
private int mYPos; 
private Rect mSRectangle; 
private int mSpriteHeight; 
private int mSpriteWidth; 
View v; 
Rect dest; 
int score = 0; 

/*public Ghost() { 
    mSRectangle = new Rect(0,0,0,0); 
    mXPos = 80; 
    mYPos = 200; 
}*/ 



public void Initalize(Bitmap theBitmap, int Height, int Width) { 
    mSRectangle = new Rect(0,0,0,0); 
    mXPos = 80; 
    mYPos = 200; 
    mAnimation = theBitmap; 
    mSpriteHeight = Height; 
    mSpriteWidth = Width; 
    mSRectangle.top = 0; 
    mSRectangle.bottom = mSpriteHeight; 
    mSRectangle.left = 0; 
    mSRectangle.right = mSpriteWidth; 
    dest = new Rect(mXPos, mYPos, mXPos + mSpriteWidth, 
      mYPos + mSpriteHeight); 

} 
public void draw(Canvas canvas) { 


    canvas.drawBitmap(mAnimation, mXPos, mYPos, null); 
} 

public void update(Canvas canvas) { 
    new Random(); 

    mXPos = Math.round(System.currentTimeMillis() % (canvas.getWidth()*2)) ; 
    mYPos = Math.round(System.currentTimeMillis() % (canvas.getHeight()*2)) ; 
    if (mXPos>canvas.getWidth()) 
     mXPos = (canvas.getWidth()*2)-mXPos; 
    if (mYPos>canvas.getHeight()) 
     mYPos = (canvas.getHeight()*2)-mYPos; 

    draw(canvas); 


} 

public Rect getRect() { 
    return mSRectangle; 
} 
@Override 
public boolean onTouch(View v, MotionEvent event) { 
    score++; 
    //CameraActivity.t.setText("Score: "+CameraActivity.score); 
    Log.w("CLICKED","Clicked on ghost "+score+" times"); 
    return true; //doesn't work if returns false either 
} 


} 
+1

Что такое Ghost в вашем коде? –

+2

Если функция щелчка всегда одна и та же, почему бы просто не поместить ее в определение класса для призрака в конструкторе? – JustinDanielson

+0

Что произойдет, если вы переместите Log.w вне действия, если блок? –

ответ

3

Override dispatchTouchEvent(MotionEvent event) в вашем Activity обрабатывать все события касания, которые могут возникнуть. Верните false, чтобы передать MotionEvent в следующий вид \ layout в иерархии, если они обрабатывают события.

+0

Я перепробовал его, чтобы просто возвращать false каждый раз, однако он все равно ничего не делает. Я как бы предположил, что будет думать, что каждое прикосновение было на призраке, но я думаю, я ошибся. Теперь мне нужно пойти на один из моих классов, но я вернусь через несколько часов. – SnakeMan2058

+0

Можете ли вы объяснить идею игры? Также я вижу, что 'Ghost' расширяет' Button'. Вы можете расширить 'View' и по-прежнему иметь' Ghost' clickable/touchable. Мои мысли о переопределении 'dispatchTouchEvent' заключались в том, что все это будет сделано через это, и вам не нужно будет передавать какие-либо события, но все зависит от того, чего вы хотите достичь. – techiServices

+0

На данный момент все, что я хочу, это то, что мой textView увеличивается при прикосновении призрака. – SnakeMan2058

Смежные вопросы