您可以類似這樣,先實(shí)例化子頁面中的Button控件,然后將實(shí)例化后的控件綁定監(jiān)聽事件 View view=LayoutInflater.from(context).inflate(R.layout.abc_action_bar_view_list_nav_layout,null);Button button= (Button) view.findViewById(R.id.action_bar);button.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {//寫上點(diǎn)擊后要執(zhí)行的事件}}); 當(dāng)然了,您要在不同頁面實(shí)現(xiàn)不同的功能的話,您可以將以上代碼寫在viewPager.setOnPageChangeListener的滾動(dòng)回調(diào)方法當(dāng)中進(jìn)行頁面滾動(dòng)的判斷,從而執(zhí)行不同的點(diǎn)擊事件。希望能幫到您,如果還有什么問題,歡迎您繼續(xù)追問。謝謝。
創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,提供網(wǎng)站制作、成都網(wǎng)站建設(shè),網(wǎng)頁設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);可快速的進(jìn)行網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,是專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
app我們常用的手勢(shì)有很多的地方,比如右滑關(guān)閉界面等。手勢(shì)控制分為觸發(fā)動(dòng)作(Touch Mechanics,用戶手指在屏幕上如何動(dòng)作)和觸發(fā)行為(Touch Activities,界面上特定動(dòng)作在特定情境下引發(fā)的結(jié)果)。這是因?yàn)橥瑯拥挠|發(fā)動(dòng)作(如單次觸擊)在不同情境下可能會(huì)帶來不同的結(jié)果(如輕觸,取消,開啟/關(guān)閉指示),同樣單次觸發(fā)行為(如放大)可能是由多種觸發(fā)動(dòng)作(如捏放,雙次觸擊,雙次觸擊拖拽等)實(shí)現(xiàn)。
一般情況下,我們知道View類有個(gè)View.OnTouchListener內(nèi)部接口,通過重寫他的onTouch(View v, MotionEvent event)方法,我們可以處理一些touch事件,但是這個(gè)方法太過簡(jiǎn)單,如果需要處理一些復(fù)雜的手勢(shì),用這個(gè)接口就會(huì)很麻煩(因?yàn)槲覀円约焊鶕?jù)用戶觸摸的軌跡去判斷是什么手勢(shì))。
Android sdk給我們提供了GestureDetector類,通過這個(gè)類我們可以識(shí)別很多的手勢(shì),主要是通過他的onTouchEvent(event)方法完成了不同手勢(shì)的識(shí)別。雖然他能識(shí)別手勢(shì),但是不同的手勢(shì)要怎么處理,應(yīng)該是提供給程序員實(shí)現(xiàn)的。
一.GestureDetector簡(jiǎn)介
1.組成
GestureDetector類用來識(shí)別觸摸屏的各種手勢(shì),它包含了兩個(gè)接口和一個(gè)內(nèi)部類:
接口:
OnGestureListener:用來監(jiān)聽手勢(shì)事件(6種)。
OnDoubleTapListener:用來監(jiān)聽雙擊事件。
內(nèi)部類:
SimpleOnGestureListener:用來監(jiān)聽所有的手勢(shì)。實(shí)際上它實(shí)現(xiàn)了上述兩個(gè)接口,不過方法體是空的,需要我們自己寫。我們可以繼承這個(gè)類,重寫里面的方法進(jìn)行手勢(shì)處理。
2.構(gòu)造
GestureDetector gestureDetector = new GestureDetector(GestureDetector.OnGestureListener listener);
GestureDetector gestureDetector = new GestureDetector(Context context,GestureDetector.OnGestureListener listener);
GestureDetector gestureDetector = new GestureDetector(Context context,GestureDetector.SimpleOnGestureListener listener);
3.方法
(1)onTouchEvent(MotionEvent ev) 分析捕捉到的觸摸事件觸發(fā)相應(yīng)的回調(diào)函數(shù)
(2)setIsLongpressEnabled(boolean isLongpressEnabled) 設(shè)置“長(zhǎng)按”是否可用
(3)setOnDoubleTapListener(GestureDetector.OnDoubleTapListener onDoubleTapListener) 設(shè)置雙擊監(jiān)聽器
4.使用
流程:
首先,系統(tǒng)捕捉屏幕的觸摸事件(onTouchListener),這時(shí)還未涉及具體手勢(shì),只是簡(jiǎn)單地捕捉到觸摸。
接著,在onTouch()方法中調(diào)用GestureDetector的onTouchEvent()方法,將捕捉到的MotionEvent交給GestureDetector來處理
最后,還需要實(shí)現(xiàn)抽象方法。
可根據(jù)需要選擇:
重寫OnGestureListener并通過構(gòu)造函數(shù)傳入gestureDetector
重寫OnDoubleTapListener并通過GestureDetector.setOnDoubleTapListener方法傳入gestureDetector
重寫SimpleOnGestureListener并通過構(gòu)造函數(shù)傳入gestureDetector
實(shí)現(xiàn):
注:不要注重我寫的類是什么類,要注重實(shí)現(xiàn)方法自定義view和activity中都可以,根據(jù)需要繼承上面三種listener,傳入構(gòu)造函數(shù)即可;
public class TestDemo{
Context context;
public TestDemo(Context context){
this.context = context;
}
private GestureDetectordetector;
private void initView(){
detector =new GestureDetector(context, new MySimple());
detector =new GestureDetector(context, new MyGesture());
detector =new GestureDetector(context, new MyDoubleTap());
setOnTouchListener((v, event) - {
// 事件監(jiān)聽交給手勢(shì)類來處理
detector.onTouchEvent(event);
return true;
});
}
//與上面二選一
@Override
public boolean onTouchEvent(MotionEvent event) {
return detector.onTouchEvent(event);
}
// 手勢(shì)監(jiān)聽器類SimpleOnGestureListener
private class MySimple extends GestureDetector.SimpleOnGestureListener {
? ? @Override
? ? public boolean onSingleTapUp(MotionEvent e) {//一次單獨(dú)的輕擊抬起操作,也就是輕擊一下屏幕,立刻抬起來,才會(huì)有這個(gè)觸發(fā);如果除了Down以外還有其它操作,那就不再是Single操作了,所以也就不會(huì)觸發(fā)這個(gè)事件
? ? ? ? return super.onSingleTapUp(e);
? ? }
? ? @Override
? ? public void onLongPress(MotionEvent e) {//長(zhǎng)按事件;
? ? ? ? super.onLongPress(e);
? ? }
? ? @Override
? ? public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {//在屏幕上拖動(dòng)事件,只要手指移動(dòng)就會(huì)執(zhí)行,無論是用手拖動(dòng)view,或者是以拋的動(dòng)作滾動(dòng),都會(huì)多次觸發(fā),這個(gè)方法在ACTION_MOVE動(dòng)作發(fā)生時(shí)就會(huì)觸發(fā)他不會(huì)執(zhí)行MotionEvent.ACTION_UP,通常用來實(shí)現(xiàn)放大縮小和移動(dòng)。
? ? ? ? return false;
? ? }
? ? @Override
? ? public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {//滑動(dòng)屏幕,用戶按下觸摸屏、快速移動(dòng)后松開,由1個(gè)MotionEvent ACTION_DOWN, 多個(gè)ACTION_MOVE, 1個(gè)ACTION_UP觸發(fā);是個(gè)甩的動(dòng)作,這個(gè)甩的動(dòng)作是在一個(gè)MotionEvent.ACTION_UP(手指抬起)發(fā)生時(shí)執(zhí)行,通常用來實(shí)現(xiàn)翻頁效果
? ? ? ? return super.onFling(e1, e2, velocityX, velocityY);
? ? }
? ? @Override
? ? public void onShowPress(MotionEvent e) {//down事件發(fā)生而move或則up還沒發(fā)生前觸發(fā)該事件;
? ? ? ? super.onShowPress(e);
? ? }
? ? @Override
? ? public boolean onDown(MotionEvent e) {//down事件用戶按下屏幕
? ? ? ? return super.onDown(e);
? ? }
? ? @Override
? ? public boolean onDoubleTap(MotionEvent e) {//雙擊事件
? ? ? ? return super.onDoubleTap(e);
? ? }
? ? @Override
? ? public boolean onDoubleTapEvent(MotionEvent e) {//雙擊間隔中還發(fā)生其他的動(dòng)作。通知DoubleTap手勢(shì)中的事件,包含down、up和move事件(這里指的是在雙擊之間發(fā)生的事件,例如在同一個(gè)地方雙擊會(huì)產(chǎn)生DoubleTap手勢(shì),而在DoubleTap手勢(shì)里面還會(huì)發(fā)生down和up事件,這兩個(gè)事件由該函數(shù)通知)
? ? ? ? return super.onDoubleTapEvent(e);
? ? }
? ? @Override
? ? public boolean onSingleTapConfirmed(MotionEvent e) {//單擊事件。用來判定該次點(diǎn)擊是SingleTap而不是DoubleTap,如果連續(xù)點(diǎn)擊兩次就是DoubleTap手勢(shì),如果只點(diǎn)擊一次,系統(tǒng)等待一段時(shí)間后沒有收到第二次點(diǎn)擊則判定該次點(diǎn)擊為SingleTap而不是DoubleTap,然后觸發(fā)SingleTapConfirmed事件。
? ? ? ? return super.onSingleTapConfirmed(e);
? ? }
}
// 手勢(shì)監(jiān)聽器類GestureListener
private class MyGesture extends GestureDetector.OnGestureListener{
? ? @Override
? ? public boolean onDown(MotionEvent e) {//down事件用戶按下屏幕
? ? ? ? return false;
? ? }
? ? @Override
? ? public void onShowPress(MotionEvent e) {//down事件發(fā)生瞬間而move或則up還沒發(fā)生前觸發(fā)該事件;
? ? }
? ? @Override
? ? public boolean onSingleTapUp(MotionEvent e) {//一次單獨(dú)的輕擊抬起操作,也就是輕擊一下屏幕,立刻抬起來,才會(huì)有這個(gè)觸發(fā);如果除了Down以外還有其它操作,那就不再是Single操作了,所以也就不會(huì)觸發(fā)這個(gè)事件;
? ? ? ? return super.onSingleTapUp(e);
? ? }
? ? @Override
? ? public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {//在屏幕上拖動(dòng)事件,只要手指移動(dòng)就會(huì)執(zhí)行,無論是用手拖動(dòng)view,或者是以拋的動(dòng)作滾動(dòng),都會(huì)多次觸發(fā),這個(gè)方法在ACTION_MOVE動(dòng)作發(fā)生時(shí)就會(huì)觸發(fā)他不會(huì)執(zhí)行MotionEvent.ACTION_UP,通常用來實(shí)現(xiàn)放大縮小和移動(dòng)。
? ? ? ? return false;
? ? }
? ? @Override
? ? public void onLongPress(MotionEvent e) {//長(zhǎng)按事件,超過一定時(shí)長(zhǎng)觸發(fā)該事件回調(diào);
? ? ? ? super.onLongPress(e);
? ? }
? ? public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {//滑動(dòng)屏幕,用戶按下觸摸屏、快速移動(dòng)后松開,由1個(gè)MotionEvent ACTION_DOWN, 多個(gè)ACTION_MOVE, 1個(gè)ACTION_UP觸發(fā);是個(gè)甩的動(dòng)作,這個(gè)甩的動(dòng)作是在一個(gè)MotionEvent.ACTION_UP(手指抬起)發(fā)生時(shí)執(zhí)行,通常用來實(shí)現(xiàn)翻頁效果
? ? ? ? return super.onFling(e1, e2, velocityX, velocityY);
? ? }
}
// 手勢(shì)監(jiān)聽器類SimpleOnGestureListener
private class MyDoubleTap extends GestureDetector.OnDoubleTapListener {
? ? @Override
? ? public boolean onDoubleTap(MotionEvent e) {//雙擊事件
? ? ? ? return super.onDoubleTap(e);
? ? }
? ? @Override
? ? public boolean onDoubleTapEvent(MotionEvent e) {//雙擊間隔中還發(fā)生其他的動(dòng)作。通知DoubleTap手勢(shì)中的事件,包含down、up和move事件(這里指的是在雙擊之間發(fā)生的事件,例如在同一個(gè)地方雙擊會(huì)產(chǎn)生DoubleTap手勢(shì),而在DoubleTap手勢(shì)里面還會(huì)發(fā)生down和up事件,這兩個(gè)事件由該函數(shù)通知)
? ? ? ? return super.onDoubleTapEvent(e);
? ? }
? ? @Override
? ? public boolean onSingleTapConfirmed(MotionEvent e) {//單擊事件。用來判定該次點(diǎn)擊是SingleTap而不是DoubleTap,如果連續(xù)點(diǎn)擊兩次就是DoubleTap手勢(shì),如果只點(diǎn)擊一次,系統(tǒng)等待一段時(shí)間后沒有收到第二次點(diǎn)擊則判定該次點(diǎn)擊為SingleTap而不是DoubleTap,然后觸發(fā)SingleTapConfirmed事件。
? ? ? ? return super.onSingleTapConfirmed(e);
? ? }
}
}
關(guān)于onFling()和onScroll()的區(qū)別:
onFling()是甩,這個(gè)甩的動(dòng)作是在一個(gè)MotionEvent.ACTION_UP(手指抬起)發(fā)生時(shí)執(zhí)行,而onScroll(),只要手指移動(dòng)就會(huì)執(zhí)行。他不會(huì)執(zhí)行MotionEvent.ACTION_UP。onFling通常用來實(shí)現(xiàn)翻頁效果,而onScroll通常用來實(shí)現(xiàn)放大縮小和移動(dòng)。
關(guān)于onSingleTapConfirmed和onSingleTapUp的一點(diǎn)區(qū)別: OnGestureListener有這樣的一個(gè)方法onSingleTapUp,和onSingleTapConfirmed容易混淆。二者的區(qū)別是:onSingleTapUp,只要手抬起就會(huì)執(zhí)行,而對(duì)于onSingleTapConfirmed來說,如果雙擊的話,則onSingleTapConfirmed不會(huì)執(zhí)行
SimpleOnGestureListener是GestureDetector類的一個(gè)內(nèi)部類,該類是static class,也就是說它實(shí)際上是一個(gè)外部類。可以在外部繼承這個(gè)類,重寫里面的手勢(shì)處理方法。
1.OnDoubleTapListener是用來檢測(cè)鼠標(biāo)雙擊事件的
2.SimpleOnGestureListener實(shí)際上實(shí)現(xiàn)了OnGestureListener 和OnDoubleTapListener,所以它可以完成以上提到的所有手勢(shì)識(shí)別(9種)
1、先申明一個(gè)監(jiān)聽對(duì)象
2、不同按鈕設(shè)置同一個(gè)監(jiān)聽對(duì)象
3、監(jiān)聽中,通過按鈕的id判斷是哪個(gè)按鈕的點(diǎn)擊事件
代碼如下
1、new監(jiān)聽
OnClickListener clickListener = new OnClickListener(){
@Override
public void onClick(View v) {
if (v.getId()==R.id.button1){//按鈕1
}else if(v.getId()==R.id.button2}{//按鈕2
}
}
2、設(shè)置監(jiān)聽
Button btn1 = (Button)findViewById(R.id.button1);
Button btn2 = (Button)findViewById(R.id.button1);
btn1.setOnClickListener(clickListener);
btn2.setOnClickListener(clickListener);
在我們的項(xiàng)目開發(fā)中,有時(shí)會(huì)遇到這樣的需求:當(dāng)用戶在輸入框中進(jìn)行了粘貼操作,直接就使用粘貼的內(nèi)容進(jìn)行服務(wù)端接口的請(qǐng)求,不需要用戶再點(diǎn)擊確認(rèn)后才去進(jìn)行接口請(qǐng)求。
對(duì)于這種情況,可以想到兩種方式實(shí)現(xiàn):
其實(shí)以上兩種業(yè)務(wù)實(shí)現(xiàn)方式都涉及到了監(jiān)聽復(fù)制、剪切、粘貼事件。
1 - 通過剪切板監(jiān)聽。
2 - 通過自定義EditText,重寫onTextContextMenuItem() 方法實(shí)現(xiàn)監(jiān)聽。
剪切板的實(shí)現(xiàn)其實(shí)在官方文檔中找到相應(yīng)的內(nèi)容。
我這里只監(jiān)聽了粘貼事件。如果有需要,可以自行拓展回調(diào)接口。
通過這種方法監(jiān)聽有點(diǎn)要注意,那就是你在回調(diào)中是獲取不到復(fù)制、剪切、粘貼的文本內(nèi)容的。想要獲取到復(fù)制、剪切的文本還是需要通過監(jiān)聽剪切板去獲取。
粘貼的內(nèi)容的獲取 其實(shí)可以在Activity中添加個(gè)標(biāo)記,在TextWatcher中判斷此標(biāo)記。這樣可以間接的獲取到粘貼內(nèi)容。因?yàn)樵趏nTextContextMenuItem(),自定義的回調(diào)先于super.onTextContextMenuItem(id)執(zhí)行。這只加單寫了EditText中內(nèi)容為空的情況,如果有內(nèi)容,那么自己去進(jìn)行字符串的邏輯操作吧。我這里就不寫了。 實(shí)測(cè)有效哦。
OK,本章內(nèi)容到此就結(jié)束了。如果大家有什么更好的方法,或者覺得我的方法有啥可以改進(jìn)的地方,歡迎評(píng)論留言哦。