2011-09-06 12 views
6

Tengo dos imágenes moviéndose a través de la pantalla, una es una bola y la otra es un hombre. Lo que quiero que pase es que cuando el usuario toca la imagen del hombre, la pelota cae.Cómo agregar un evento OnClick para una vista personalizada de Android View

Mi problema es que parece que no puedo agregar un evento onclick/ontouch y ponerlo a funcionar.

No lo estoy implementando correctamente, ¿alguien puede ayudarme por favor?

He incluido las 3 clases siguientes. Greg es el hombre y la pelota se llama bola :)

TestAnimationActivity.java

package com.test.firstAnimation; 

    import android.app.Activity; 
    import android.os.Bundle; 

    public class TestAnimationActivity extends Activity { 
     /** Called when the activity is first created. */ 
     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(new MyAnimationView(this)); 
     } 
    } 

Sprite.java

package com.test.firstAnimation; 

import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Toast; 

public class Sprite extends View implements OnClickListener{ 

    private static int gregCoordX = 410; // the x coordinate at the canvas for greg 
    private Bitmap img; // the image of Greg 
    private Bitmap img2; // the image of pointer 
    private static int gregCoordY = 125; // the y coordinate at the canvas for greg 
    private static int pointCoordX = 10; 
    private static int pointCoordY = 10; 
    private static int count = 1; 
    private static int ballSpeed = 25; 
    private static boolean goingRight = false; 
    private static boolean goingLeft = true; 
    private static boolean pointerGoingRight = false; 
    private static boolean pointerGoingLeft = true; 


    public Sprite(Context context, int drawable) { 

     super(context); 

     BitmapFactory.Options opts = new BitmapFactory.Options(); 
     opts.inJustDecodeBounds = true; 
     img = BitmapFactory.decodeResource(context.getResources(), drawable); 
     img2 = (BitmapFactory.decodeResource(context.getResources(), drawable)); 
     count++; 
    } 

    public static int getCount() { 
     return count; 
    } 

    void setX(int newValue) { 
     gregCoordX = newValue; 
    } 

    public static int getX() { 
     return gregCoordX; 
    } 

    public static int getY() { 
     return gregCoordY; 
    } 

    public static int getBX() { 
     return pointCoordX; 
    } 

    public static int getBY() { 
     return pointCoordY; 
    } 

    public Bitmap getBitmap() { 
     return img; 
    } 

    public Bitmap getImg2() { 
     return img2; 
    } 

    public static void dropBall() 
    { 
     pointCoordY++; 
    } 

    public static void moveBall(int x) { 

      // check the borders 
      //if more than ten go right 
      //if ten go left 
      //if more than 250 go left 
      if (x <= 10 && pointerGoingLeft) 
      { 
      pointCoordX = pointCoordX + ballSpeed; 
      pointerGoingRight = true; 
      pointerGoingLeft = false; 
      } 
      else if (x >= 410 && pointerGoingRight) 
      { 
       pointCoordX = pointCoordX - ballSpeed; 
       pointerGoingLeft = true; 
       pointerGoingRight = false; 
      } 
      else if (pointerGoingRight) 
       pointCoordX = pointCoordX + ballSpeed; 
      else 
       pointCoordX = pointCoordX - ballSpeed; 

      if(MyAnimationView.ballDropping == true) 
      { 
       while (pointCoordY<gregCoordY) 
        dropBall(); 
      } 
    } 

    public static void moveGreg(int x) { 

     if (x <= 10 && goingLeft) 
     { 
     gregCoordX = gregCoordX + count; 
     goingRight = true; 
     goingLeft = false; 
     } 
     else if (x >= 410 && goingRight) 
     { 
     gregCoordX = gregCoordX - count; 
     goingLeft = true; 
     goingRight = false; 
     } 
     else if (goingRight) 
     gregCoordX = gregCoordX + count; 
     else 
     gregCoordX = gregCoordX - count; 
} 

    @Override 
    public void onClick(View arg0) { 
     dropBall(); 
    } 
} 

MyAnimationView.java

package com.test.firstAnimation; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.view.View; 

public class MyAnimationView extends View{ 

    private Sprite greg; 
    private Sprite ball; 
    private int xCoOr; 
    private int ballXCoOr; 
    public static boolean ballDropping; 

    public MyAnimationView(Context context) { 
     super(context); 

     ballDropping = false; 
     greg = new Sprite(context,R.drawable.greg); 
     ball = new Sprite(context, R.drawable.ball); 

     OnClickListener gregClicked = new OnClickListener() { 
      public void onClick(View v) { 
      ballDropping = true; 
      } 
     }; 
     greg.setOnClickListener(gregClicked); 
     } 

    @Override protected void onDraw(Canvas canvas) { 

    canvas.drawColor(0xFFFFFFFF);         //white background  

    ballXCoOr = Sprite.getBX(); 
    xCoOr = Sprite.getX(); 
    Sprite.moveGreg(xCoOr);           //move ball left or right depending 
    Sprite.moveBall(ballXCoOr); 

    if(ballDropping == true) 
    { 
     Sprite.dropBall(); 
    } 

    canvas.drawBitmap(greg.getBitmap(), xCoOr, Sprite.getY(), null); 
    canvas.drawBitmap(ball.getBitmap(), ballXCoOr, Sprite.getBY(), null); 
    invalidate(); 
    } 
} 

Gracias de antemano, ¡Estuve atascado por días!

Ben

+0

Me disculpo por la mala formato, este es mi primer post :) –

+0

No creo que el código funciona porque las vistas no son Sprite subvistas de MyAnimationView. El oyente onClick no se activa porque las Vistas nunca se utilizan; simplemente lee sus mapas de bits y los dibuja en onDraw. Lo publicaría como una respuesta, pero es el problema, no la solución. –

+0

mira esta solución: http://stackoverflow.com/a/17978891/779408 – breceivemail

Respuesta

8
float touched_x, touched_y; 
    boolean touched = false; 
    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
     // TODO Auto-generated method stub 
     touchCounter++; 
     touched_x = event.getX(); 
     touched_y = event.getY(); 

     int action = event.getAction(); 
     switch (action) { 
     case MotionEvent.ACTION_DOWN: 
      touched = true; 
      break; 
     case MotionEvent.ACTION_MOVE: 
      touched = true; 
      break; 
     case MotionEvent.ACTION_UP: 
      touched = false; 
      break; 
     case MotionEvent.ACTION_CANCEL: 
      touched = false; 
      break; 
     case MotionEvent.ACTION_OUTSIDE: 
      touched = false; 
      break; 
     default: 
     } 
     return true; // processed 
    } 

continuación;

if (touched) { 
     //control here 
    } 

tocado_x, tocado_y son las coordenadas del punto que se hace clic en la pantalla. Puedes comparar las coordenadas de Greg y estas coordenadas. Si es lo mismo, haz lo que quieras hacer.

+0

Gracias por la ayuda, lo intentaré :) –

4


public class CustomView extends View implements OnClickListener { 

    public CustomView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     init(); 
    } 

    public CustomView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public CustomView(Context context) { 
     super(context); 
     init(); 
    } 

    private void init(){ 
     setOnClickListener(this); 
    } 

    @Override 
    public void onClick(View v) { 

     // Do whatever you need to 
    } 

} 
Cuestiones relacionadas