android應(yīng)用中常用的監(jiān)聽(tīng)OnTouchListener凉馆、OnClickListener、OnLongClickListener漫拭。
首先在Activity中創(chuàng)建一個(gè)button萧芙,然后對(duì)這個(gè)button同時(shí)設(shè)置OnTouchListener、OnClickListener刁憋、OnLongClickListener這三種監(jiān)聽(tīng)方式。
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值的情況下木蹬,只會(huì)監(jiān)聽(tīng)到onTouchListener至耻。OnClickListener、OnLongClickListener不能被監(jiān)聽(tīng)到镊叁。
執(zhí)行結(jié)果:
長(zhǎng)按和短按按鈕都只能觸發(fā)onTouchListener的事件尘颓。
action_down處理完需要做的事情之后就返回true,表示action_down 事件已經(jīng)被消耗了晦譬。不管你怎么的click或者longclick 都不會(huì)得到響應(yīng)疤苹。
②:
改變onTouchListener里的代碼。將true改為false敛腌。
if(event.getAction()==MotionEvent.ACTION_DOWN){
Log.i("log","action_down");
return false;
}
執(zhí)行結(jié)果:
3個(gè)為一組卧土。長(zhǎng)按和短按按鈕只會(huì)觸發(fā)OnTouchListener、onLongClickListener事件像樊。如果長(zhǎng)按尤莺,則出現(xiàn)action_down、long click生棍、action_up缝裁。短按則是action_down、action_up足绅、long click,短按觸發(fā)long click是因?yàn)閍ction_up返回了true韩脑,它在起作用氢妈。因?yàn)闆](méi)有更改長(zhǎng)按的時(shí)間而是使用系統(tǒng)的500ms,所以在手離開(kāi)手機(jī)屏幕的時(shí)候就又有了一次long click段多。
③:
//按下
if(event.getAction()==MotionEvent.ACTION_DOWN){
Log.i("log","action_down");
returnfalse;
}elseif(event.getAction()==MotionEvent.ACTION_UP){
Log.i("log","action_up");
returnfalse;
}
執(zhí)行結(jié)果:
前3個(gè)為短按首量。后4個(gè)為長(zhǎng)按。
④:
注意:
action_up 返回true時(shí)要注意。如果你同時(shí)使用這三種監(jiān)聽(tīng)的話加缘。action_up之后如果產(chǎn)生long click的話鸭叙。button可是一直處于按下的狀態(tài)〖鸷辏可以從控件的顏色上看得到沈贝。
再者,使用OnLongClickListener的時(shí)候也要注意它的返回值勋乾,返回true時(shí)會(huì)使手機(jī)的振動(dòng)一下宋下。而返回false時(shí)則不會(huì)有這種效果。
true和false在其中起著標(biāo)志事件是否被消耗辑莫,如果消耗了就不再傳遞給其他控件了学歧。如果沒(méi)有消耗則還會(huì)傳遞給其他控件,觸發(fā)其他控件的事件處理函數(shù)各吨。
原文鏈接:http://5200415.blog.51cto.com/3851969/1003113/