Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

onTouchevent() problem android

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!

like image 965
stelios Avatar asked Jan 23 '26 05:01

stelios


1 Answers

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!

like image 78
aarelovich Avatar answered Jan 25 '26 21:01

aarelovich



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!