我們在實際開發(fā)中經(jīng)常會需要按鍵,但是如果像平時使用OnClickListener 來監(jiān)聽的話,其實是不能滿足我們的需求的,比如要做一個按鍵的秒表app,按下開始計時,放開停止計時,如果用上面的OnClickListener監(jiān)聽器來監(jiān)聽,只能監(jiān)聽到按鍵抬起時的動作,那么按下抬起動作分開監(jiān)聽的話如何實現(xiàn),這里作者自己實現(xiàn)的一個方法,大家可以參考。
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 + " 秒");
}
}
};
這里我們利用內(nèi)部類去從寫了兩個監(jiān)聽器里的方法,以便比較,一個是上面所講的OnClickListener,另一個是實現(xiàn)我們監(jiān)聽按下抬起兩個動作的OnTouchListener,內(nèi)部類的代碼如下:
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;
}
}
因為這里我們要實現(xiàn)一個按下開始計時,抬起停止計時功能,所以計時功能需要在一個線程里去實現(xiàn),這里使用handler-message實現(xiàn),方法如下:
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數(shù)字傳到handler中,去更新textview內(nèi)容,此方法穩(wěn)定可行,系統(tǒng)資源占用少,用在其他項目中有不錯的效果。
運行結(jié)果:
按下時
抬起時