onTouchevent() problem android
Found it!
I found that the problem is that it was the layout that should be registering some sort of listner so I did this:
I added this code to my Main clas:
private OnClickListener previewListener = new OnClickListener() {
@Override
public void onClick(View v) {
System.err.println("I've been clicked");
}
};
And the this line to the onCreate method:
previewLayout.setOnClickListener(previewListener);
And it worked!
stelios
Updated on September 27, 2020Comments
-
stelios almost 4 years
when i run the code below everything works fine,it's a simple app with three balls that you can move around...
public class dragndrop extends Activity { /** Called when the activity is first created. */ private ColorBall[] colorballs = new ColorBall[3]; // array that holds the balls private static final String TAG="MyTAG"; DrawView myView; private int balID = 0; // variable to know what ball is being dragged int X; int Y; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Point point1 = new Point(); point1.x = 50; point1.y = 20; Point point2 = new Point(); point2.x = 100; point2.y = 20; Point point3 = new Point(); point3.x = 150; point3.y = 20; // declare each ball with the ColorBall class colorballs[0] = new ColorBall(this,R.drawable.bol_groen, point1); colorballs[1] = new ColorBall(this,R.drawable.bol_rood, point2); colorballs[2] = new ColorBall(this,R.drawable.bol_blauw, point3); myView = new DrawView(this); setContentView(myView); } public class DrawView extends View { public DrawView(Context context) { super(context); setFocusable(true); //necessary for getting the touch events // setting the start point for the balls } // the method that draws the balls @Override protected void onDraw(Canvas canvas) { //draw the balls on the canvas for (ColorBall ball : colorballs) { canvas.drawBitmap(ball.getBitmap(), ball.getX(), ball.getY(), null); } } // events when touching the screen public boolean onTouchEvent(MotionEvent event) { int eventaction = event.getAction(); X = (int)event.getX(); Y = (int)event.getY(); switch (eventaction ) { case MotionEvent.ACTION_DOWN: // touch down so check if the finger is on a ball balID = 0; for (ColorBall ball : colorballs) { Log.d(TAG,"inside action down inside for coords:"+X+" coords: "+Y); Log.d(TAG,"ball coords:"+ball.getX()+" coords: "+ball.getY()); int x =X; int y =Y; Log.d(TAG,"lalalalalala"+x+" coords: "+y); if (x > ball.getX() && x < ball.getX()+50 && y > ball.getY() && y < ball.getY()+50){//if (X > ball.getX() && X < ball.getX()+50 && Y > ball.getY() && Y < ball.getY()+50){ Log.d(TAG,"inside ball coords!!!!!!!!!!!!!!!!!!!!!!!!:"+ball.getX()+" coords: "+ball.getY()); balID = ball.getID(); break; } } break; case MotionEvent.ACTION_MOVE: // touch drag with the ball // move the balls the same as the finger if (balID > 0) { colorballs[balID-1].setX(X-25); colorballs[balID-1].setY(Y-25); } break; case MotionEvent.ACTION_UP: // touch drop - just do things here after dropping break; } // redraw the canvas myView.invalidate(); return true; } } }
But when i try to handle the onTouchevent from the main activity doesn't work and the strange is that it can't read a simple variable(x,y)!!! i can't understand why this happened,it seems it can red them only if it's in a View!!!
public class dragndrop extends Activity { /** Called when the activity is first created. */ private ColorBall[] colorballs = new ColorBall[3]; // array that holds the balls private static final String TAG="MyTAG"; DrawView myView; private int balID = 0; // variable to know what ball is being dragged int X; int Y; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Point point1 = new Point(); point1.x = 50; point1.y = 20; Point point2 = new Point(); point2.x = 100; point2.y = 20; Point point3 = new Point(); point3.x = 150; point3.y = 20; // declare each ball with the ColorBall class colorballs[0] = new ColorBall(this,R.drawable.bol_groen, point1); colorballs[1] = new ColorBall(this,R.drawable.bol_rood, point2); colorballs[2] = new ColorBall(this,R.drawable.bol_blauw, point3); myView = new DrawView(this); setContentView(myView); } // events when touching the screen public boolean onTouchEvent(MotionEvent event) { int eventaction = event.getAction(); X = (int)event.getX(); Y = (int)event.getY(); switch (eventaction ) { case MotionEvent.ACTION_DOWN: // touch down so check if the finger is on a ball balID = 0; for (ColorBall ball : colorballs) { Log.d(TAG,"inside action down inside for coords:"+X+" coords: "+Y); Log.d(TAG,"ball coords:"+ball.getX()+" coords: "+ball.getY()); int x =X; int y =Y; Log.d(TAG,"lalalalalala"+x+" coords: "+y); if (x > ball.getX() && x < ball.getX()+50 && y > ball.getY() && y < ball.getY()+50){//if (X > ball.getX() && X < ball.getX()+50 && Y > ball.getY() && Y < ball.getY()+50){ Log.d(TAG,"inside ball coords!!:"+ball.getX()+" coords: "+ball.getY()); balID = ball.getID(); break; } } break; case MotionEvent.ACTION_MOVE: // touch drag with the ball // move the balls the same as the finger if (balID > 0) { colorballs[balID-1].setX(X-25); colorballs[balID-1].setY(Y-25); } break; case MotionEvent.ACTION_UP: // touch drop - just do things here after dropping break; } // redraw the canvas myView.invalidate(); return true; } public class DrawView extends View { public DrawView(Context context) { super(context); setFocusable(true); //necessary for getting the touch events // setting the start point for the balls } // the method that draws the balls @Override protected void onDraw(Canvas canvas) { //canvas.drawColor(0xFFCCCCCC); //if you want another background color //draw the balls on the canvas for (ColorBall ball : colorballs) { canvas.drawBitmap(ball.getBitmap(), ball.getX(), ball.getY(), null); } } } }
Anyone who knows why?
Yes @bigstones the onTouchevent is working,it captures all the actions,the problem is that if i have the ontouchevent code inside the activity the variables X,Y seems not to work althought that they have a value and i can print it(or log)what i am saying is tested,i've tried and change all the values from the if() statement(getX,getY)to integers and it didn't work only for X,Y.....check the code again please! thanks!
-
krasnoperov almost 12 yearsI think you may be seeing a side-effect of adding a click listener which is that this implies
setClickable(true)
. Rather than adding a listener that doesn't do anything useful, just callsetClickable()
instead.