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。OnClickListener、OnLongClickListener不能被监听到。
长按和短按按钮都只能触发onTouchListener的事件。
action_down处理完需要做的事情之后就返回true,表示action_down 事件已经被消耗了。不管你怎么的click或者longclick 都不会得到响应。
②:
改变onTouchListener里的代码。将true改为false。
- if(event.getAction()==MotionEvent.ACTION_DOWN){
- Log.i("log","action_down");
- return false;
- }
效果为:
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;
- }
执行结果:
前3个为短按。后4个为长按。
④:
注意:
action_up 返回true时要注意。如果你同时使用这三种监听的话。action_up之后如果产生long click的话。button可是一直处于按下的状态。可以从控件的颜色上看得到。
再者,使用OnLongClickListener 的时候也要注意它的返回值,返回true时会使手机的振动一下。而返回false时则不会有这种效果。
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;
转载于:https://blog.51cto.com/3861969/1003113