onTouchevent() problem android

22,265

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!

Share:
22,265
stelios
Author by

stelios

Updated on September 27, 2020

Comments

  • stelios
    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
    krasnoperov almost 12 years
    I 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 call setClickable() instead.