Reputation: 81
I am quite new to Android programming and Java (though I have some experience with C#, so that helps).
At this moment I'm goofing around with a couple of things to get to know how everything works. I've made an activity which implements onTouchListener. I've overridden onTouch and have a switch on event.getAction():
public boolean onTouch(View v, MotionEvent event)
{
float x;
float y;
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN: // gets called
{
x = event.getX();
y = event.getY();
circle c = new circle(this, x, y, 10, 0xFFFFFF);
_main.addView(c, tapCount++);
break;
}
case MotionEvent.ACTION_MOVE: // doesnt seem to do anything
{
x = event.getX();
y = event.getY();
circle c = new circle(this, x, y, 10, 0xFFFFFF);
_main.addView(c, tapCount++);
break;
}
}
return false;
}
Where "circle" is a class which draws a circle.
What I expected to see was a trail of circles as I dragged my finger over the screen. In stead, the circle is only being drawn when I start touching.
I have compared my code to examples (for example: this blogpost by Google: http://android-developers.blogspot.com/2010/06/making-sense-of-multitouch.html ) and I can't find my mistake.
EDIT: Link to the full class: http://pastebin.com/tVDQjQhu
EDIT: Fixed. One has to return true in the onTouch() function. d'oh!
Upvotes: 8
Views: 20962
Reputation: 1
You have to use return true for every event. If you use return only one time then only Action_Down will call. This will help you.
@Override
public boolean onTouchEvent(MotionEvent event) {
final float X = event.getX();
final float Y = event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
x = X;
y = Y;
invalidate();
return true;
case MotionEvent.ACTION_MOVE:
x = X;
y = Y;
invalidate();
return true;
case MotionEvent.ACTION_UP:
invalidate();
return true;
}
return super.onTouchEvent(event);
}
Upvotes: 0
Reputation: 2694
For me Solution was
return true
in the onTouch function as you should use this
public boolean onTouch(View v, MotionEvent event){
float x;
float y;
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN: // gets called
{
x = event.getX();
y = event.getY();
circle c = new circle(this, x, y, 10, 0xFFFFFF);
_main.addView(c, tapCount++);
break;
}
case MotionEvent.ACTION_MOVE: // doesnt seem to do anything
{
x = event.getX();
y = event.getY();
circle c = new circle(this, x, y, 10, 0xFFFFFF);
_main.addView(c, tapCount++);
break;
}
}
return true; //the problem was here
}
when you return false from onTouch(View v, MotionEvent event) then only MotionEvent.ACTION_DOWN will be called. so you should return true from this function
Hope this is helps
Upvotes: 15
Reputation: 11
Had the same problems too, I don't know if it's a bug or not, but I managed to make it work by adding OnClickListener
to the implementation, and implementing public void onClick(View v)
then also adding setOnClickListener(this)
on the constructor.
Upvotes: 1
Reputation: 6728
I was having the same problem while using MotionEvent.ACTION_MOVE
.
For MotionEvent.ACTION_MOVE
to work, return true instead of false.
Upvotes: 46