您的位置:首页 > 移动开发 > Android开发

Android------三种监听OnTouchListener、OnLongClickListener同时实现即其中返回值true或者false的含义

2015-03-09 15:50 429 查看
引自: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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐