How to add an OnClick event for a custom Android view

I have two images moving across the screen, one is a ball, and one is a person. What I want is when the user touches the image of a person, the ball falls.

My problem is that I cannot add the onclick / ontouch event and make it work.

I am not implementing it properly, can anyone help?

I have included 3 classes below. Greg is a man, and the ball is called a ball :)

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(); } } 

Thanks in advance, I'm stuck all day!

Ben

+6
source share
2 answers
  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 } 

Then;

  if (touched) { //control here } 

touchhed_x, touched_y - coordinates of the point that is clicked on the screen. You can compare the coordinates of Greg and these coordinates. If so, do what you want to do.

+8
source
 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 } } 
+4
source

Source: https://habr.com/ru/post/896720/


All Articles