in iOS world, there's a concept of touchUpInside
, touch started within a view and user lifted a finger within a view bound.
I see touch
vs click
(event listeners) in android, and I'd like to know the difference between them.
Touch events are much more basic. There's many varieties. The most common being:
DOWN
: The user touch the item
MOVE
: The user shifts around the item after touching it
UP
: The user stops touch the item
CANCEL
: The user shifts off the item but is still touching the screen.
In Android, a click
event is a composite of touch events. In the case of click
it's both DOWN
and UP
action. There are others that can be found in a GestureDetector
. Fling
for example is a combination of DOWN
, MOVE
, and UP
in a fast motion that signifies the user swiped the finger really fast.
EDIT:
Clarification on how Android handles the true
and false
in onTouchEvent().
It's not very well documented, but the way the Views work in Android is that when you touch a View, it will send that touch event from the parent view to all children views. Each child will then send the event to it's children. This is done in the dispatchTouchEvent()
method.
When a parent View
receives false
from the child's onTouchEvent()
method, it will no longer send touch events to that child. Meaning that when you're view returns false
in onTouchEvent()
, your View is really says:
I am done processing touch events and all of my children are done as well.
90% of the time, in onTouchEvent()
you would do return super.onTouchEvent()
to return the touch values of all the children in the View
.
So let's look at your click example. Here's one way to do it in which you return false on a DOWN
event, but true on an UP.
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
return false;
case MotionEvent.ACTION_UP:
return true;
break;
default:
return false;
}
}
In this case, the parent of this View
will receive false immediately. After which, it will stop sending touch events to this View
because you said it was done.
Here's another way:
boolean mPossibleClick = false;
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mPossibleClick = true;
break;
case MotionEvent.ACTION_UP:
if(mPossibleClick) {
// UP event immediately after DOWN. Perform click action
}
default:
mPossibleClick = false;
}
return mPossibleClick;
}
It's rather crude, but basically here's what will happen. When the user first touches it, you will receive DOWN
which will return true. If the user lifts the finger, it will perform a click
action after which will return false because the event is done. If the user moves his finger or any other action is performed, it will return false and the click will be nulled out.
That last one is not the best way to implement a click, but I think it illustrates what I'm trying to say. In real life, move events are extremely common if even for a couple pixels.
onClickListener is used whenever a click event for any view is raised, say for example: click event for Button, ImageButton.
onTouchListener is used whenever you want to implement Touch kind of functionality, say for example if you want to get co-ordinates of screen where you touch exactly.
Definitions:
onClickListner: Interface definition for a callback to be invoked when a view is clicked.
onTouchListener: Interface definition for a callback to be invoked when a touch event is dispatched to this view. The callback will be invoked before the touch event is given to the view.
Details:
onClickListener: http://developer.android.com/reference/android/view/View.OnClickListener.html
onTouchListener: http://developer.android.com/reference/android/view/View.OnTouchListener.html
refer to the response of PH7
which one is better to use?
It really depends on your requirement.
onTouch
gives you Motion Event. Thus, you can do a lot of fancy things as it help you separate state of movement. Just to name a few
ACTION_UP
ACTION_DOWN
ACTION_MOVE
Those are common actions we usually implement to get desire result such as dragging view on screen.
On the other hand, onClick
doesn't give you much except which view user interacts. onClick
is a complete event comprising of focusing,pressing and releasing. So, you have little control over it. One side up is it is very simple to implement.
do we need to implement both?
It is not necessary unless you want to mess up with your user. If you just want simple click event, go for onClick
. If you want more than click, go for onTouch
. Doing both will complicate the process.
From User point of view, it is unnoticeable if you implement onTouch
carefully to look like onClick
.