我们在实际开发中经常会需要按键,但是如果像平时使用OnClickListener 来监听的话,其实是不能满足我们的需求的,比如要做一个按键的秒表app,按下开始计时,放开停止计时,如果用上面的OnClickListener监听器来监听,只能监听到按键抬起时的动作,那么按下抬起动作分开监听的话如何实现,这里作者自己实现的一个方法,大家可以参考。
Java Code
textView = (TextView) findViewById(R.id.textView1);
button = (Button) findViewById(R.id.button1);
ButtonListener b = new ButtonListener();
button.setOnClickListener(b);
button.setOnTouchListener(b);
handler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
// TODO Auto-generated method stub
super.handleMessage(msg);
if(msg.what == 0x1234)
{
textView.setText("计时:" + msg.obj + " 秒");
}
}
};
这里我们利用内部类去从写了两个监听器里的方法,以便比较,一个是上面所讲的OnClickListener,另一个是实现我们监听按下抬起两个动作的OnTouchListener,内部类的代码如下:
Java Code
class ButtonListener implements OnClickListener, OnTouchListener
{
public void onClick(View v)
{
if(v.getId() == R.id.button1)
{
Log.d("test", "cansal button ---> click");
Toast tst = Toast.makeText(MainActivity.this, "33333333",
Toast.LENGTH_SHORT);
tst.show();
}
}
public boolean onTouch(View v, MotionEvent event)
{
if(v.getId() == R.id.button1)
{
if(event.getAction() == MotionEvent.ACTION_DOWN) //判断动作,如果是按下的话,置位标志位,开启线程
{
state = true;
new MyThread().start();
}
if(event.getAction() == MotionEvent.ACTION_UP) //如果是抬起,则将标志位复位,使线程退出
{
state = false;
}
}
return false;
}
}
因为这里我们要实现一个按下开始计时,抬起停止计时功能,所以计时功能需要在一个线程里去实现,这里使用handler-message实现,方法如下:
Java Code
class MyThread extends Thread
{
@Override
public void run()
{
// TODO Auto-generated method stub
super.run();
while(state)
{
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
Message message = new Message();
message.what = 0x1234;
message.obj = count++;
handler.sendMessage(message);
//handler.sendEmptyMessage(0x1234);
}
}
}
线程里1秒count加一次,并将count数字传到handler中,去更新textview内容,此方法稳定可行,系统资源占用少,用在其他项目中有不错的效果。
运行结果:
按下时
抬起时