android單擊事件
㈠ android中所有控制項都可以設置單擊事件嗎
view類的控制項都可以設置點擊事件,要想知道一個控制項有哪些事件屬性,可以看他的API文檔
㈡ Android 雙擊單擊事件監聽手勢檢測GestureDetector原理及實現
app我們常用的手勢有很多的地方,比如右滑關閉界面等。手勢控制分為觸發動作(Touch Mechanics,用戶手指在屏幕上如何動作)和觸發行為(Touch Activities,界面上特定動作在特定情境下引發的結果)。這是因為同樣的觸發動作(如單次觸擊)在不同情境下可能會帶來不同的結果(如輕觸,取消,開啟/關閉指示),同樣單次觸發行為(如放大)可能是由多種觸發動作(如捏放,雙次觸擊,雙次觸擊拖拽等)實現。
一般情況下,我們知道View類有個View.OnTouchListener內部介面,通過重寫他的onTouch(View v, MotionEvent event)方法,我們可以處理一些touch事件,但是這個方法太過簡單,如果需要處理一些復雜的手勢,用這個介面就會很麻煩(因為我們要自己根據用戶觸摸的軌跡去判斷是什麼手勢)。
Android sdk給我們提供了GestureDetector類,通過這個類我們可以識別很多的手勢,主要是通過他的onTouchEvent(event)方法完成了不同手勢的識別。雖然他能識別手勢,但是不同的手勢要怎麼處理,應該是提供給程序員實現的。
一.GestureDetector簡介
1.組成
GestureDetector類用來識別觸摸屏的各種手勢,它包含了兩個介面和一個內部類:
介面:
OnGestureListener:用來監聽手勢事件(6種)。
OnDoubleTapListener:用來監聽雙擊事件。
內部類:
SimpleOnGestureListener:用來監聽所有的手勢。實際上它實現了上述兩個介面,不過方法體是空的,需要我們自己寫。我們可以繼承這個類,重寫裡面的方法進行手勢處理。
2.構造
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) 分析捕捉到的觸摸事件觸發相應的回調函數
(2)setIsLongpressEnabled(boolean isLongpressEnabled) 設置「長按」是否可用
(3)setOnDoubleTapListener(GestureDetector.OnDoubleTapListener onDoubleTapListener) 設置雙擊監聽器
4.使用
流程:
首先,系統捕捉屏幕的觸摸事件(onTouchListener),這時還未涉及具體手勢,只是簡單地捕捉到觸摸。
接著,在onTouch()方法中調用GestureDetector的onTouchEvent()方法,將捕捉到的MotionEvent交給GestureDetector來處理
最後,還需要實現抽象方法。
可根據需要選擇:
重寫OnGestureListener並通過構造函數傳入gestureDetector
重寫OnDoubleTapListener並通過GestureDetector.setOnDoubleTapListener方法傳入gestureDetector
重寫SimpleOnGestureListener並通過構造函數傳入gestureDetector
實現:
註:不要注重我寫的類是什麼類,要注重實現方法自定義view和activity中都可以,根據需要繼承上面三種listener,傳入構造函數即可;
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) -> {
// 事件監聽交給手勢類來處理
detector.onTouchEvent(event);
return true;
});
}
//與上面二選一
@Override
public boolean onTouchEvent(MotionEvent event) {
return detector.onTouchEvent(event);
}
// 手勢監聽器類SimpleOnGestureListener
private class MySimple extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onSingleTapUp(MotionEvent e) {//一次單獨的輕擊抬起操作,也就是輕擊一下屏幕,立刻抬起來,才會有這個觸發;如果除了Down以外還有其它操作,那就不再是Single操作了,所以也就不會觸發這個事件
return super.onSingleTapUp(e);
}
@Override
public void onLongPress(MotionEvent e) {//長按事件;
super.onLongPress(e);
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {//在屏幕上拖動事件,只要手指移動就會執行,無論是用手拖動view,或者是以拋的動作滾動,都會多次觸發,這個方法在ACTION_MOVE動作發生時就會觸發他不會執行MotionEvent.ACTION_UP,通常用來實現放大縮小和移動。
return false;
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {//滑動屏幕,用戶按下觸摸屏、快速移動後松開,由1個MotionEvent ACTION_DOWN, 多個ACTION_MOVE, 1個ACTION_UP觸發;是個甩的動作,這個甩的動作是在一個MotionEvent.ACTION_UP(手指抬起)發生時執行,通常用來實現翻頁效果
return super.onFling(e1, e2, velocityX, velocityY);
}
@Override
public void onShowPress(MotionEvent e) {//down事件發生而move或則up還沒發生前觸發該事件;
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) {//雙擊間隔中還發生其他的動作。通知DoubleTap手勢中的事件,包含down、up和move事件(這里指的是在雙擊之間發生的事件,例如在同一個地方雙擊會產生DoubleTap手勢,而在DoubleTap手勢裡面還會發生down和up事件,這兩個事件由該函數通知)
return super.onDoubleTapEvent(e);
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {//單擊事件。用來判定該次點擊是SingleTap而不是DoubleTap,如果連續點擊兩次就是DoubleTap手勢,如果只點擊一次,系統等待一段時間後沒有收到第二次點擊則判定該次點擊為SingleTap而不是DoubleTap,然後觸發SingleTapConfirmed事件。
return super.onSingleTapConfirmed(e);
}
}
// 手勢監聽器類GestureListener
private class MyGesture extends GestureDetector.OnGestureListener{
@Override
public boolean onDown(MotionEvent e) {//down事件用戶按下屏幕
return false;
}
@Override
public void onShowPress(MotionEvent e) {//down事件發生瞬間而move或則up還沒發生前觸發該事件;
}
@Override
public boolean onSingleTapUp(MotionEvent e) {//一次單獨的輕擊抬起操作,也就是輕擊一下屏幕,立刻抬起來,才會有這個觸發;如果除了Down以外還有其它操作,那就不再是Single操作了,所以也就不會觸發這個事件;
return super.onSingleTapUp(e);
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {//在屏幕上拖動事件,只要手指移動就會執行,無論是用手拖動view,或者是以拋的動作滾動,都會多次觸發,這個方法在ACTION_MOVE動作發生時就會觸發他不會執行MotionEvent.ACTION_UP,通常用來實現放大縮小和移動。
return false;
}
@Override
public void onLongPress(MotionEvent e) {//長按事件,超過一定時長觸發該事件回調;
super.onLongPress(e);
}
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {//滑動屏幕,用戶按下觸摸屏、快速移動後松開,由1個MotionEvent ACTION_DOWN, 多個ACTION_MOVE, 1個ACTION_UP觸發;是個甩的動作,這個甩的動作是在一個MotionEvent.ACTION_UP(手指抬起)發生時執行,通常用來實現翻頁效果
return super.onFling(e1, e2, velocityX, velocityY);
}
}
// 手勢監聽器類SimpleOnGestureListener
private class MyDoubleTap extends GestureDetector.OnDoubleTapListener {
@Override
public boolean onDoubleTap(MotionEvent e) {//雙擊事件
return super.onDoubleTap(e);
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {//雙擊間隔中還發生其他的動作。通知DoubleTap手勢中的事件,包含down、up和move事件(這里指的是在雙擊之間發生的事件,例如在同一個地方雙擊會產生DoubleTap手勢,而在DoubleTap手勢裡面還會發生down和up事件,這兩個事件由該函數通知)
return super.onDoubleTapEvent(e);
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {//單擊事件。用來判定該次點擊是SingleTap而不是DoubleTap,如果連續點擊兩次就是DoubleTap手勢,如果只點擊一次,系統等待一段時間後沒有收到第二次點擊則判定該次點擊為SingleTap而不是DoubleTap,然後觸發SingleTapConfirmed事件。
return super.onSingleTapConfirmed(e);
}
}
}
關於onFling()和onScroll()的區別:
onFling()是甩,這個甩的動作是在一個MotionEvent.ACTION_UP(手指抬起)發生時執行,而onScroll(),只要手指移動就會執行。他不會執行MotionEvent.ACTION_UP。onFling通常用來實現翻頁效果,而onScroll通常用來實現放大縮小和移動。
關於onSingleTapConfirmed和onSingleTapUp的一點區別: OnGestureListener有這樣的一個方法onSingleTapUp,和onSingleTapConfirmed容易混淆。二者的區別是:onSingleTapUp,只要手抬起就會執行,而對於onSingleTapConfirmed來說,如果雙擊的話,則onSingleTapConfirmed不會執行
SimpleOnGestureListener是GestureDetector類的一個內部類,該類是static class,也就是說它實際上是一個外部類。可以在外部繼承這個類,重寫裡面的手勢處理方法。
1.OnDoubleTapListener是用來檢測滑鼠雙擊事件的
2.SimpleOnGestureListener實際上實現了OnGestureListener 和OnDoubleTapListener,所以它可以完成以上提到的所有手勢識別(9種)
㈢ android中單擊事件怎麼與OnTouch共存
ctivity onTouch 里差和面要接受ACTION_DOWN事件模祥才會接著處虛碼盯理ACTION_UP事件哦,如果ACTION_DOWN就直接返回false,UP事件自然不會響應了。
你可以在UP事件處理之後再返回false。
㈣ android 中怎樣給按鈕添加點擊事件
xml文件代碼如下:
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button1" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Button2" />
四種方法分述如下:
匿名內部類:
public class TestButtonActivity extends Activity {
Button btn1, btn2;
Toast tst;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_button);
btn1 = (Button) findViewById(R.id.button1);
btn2 = (Button) findViewById(R.id.button2);
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast tst = Toast.makeText(TestButtonActivity.this, "111111111", Toast.LENGTH_SHORT);
tst.show();
}
});
btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast tst = Toast.makeText(TestButtonActivity.this, "222222222", Toast.LENGTH_SHORT);
tst.show();
}
});
}
}
自定義單擊事件監聽類:
public class TestButtonActivity extends Activity {
Button btn1, btn2;
Toast tst;
class MyClickListener implements OnClickListener {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.button1:
tst = Toast.makeText(TestButtonActivity.this, "111111111", Toast.LENGTH_SHORT);
tst.show();
break;
case R.id.button2:
tst = Toast.makeText(TestButtonActivity.this, "222222222", Toast.LENGTH_SHORT);
tst.show();
break;
default:
break;
}
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_button);
btn1 = (Button) findViewById(R.id.button1);
btn2 = (Button) findViewById(R.id.button2);
btn1.setOnClickListener(new MyClickListener());
btn2.setOnClickListener(new MyClickListener());
}
}
Activity繼承View.OnClickListener,由Activity實現OnClick(View view)方法,在OnClick(View view)方法中用switch-case對不同id代表的button進行相應的處理
public class TestButtonActivity extends Activity implements OnClickListener {
Button btn1, btn2;
Toast tst;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_button);
btn1 = (Button) findViewById(R.id.button1);
btn2 = (Button) findViewById(R.id.button2);
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.button1:
tst = Toast.makeText(this, "111111111", Toast.LENGTH_SHORT);
tst.show();
break;
case R.id.button2:
tst = Toast.makeText(this, "222222222", Toast.LENGTH_SHORT);
tst.show();
break;
default:
break;
}
}
}
最後一種是我今天看到的一種寫法,在XML文件中「顯示指定按鈕的onClick屬性,這樣點擊按鈕時會利用反射的方式調用對應Activity中的click()方法」
<Button
android:id="@+id/button1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="Button1" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onClick"
android:text="Button2" />
這里在輸完android:的時候按下 Alt+/ 會有 onClick 屬性的提示, 但輸入到 android:onClick=「 的地方按下 Alt+/ 並沒有提示 onClick 選項,讓我突然覺得這里好像有點問題。
public class TestButtonActivity extends Activity {
Button btn1, btn2;
Toast tst;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_button);
}
// 注意 這里沒有 @Override 標簽
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.button1:
tst = Toast.makeText(this, "111111111", Toast.LENGTH_SHORT);
tst.show();
break;
case R.id.button2:
tst = Toast.makeText(this, "222222222", Toast.LENGTH_SHORT);
tst.show();
break;
default:
break;
}
}
}
這種寫法整個代碼中都不用聲明button就可以實現button的單擊事件。
以上就是四種實現按鈕單擊事件的方法。
粗略總結一下,就是按鈕少的時候用匿名內部類會比較快,比如寫demo測試的時候或者登陸界面之類的。
按鈕多的情況我還是選擇第三種方法,方便。
關於第四種方法,我感覺最方便,但看了很多代碼還是覺得寫法不夠大眾化,感興趣的朋友可以對此研究研究。相信會有不少收獲。
㈤ android中單擊事件怎麼與OnTouch共存
不影響業務需求的情況下,ontouch方法返回false可以保證單擊事件被監聽到
如果業務需求需要ontouch方法返回true,那斗純枝么在ontouch中根空敏據實際情況做判斷,調用performclick方法去觸發單褲物擊事件onclick
㈥ Android 點擊事件傳遞(簡單版)
Android點擊事件的傳遞應該是屬於「必考題」這一類型的了, 當然了解這一塊對於平常開發也非常的有用。例如:滾動事件沖突的解決、自定義控制項點擊效果等。本篇就簡單的來捋一下 Android的點擊事件
Demo很簡單,就是最外層是一個Activity 然後自定了一個ViewGroup 和 View
不可點擊
通過Log可以看出 ACTION_DOWN 事件是從 Activity->ViewGroup->View->ViewGroup->Activity 中間沒有事件消費 所以又返回到了Activity。 由於ACTION_DOWN事件沒有消費 所以ACTION_UP不會再給你消費的機會
可點擊 其他沒有任何操作
根據Log可以看出事件是從最外層傳入最底層,當最底層的View給消費後將不再返回
InterceptTouchEvent ACTION_DOWN返回為false,ACTION_UP 返回為true ,則View的 dispatchTouchEvent 和 TouchEvent會調用 ACTION_CANCEl
dispatchTouchEvent中 ACTION_DOWN 返回為false 其他返回為true
附上Demo地址: https://github.com/i-show/demos-AndroidView
㈦ android怎麼設置按鈕點擊事件
通過setOnClickListener()來綁定單擊事件 例如: Button button = (Button) findViewById(R.id.button_id); button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { // Perform action on click //增加自己的代碼...... 例如下面的 final TextView text = (TextView) findViewById(R.id.textView1); text.setText("OnClick. " + " ...."); } });
㈧ android 點擊事件
你笨啊,你這樣設置單擊事件:單擊此按鈕時觸發某個按鈕的事件,這不就得了
㈨ android 點擊事件怎麼寫
按鈕監聽的3種方式
使用setOnClickListener (View.OnClickListener l)方法
java">loginBtn.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewview){
Toast.makeText(ButtonActivity.this,"點擊了登錄按鈕",Toast.LENGTH_SHORT).show();
}
});
實現介面的方式
.OnClickListener{
privateButtonloginBtn;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.button_activity);
loginBtn=(Button)findViewById(R.id.login_btn);
}
@Override
publicvoidonClick(Viewview){
switch(view.getId()){
caseR.id.login_btn:
Toast.makeText(ButtonActivity.this,"點擊了登錄按鈕",Toast.LENGTH_SHORT).show();
break;
default:
break;
}
}
}
在布局文件中加使用android:onClick屬性
//1、先在布局文件中聲明android:onClick="clickLoginBtn"
<Button
android:id="@+id/login_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登錄"
android:onClick="clickLoginBtn"/>
//2、然後在代碼總實現該同名方法,注意方法的訪問許可權必須為public
publicvoidclickLoginBtn(Viewview){
Toast.makeText(ButtonActivity.this,"點擊了登錄按鈕",Toast.LENGTH_SHORT).show();
}
㈩ android 點擊事件 為什麼不起作用
Android中View的點擊事件如果沒有觸發,那肯定是代碼寫的有問題,onClick事件有四種寫法:
1.匿名內部類:
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//點擊後執行
}
});
2.自定義單擊事件監聽類:
class MyClickListener implements OnClickListener {
@Override
public void onClick(View v) {
//點擊後執行
}
}
3.Activity直接實現View.OnClickListener的onClick方法
@Override
public void onClick(View v) {
//點擊後執行
}
4.在XML文件中顯示指定按鈕的onClick屬性,這樣點擊按鈕時會利用反射的方式調用對應Activity中的click()方法:
android:onClick="onClick"
public void onClick(View v) {
//點擊後執行
}