android animationsetonTouchEvent和setOnTouchListener中onTouch的区别

* Pass the touch screen motion event down to the target view, or this
* view if it is the target.
* @param event The motion event to be dispatched.
* @return True if the event was handled by the view, false otherwise.
public boolean dispatchTouchEvent(MotionEvent event) {
if (mInputEventConsistencyVerifier != null) {
mInputEventConsistencyVerifier.onTouchEvent(event, 0);
if (onFilterTouchEventForSecurity(event)) {
//noinspection SimplifiableIfStatement
if (mOnTouchListener != null && (mViewFlags & ENABLED_MASK) == ENABLED &&
mOnTouchListener.onTouch(this, event)) {
if (onTouchEvent(event)) {
if (mInputEventConsistencyVerifier != null) {
mInputEventConsistencyVerifier.onUnhandledEvent(event, 0);
以上代码位于 android.view.View
如果mOnTouchListener不为空且mOnTouchListener.onTouch(this, event) 返回值为false,则向下执行onTouchEvent(event) 。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:58947次
积分:1068
积分:1068
排名:千里之外
原创:41篇
转载:31篇
(3)(3)(2)(1)(5)(10)(7)(2)(1)(1)(1)(4)(1)(1)(1)(1)(2)(1)(1)(1)(3)(2)(4)(9)(1)(2)(2)监听OnTouchListener、OnLongClickListener中返回值true或者false的含义
android应用中常用的监听OnTouchListener、OnClickListener、OnLongClickListener。
首先在Activity中创建一个button,然后对这个button同时设置OnTouchListener、OnClickListener、OnLongClickListener这三种监听方式。
package&com.example.&&&&import&android.os.B&&import&android.app.A&&import&android.util.L&&import&android.view.M&&import&android.view.MenuI&&import&android.view.MotionE&&import&android.view.V&&import&android.view.View.OnClickL&&import&android.view.View.OnLongClickL&&import&android.view.View.OnTouchL&&import&android.widget.B&&import&android.support.v4.app.NavU&&&&public&class&MainActivity&extends&Activity&{&&&&&&&&private&Button&&&&&&&@Override&&&&&&public&void&onCreate(Bundle&savedInstanceState)&{&&&&&&&&&&super.onCreate(savedInstanceState);&&&&&&&&&&setContentView(R.layout.activity_main);&&&&&&&&&&button&=&(Button)findViewById(R.id.button);&&&&&&&&&&&&&&&&&&&&button.setOnTouchListener(touchListener);&&&&&&&&&&&&&&&&&&&&button.setOnClickListener(clickListener);&&&&&&&&&&&&&&&&&&&&button.setOnLongClickListener(longClickListener);&&&&&&}&&&&&&&&&&&&public&OnTouchListener&touchListener&=&new&OnTouchListener()&{&&&&&&&&&&&&&&&&&&&&@Override&&&&&&&&&&public&boolean&onTouch(View&v,&MotionEvent&event)&{&&&&&&&&&&&&&&&&&&&&&&&&&&&if(event.getAction()==MotionEvent.ACTION_DOWN){&&&&&&&&&&&&&&&&&&Log.i(&log&,&action_down&);&&&&&&&&&&&&&&&&&&return&true;&&&&&&&&&&&&&&}else&if(event.getAction()==MotionEvent.ACTION_UP){&&&&&&&&&&&&&&&&&&Log.i(&log&,&action_up&);&&&&&&&&&&&&&&&&&&return&true;&&&&&&&&&&&&&&}else&if(event.getAction()==MotionEvent.ACTION_MOVE){&&&&&&&&&&&&&&&&&&Log.i(&log&,&action_move&);&&&&&&&&&&&&&&&&&&return&true;&&&&&&&&&&&&&&}&&&&&&&&&&&&&&return&false;&&&&&&&&&&}&&&&&&};&&&&&&&&&&&&public&OnClickListener&clickListener&=&new&OnClickListener()&{&&&&&&&&&&&&&&&&&&&&@Override&&&&&&&&&&public&void&onClick(View&v)&{&&&&&&&&&&&&&&Log.i(&long&,&&click&);&&&&&&&&&&}&&&&&&};&&&&&&&&&&&&public&OnLongClickListener&longClickListener&=&new&OnLongClickListener()&{&&&&&&&&&&&&&&&&&&&&@Override&&&&&&&&&&public&boolean&onLongClick(View&v)&{&&&&&&&&&&&&&&Log.i(&long&,&&long&click&);&&&&&&&&&&&&&&return&false;&&&&&&&&&&}&&&&&&};&&&&&&}&&
在都是返回true值的情况下,只会监听到onTouchListener。OnClickListener、OnLongClickListener不能被监听到。
650) this.width=650;" src="/upload//10.png" border="0" alt="" />
长按和短按按钮都只能触发onTouchListener的事件。
action_down处理完需要做的事情之后就返回true,表示action_down 事件已经被消耗了。不管你怎么的click或者longclick 都不会得到响应。
改变onTouchListener里的代码。将true改为false。
if(event.getAction()==MotionEvent.ACTION_DOWN){&&&&&&&&&&&&&&&&&&Log.i(&log&,&action_down&);&&&&&&&&&&&&&&&&&&return&false;&&&&&&&&&&&&&&}&&
650) this.width=650;" src="/upload//21.png" border="0" alt="" />
3个为一组。长按和短按按钮只会触发OnTouchListener、onLongClickListener事件。如果长按,则出现action_down、long click、action_up。短按则是action_down、action_up、long click,短按触发long click是因为action_up返回了true,它在起作用。因为没有更改长按的时间而是使用系统的500ms,所以在手离开手机屏幕的时候就又有了一次long click。
&&&&&&&&&&&&&if(event.getAction()==MotionEvent.ACTION_DOWN){&&&&&&&&&&&&&&&&&Log.i(&log&,&action_down&);&&&&&&&&&&&&&&&&&return&false;&&&&&&&&&&&&&}else&if(event.getAction()==MotionEvent.ACTION_UP){&&&&&&&&&&&&&&&&&Log.i(&log&,&action_up&);&&&&&&&&&&&&&&&&&return&false;&&&&&&&&&&&&&}&
执行结果:
650) this.width=650;" src="/upload//12.jpg" border="0" alt="" />
前3个为短按。后4个为长按。
action_up 返回true时要注意。如果你同时使用这三种监听的话。action_up之后如果产生long click的话。button可是一直处于按下的状态。可以从控件的颜色上看得到。
再者,使用OnLongClickListener&的时候也要注意它的返回值,返回true时会使手机的振动一下。而返回false时则不会有这种效果。
true和false在其中起着标志事件是否被消耗,如果消耗了就不再传递给其他控件了。如果没有消耗则还会传递给其他控件,触发其他控件的事件处理函数。
一个例子:
画红色圆点随着鼠标点击拖动而拖动,看的到拖动的痕迹。
package&com.example.&&import&android.app.A&import&android.os.B&import&android.view.MotionE&import&android.view.V&import&android.widget.LinearL&&public&class&MainActivity&extends&Activity{&&&&&&@Override&&&&&protected&void&onCreate(Bundle&savedInstanceState)&{&&&&&&&&&&&&&&&&&&super.onCreate(savedInstanceState);&&&&&&&&&setContentView(R.layout.activity_main);&&&&&&&&&LinearLayout&root&=&(LinearLayout)findViewById(R.id.root);&&&&&&&&&&&&&&&&&&final&DrawView&draw&=&new&DrawView(this);&&&&&&&&&&&&&&&&&&draw.setMinimumWidth(300);&&&&&&&&&draw.setMinimumHeight(500);&&&&&&&&&&&&&&&&&&draw.setOnTouchListener(new&View.OnTouchListener()&{&&&&&&&&&&&&&&&&&&&&&&&&&&public&boolean&onTouch(View&v,&MotionEvent&event)&{&&&&&&&&&&&&&&&&&draw.currentX&=&event.getX();&&&&&&&&&&&&&&&&&draw.currentY&=&event.getY();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&draw.invalidate();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&return&true;&&&&&&&&&&&&&}&&&&&&&&&});&&&&&&&&&root.addView(draw);&&&&&}&&&&&&}&
package&com.example.&&import&android.app.A&import&android.os.B&import&android.view.MotionE&import&android.view.V&import&android.widget.LinearL&&public&class&MainActivity&extends&Activity{&&&&&&@Override&&&&&protected&void&onCreate(Bundle&savedInstanceState)&{&&&&&&&&&&&&&&&&&&super.onCreate(savedInstanceState);&&&&&&&&&setContentView(R.layout.activity_main);&&&&&&&&&LinearLayout&root&=&(LinearLayout)findViewById(R.id.root);&&&&&&&&&&&&&&&&&&final&DrawView&draw&=&new&DrawView(this);&&&&&&&&&&&&&&&&&&draw.setMinimumWidth(300);&&&&&&&&&draw.setMinimumHeight(500);&&&&&&&&&&&&&&&&&&draw.setOnTouchListener(new&View.OnTouchListener()&{&&&&&&&&&&&&&&&&&&&&&&&&&&public&boolean&onTouch(View&v,&MotionEvent&event)&{&&&&&&&&&&&&&&&&&draw.currentX&=&event.getX();&&&&&&&&&&&&&&&&&draw.currentY&=&event.getY();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&draw.invalidate();&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&return&true;&&&&&&&&&&&&&}&&&&&&&&&});&&&&&&&&&root.addView(draw);&&&&&}&&&&&&}&
这里的OnTouchListener事件,如果return false。不会看到圆点拖动的痕迹。而是鼠标点击才会出现在相应位置。
说明true表示,拖动圆点一系列是一个事件。
以后最后都使用return true;
&千寻http://3
文章评论 以下网友留言只代表其个人观点,不代表本网站的观点和立场。2460人阅读
android(117)
最近做的2个东西中都碰到了需要对用户手势输入监听并做出一定的相应 抽空把这些基础实现做个记录 网上这方面资料也不少
这里说的手势监听只是简单的比如上滑,下滑,拖动等,而没有说到画图板这样的应用 当然举一反三这个也是能实现的。
这里分2种 第一种是某个view(比如一个自定义的view或是控件本身,也包括layout)需要监听,那么这个时候需要在这个view上setOnTouchListener,另一种是程序本身就监听,如此便是让类实现2个接口,即implements&OnGestureListener,
OnTouchListener(然后同样this.setOnTouchListener)
之后需要做的关键的一步,要记得对view或者class本身setOnTouchListener以后,还需要setLongClickable(true);&这是非常非常关键的一句话,不然手势监听无效
之后要做的是申明一个GestureDetector对象,直接new就可以了
这是需要实现几个关键的方法,具体实现哪些就是根据需要了。方法包括:
onSingleTapUp,onShowPress,onScroll,onLongPress,onFling,onDown
各自的功能从方法名上应该都能看出,这其中有一个方法onFling是比较关键的,一般来说手势识别都是在这个里面做监听,他在你做完一个手势的时候被触发。参数MotionEvent是对应你按下放开的动作,可以从中获得按下点的X,Y等,velocityX参数是X方向上移动的速度,这样当手势速度很慢的时候,我们可以通过判断不把这当做一个动作。
之后在onTouch方法上 把监听丢给GestureDetector
mGestureDetector.onTouchEvent(event);
最后如果程序不需要对手势做监听,只是需要响应触屏动作,那可以不用GestureDetector,只需要在onTouch中队MotionEvent.getAction做出判断就行了(Action.DOWN,UP等)
android:onTouch()和onTouchEvent()的区别
Android Touch Screen 与传统Click Touch Screen不同,会有一些手势(Gesture),例如Fling,Scroll等等。这些Gesture会使用户体验大大提升。
Android中的Gesture识别(detector)是通过GestureDetector.OnGestureListener接口实现的。
首先,Android事件处理机制是基于Listener实现的,比如触摸屏相关的事件,就是通过onTouchListener实现;
其次,所有View的子类都可以通过setOnTouchListener()、setOnKeyListener()等方法来添加对某一类事件的Listener;
第三,Listener一般会以Interface的方式来提供,其中包含一个或多个abstract方法,我们需要实现这些方法来完成 onTouch()、onKey()等操作。这样,程序便可以在特定的事件被dispatch到该view的时候,通过callback函数给予适当的响 应。
1. Touch Screen Click举例
class MyGesture extends
Activity implements
OnTouchListener
void onCreate(Bundle savedInstanceState)
super .onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = (TextView) findViewById(R.id.tv);
tv.setOnTouchListener( this
boolean onTouch(View v, MotionEvent event)
Toast.makeText( this
, &Touch Touch& , Toast.LENGTH_SHORT).show();
我们可以通过MotionEvent的getAction()方法来获取Touch事件的类型,包括 ACTION_DOWN(按下触摸屏), ACTION_MOVE(按下触摸屏后移动受力点), ACTION_UP(松开触摸屏)和ACTION_CANCEL(不会由用户直接触发)。借助对于用户不同操作的判断,结合getRawX()、 getRawY()、getX()和getY()等方法来获取坐标后,我们可以实现诸如拖动某一个按钮,拖动滚动条等功能。
2. 当我们捕捉到Touch操作的时候,如何识别出用户的Gesture?这里我们需要GestureDetector.OnGestureListener接口的帮助,代码如下:
class MyGesture extends
Activity implements
OnTouchListener, OnGestureListener
private GestureDetector mGestureD
public MyGesture()
mGestureDetector = new
GestureDetector( this );
void onCreate(Bundle savedInstanceState)
super .onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView tv = (TextView) findViewById(R.id.tv);
tv.setOnTouchListener( this
tv.setFocusable( true
tv.setClickable( true
tv.setLongClickable( true
mGestureDetector.setIsLongpressEnabled( true
/* * 在onTouch()方法中,我们调用GestureDetector的onTouchEvent()方法,将捕捉到的MotionEvent交给GestureDetector
* 来分析是否有合适的callback函数来处理用户的手势
boolean onTouch(View v, MotionEvent event)
return mGestureDetector.onTouchEvent(event);
// 用户轻触触摸屏,由1个MotionEvent ACTION_DOWN触发
boolean onDown(MotionEvent arg0)
Log.i( &MyGesture& ,
&onDown& );
Toast.makeText( this
, &onDown& , Toast.LENGTH_SHORT).show();
/* * 用户轻触触摸屏,尚未松开或拖动,由一个1个MotionEvent ACTION_DOWN触发
* 注意和onDown()的区别,强调的是没有松开或者拖动的状态
void onShowPress(MotionEvent e)
Log.i( &MyGesture& ,
&onShowPress& );
Toast.makeText( this
, &onShowPress& , Toast.LENGTH_SHORT).show();
// 用户(轻触触摸屏后)松开,由一个1个MotionEvent ACTION_UP触发
boolean onSingleTapUp(MotionEvent e)
Log.i( &MyGesture& ,
&onSingleTapUp& );
Toast.makeText( this
, &onSingleTapUp& , Toast.LENGTH_SHORT).show();
// 用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发
boolean onFling(MotionEvent e1, MotionEvent e2, float
velocityX, float
velocityY)
Log.i( &MyGesture& ,
&onFling& );
Toast.makeText( this
, &onFling& , Toast.LENGTH_LONG).show();
// 用户按下触摸屏,并拖动,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE触发
boolean onScroll(MotionEvent e1, MotionEvent e2, float
distanceX, float
distanceY)
Log.i( &MyGesture& ,
&onScroll& );
Toast.makeText( this
, &onScroll& , Toast.LENGTH_LONG).show();
// 用户长按触摸屏,由多个MotionEvent ACTION_DOWN触发
void onLongPress(MotionEvent e)
Log.i( &MyGesture& ,
&onLongPress& );
Toast.makeText( this
, &onLongPress& , Toast.LENGTH_LONG).show();
3. Fling事件的处理代码:除了第一个触发Fling的ACTION_DOWN和最后一个ACTION_MOVE中包含的坐标等信息外,我们还可以根据用 户在X轴或者Y轴上的移动速度作为条件。比如下面的代码中我们就在用户移动超过100个像素,且X轴上每秒的移动速度大于200像素时才进行处理。
boolean onFling(MotionEvent e1, MotionEvent e2, float
velocityX, float
velocityY)
// 参数解释:
// e1:第1个ACTION_DOWN MotionEvent
// e2:最后一个ACTION_MOVE MotionEvent
// velocityX:X轴上的移动速度,像素/秒
// velocityY:Y轴上的移动速度,像素/秒
// 触发条件 :
// X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒
int FLING_MIN_DISTANCE = 100 , FLING_MIN_VELOCITY =
if (e1.getX() - e2.getX() & FLING_MIN_DISTANCE && Math.abs(velocityX) & FLING_MIN_VELOCITY)
// Fling left
Log.i( &MyGesture& ,
&Fling left& );
Toast.makeText( this
, &Fling Left& , Toast.LENGTH_SHORT).show();
if (e2.getX() - e1.getX() & FLING_MIN_DISTANCE && Math.abs(velocityX) & FLING_MIN_VELOCITY)
// Fling right
Log.i( &MyGesture& ,
&Fling right& );
Toast.makeText( this
, &Fling Right& , Toast.LENGTH_SHORT).show();
这个例子中,tv.setLongClickable(true)是必须的,因为 只有这样,view才能够处理不同于Tap(轻触)的hold(即ACTION_MOVE,或者多个ACTION_DOWN),我们同样可以通过layout定义中的android:longClickable来做到这一点。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:121818次
积分:1713
积分:1713
排名:千里之外
原创:34篇
转载:123篇
(7)(4)(3)(4)(1)(4)(6)(3)(4)(2)(2)(6)(6)(1)(1)(1)(1)(1)(2)(2)(5)(2)(4)(1)(6)(1)(2)(5)(5)(7)(12)(1)(19)(15)(3)(8)个人分享(2)
& & & & 在android开发过程中,我们时常会需要与用户进行信息交互,就会接触到android的两种事件处理机制:事件回调机制(onEvent)和事件监听机制(onListener),那么他们两者之间到底有什么区别呢?我们来举两个例子,说明情况。
& & & & 首先是onTouchListener(以下简称TL)和onTouchEvent(以下简称TE),TL是一个接口类,调用它我们首先需要实现它的一个onTouch()抽象类方法,当指定区域监听到用户相对应的Action,就会进入该方法进行相应处理;那么TE其实是View类下面一个方法,和onTouch一样需要被重写,在其中我们可以根据不同的touch响应不同的处理方式。所以TL和View都是类,TE和onTouch都是类里面的方法,我们可以通过这两种方法处理不同的touch交互Action。
& & & & 那么onTouchListener和OnClickListener(以下简称CL)又有何区别呢?很明显的一点是,它们都是一种Listener监听机制,而TL可以监听到点击事件在onTouch中处理,并传入两个参数View和motionEvent,后者可以知道touch有哪些相应的Action,并分别处理,CL可以监听控件点击事件在onClick中处理,并只传入View参数,统一进行点击处理。
& & & & 有了这两种事件处理机制,我们可以灵活运用,并获得一个相对更好的用户体验,记住对产品来说,用户至上!
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:4623次
排名:千里之外
原创:10篇android中onTouchEvent和setOnTouchListener中onTouch的区别可以有些人并不了解,其实要说明白这个问题先要说下android的事件传递机制。
首先看下以下的代码1,这段代码反应了View处理事件的过程:
public boolean dispatchTouchEvent(MotionEvent event) {&&&&&&& if (mOnTouchListener != null && mOnTouchListener.onTouch(this, event)) {&&&&&&&&&&&&&&&&&& }&&&&&&& return onTouchEvent(event);&&& }
在代码1中有一点首先需要明确,那就是如果dispatchTouchEvent返回值为true则本次事件被系统消耗掉(就是被控件处理了), 然后一个新的事件会被传入,如果dispatchTouchEvent返回值为false,则不会有新的事件被传入。
好,明白了这一点再看那个代码1中if语句后面的条件mOnTouchListener != null && mOnTouchListener.onTouch(this, event),mOnTouchListener 对象其实不就是你写的监听器对象吗?比如下面代码2的这个匿名对象。
xxxView.setOnTouchListener(new OnTouchListener() {&& &&& &&& &@Override&& &&& &&& &public boolean onTouch(View v, MotionEvent event) {&& &&&& && &&& &&& &&& &&& &&& &&& &}&& &&& &});
好,我们再看下代码2中onTouch事件中的返回值,如果代码2 return true则代表什么呢?代表代码1中将不会执行 return onTouchEvent(event);语句,这也就是说这次系统事件会被消耗掉,将会再次执行dispatchTouchEvent这个方法。
如果代码2 return false则代表代码1会执行onTouchEvent(event);这个方法,本次事件是否会被消耗掉将取决于onTouchEvent的返回值。
做个小总结其实就是如果setOnTouchListener中的onTouch方法返回值是true则onTouchEvent方法将不会被执行;只有当setOnTouchListener中的onTouch方法返回值是false时onTouchEvent方法才被执行。
阅读(...) 评论() &}

我要回帖

更多关于 android set 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信