天天看點

android Button事件處理

一般隻需要處理按鈕的點選事件就可以,但想讓一個按鈕處理多個事件,就得同時監聽多個方法。

OnClickListener  點選事件

OnLongClickListener 長按事件

OnTouchListener  觸摸事件

同僚監聽三個事件,隻有 OnTouchListener  會被觸發。  

package demo.button;

import android.app.Activity;

import android.os.Bundle;

import android.view.ContextMenu;

import android.view.ContextMenu.ContextMenuInfo;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.View.OnCreateContextMenuListener;

import android.view.View.OnLongClickListener;

import android.view.View.OnTouchListener;

import android.widget.Button;

import android.widget.Toast;

public class TestButtonActivity extends Activity

{

    Button test = null;

    @Override

    public void onCreate(Bundle savedInstanceState)

    {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        test = (Button) findViewById(R.id.test);

        test.setOnClickListener(new MyOnClickListener());

        test.setOnLongClickListener(new MyOnLongClickListener());

        test.setOnTouchListener(new MyOnTouchListener());

    }

    class MyOnClickListener implements OnClickListener

    { 

     @Override

     public void onClick(View v)

     { 

     Toast.makeText(getApplicationContext(), "單擊事件", Toast.LENGTH_SHORT).show();

     }

    }

   class MyOnLongClickListener implements OnLongClickListener

   {  

@Override

public boolean onLongClick(View v)

{

Toast.makeText(getApplicationContext(), "長按事件", Toast.LENGTH_SHORT).show();

return true;

}

   }

   class MyOnTouchListener implements OnTouchListener

   {

@Override

public boolean onTouch(View v, MotionEvent event)

{

if (event.getAction() == MotionEvent.ACTION_DOWN)

{

Toast.makeText(getApplicationContext(), "按下按鈕事件", Toast.LENGTH_SHORT).show();

}  

if (event.getAction() == MotionEvent.ACTION_UP)

{

Toast.makeText(getApplicationContext(), "彈起按鈕事件", Toast.LENGTH_SHORT).show();

}

               //傳回true  表示事件處理完畢,會中斷系統對該事件的處理。false 系統會同時處理對應的事件

return true;

}

   }

}

監聽button的滑動事件

如果需要捕獲控件的滑動事件,需要實作兩個接口

android.view.GestureDetector.OnGestureListener   捕獲手勢事件,根據需要實作對應的方法(一般需要實作 onFling方法,擷取對應 x,y坐标)

android.view.View.OnTouchListener  捕獲觸屏事件

注意:

1.    設定按鈕的 setOnTouchListener(this);

激活 setLongClickable(true);

2.執行個體化GestureDetector對象  , 在 onTouchEvent 裡面将 return gestureDetector.onTouchEvent(event),将事件傳遞到onFling。

執行個體

public class MainActivity extends Activity implements OnTouchListener, OnGestureListener

{

Button but = null;

GestureDetector gestureDetector = null;

@Override

public void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

   but = (Button) findViewById(R.id.gesture);

   but.setOnTouchListener(this);

   but.setLongClickable(true);

   gestureDetector = new GestureDetector(this);

}

@Override

public boolean onDown(MotionEvent e)

{

Log.d("MainActivity", "**************onDown*******************"); 

return false;

}

@Override

public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,

float velocityY)

{

Log.d("MainActivity", "**************onFling******e1: "+e1.getX()+", "+e1.getY() +"  e2: "+e2.getX()+","+e2.getY()+"*****velocityX:"+velocityX+","+velocityY); 

float x1 = e1.getX();

float y1 = e1.getY();

float x2 = e2.getX(); 

float y2 = e2.getY();

if ((Math.abs(x1-x2) > 100) && (Math.abs(y1-y2) < 200 ))

{

if (x1 < x2)

{

Log.d("", "-------自左向右滑動------------");

}

else

{

Log.d("", "-------自右向左滑動------------");

}

}

if ((Math.abs(x1-x2) < 200) && (Math.abs(y1-y2) > 100  ))

{

if (y1 < y2)

{

                Log.d("", "-------自上向下滑動------------");

}

else

{

Log.d("", "-------自下向上滑動------------");

}

}

return false;

}

@Override

public void onLongPress(MotionEvent e)

{

Log.d("MainActivity", "**************onLongPress*******************"); 

//長按時觸發

}

@Override

public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,

float distanceY)

{

//Log.d("MainActivity", "**************onScroll*******************"); 

return false;

}

@Override

public void onShowPress(MotionEvent e)

{

Log.d("MainActivity", "**************onShowPress*******************"); 

}

@Override

public boolean onSingleTapUp(MotionEvent e)

{

//按下松開後觸發

Log.d("MainActivity", "**************onSingleTapUp*******************"); 

return false;

}

@Override

public boolean onTouch(View v, MotionEvent event)

{

//Log.d("MainActivity", "**************onTouch*******************"); 

return gestureDetector.onTouchEvent(event);

}

}