天天看点

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);

}

}