引自:http://5200415.blog.51cto.com/3851969/1003113
android应用中常用的监听OnTouchListener、OnClickListener、OnLongClickListener。
首先在Activity中创建一个button,然后对这个button同时设置OnTouchListener、OnClickListener、OnLongClickListener这三种监听方式。
package com.example.testlistenerdemo; import android.os.Bundle; import android.app.Activity; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; import android.view.View.OnTouchListener; import android.widget.Button; import android.support.v4.app.NavUtils; public class MainActivity extends Activity { private Button 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。true,表示action_down 事件已经被消耗了。不管你怎么的click或者longclick 都不会得到响应。
②:
改变onTouchListener里的代码。将true改为false。
- if(event.getAction()==MotionEvent.ACTION_DOWN){
- Log.i("log","action_down");
- return false;
- }
效果为:
3个为一组。长按和短按按钮只会触发OnTouchListener、onLongClickListeneraction_down、action_up、
- //按下
- 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;
- }
-
执行结果:
前3个为短按。后4个为长按。
④:
注意:
true时要注意。如果你同时使用这三种监听的话。action_up之后如果产生long click的话。button可是一直处于按下的状态。可以从控件的颜色上看得到。
OnLongClickListener true和false在其中起着标志事件是否被消耗,如果消耗了就不再传递给其他控件了。如果没有消耗则还会传递给其他控件,触发其他控件的事件处理函数。
一个例子:
画红色圆点随着鼠标点击拖动而拖动,看的到拖动的痕迹。
package com.example.viewdemo; import android.app.Activity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.widget.LinearLayout; public class MainActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LinearLayout root = (LinearLayout)findViewById(R.id.root); //创建DrawView组件 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(); //返回true表明处理方法已经处理该事件 return true; } }); root.addView(draw); } }
package com.example.viewdemo; import android.app.Activity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.widget.LinearLayout; public class MainActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); LinearLayout root = (LinearLayout)findViewById(R.id.root); //创建DrawView组件 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(); //返回true表明处理方法已经处理该事件 return true; } }); root.addView(draw); } }
这里的OnTouchListener事件,如果return false。不会看到圆点拖动的痕迹。而是鼠标点击才会出现在相应位置。
说明true表示,拖动圆点一系列是一个事件。
以后最后都使用return true;