2016-11-28 88 views
1

我正在嘗試爲Android創建一個時鐘應用程序。我設法實現了秒錶功能,但它似乎仍然充滿了問題。Android:如何增加按鈕點擊響應速度?

響應速度太慢,即當我點擊開始按鈕響應緩慢,所以它不會立即開始。點擊停止按鈕時也是如此。

目前提供的方法還不夠嗎?還是有更好的解決方案?請幫幫我。

public class StopWatchView extends LinearLayout{ 

    private int tenMSecs = 0; 
    private Timer timer = new Timer(); 
    private TimerTask timerTask = null; 
    private TimerTask showTimeTask = null; 

    private TextView tvHour, tvMinute, tvSecond, tvMSecond; 
    private Button btnSWStart, btnSWResume, btnSWReset, btnSWPause, btnSWRecord; 
    private ListView lvWatchTimeList; 
    private ArrayAdapter<String> adapter; 

    private static final int MSG_WHAT_SHOW_TIME = 1; 

    public StopWatchView(Context context) { 
     super(context); 
    } 

    public StopWatchView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public StopWatchView(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    @Override 
    protected void onFinishInflate(){ 
     super.onFinishInflate(); 

     tvHour = (TextView)findViewById(R.id.tvHour); 
     tvHour.setText("0"); 
     tvMinute = (TextView)findViewById(R.id.tvMinute); 
     tvMinute.setText("0"); 
     tvSecond = (TextView)findViewById(R.id.tvSecond); 
     tvSecond.setText("0"); 
     tvMSecond = (TextView)findViewById(R.id.tvMSceond); 
     tvMSecond.setText("0"); 

     btnSWRecord = (Button)findViewById(R.id.btnSWRecord); 
     btnSWRecord.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       adapter.insert(String.format("%d:%d:%d.%d", 
         tenMSecs/100/60/60, 
         tenMSecs/100/60%60, 
         tenMSecs/100%60, 
         tenMSecs%100), 
         0); 
      } 
     }); 

     btnSWPause = (Button)findViewById(R.id.btnSWPause); 
     btnSWPause.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       stopTimer(); 

       btnSWPause.setVisibility(View.GONE); 
       btnSWResume.setVisibility(View.VISIBLE); 
       btnSWReset.setVisibility(View.VISIBLE); 
       btnSWRecord.setVisibility(View.GONE); 
      } 
     }); 

     btnSWReset = (Button)findViewById(R.id.btnSWReset); 
     btnSWReset.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       stopTimer(); 
       tenMSecs = 0; 
       adapter.clear(); 

       btnSWStart.setVisibility(View.VISIBLE); 
       btnSWPause.setVisibility(View.GONE); 
       btnSWReset.setVisibility(View.GONE); 
       btnSWRecord.setVisibility(View.GONE); 
       btnSWResume.setVisibility(View.GONE); 
      } 
     }); 

     btnSWResume = (Button)findViewById(R.id.btnSWResume); 
     btnSWResume.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       startTimer(); 

       btnSWResume.setVisibility(View.GONE); 
       btnSWReset.setVisibility(View.GONE); 
       btnSWRecord.setVisibility(View.VISIBLE); 
       btnSWPause.setVisibility(View.VISIBLE); 
      } 
     }); 

     btnSWStart = (Button)findViewById(R.id.btnSWStart); 
     btnSWStart.setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       startTimer(); 

       btnSWStart.setVisibility(View.GONE); 
       btnSWPause.setVisibility(View.VISIBLE); 
       btnSWRecord.setVisibility(View.VISIBLE); 
      } 
     }); 

     btnSWRecord.setVisibility(View.GONE); 
     btnSWPause.setVisibility(View.GONE); 
     btnSWReset.setVisibility(View.GONE); 
     btnSWResume.setVisibility(View.GONE); 

     lvWatchTimeList = (ListView)findViewById(R.id.lvWatchTimeList); 
     adapter = new ArrayAdapter<String>(getContext(), 
       android.R.layout.simple_list_item_1); 
     lvWatchTimeList.setAdapter(adapter); 

     showTimeTask = new TimerTask() { 
      @Override 
      public void run() { 
       handler.sendEmptyMessage(MSG_WHAT_SHOW_TIME); 
      } 
     }; 
     timer.schedule(showTimeTask,200,200); 
    } 

    private void startTimer(){ 
     if(timerTask == null){ 
      timerTask = new TimerTask() { 
       @Override 
       public void run() { 
        tenMSecs++; 
       } 
      }; 
      timer.schedule(timerTask,10,10); 
     } 
    } 

    private void stopTimer(){ 
     if(timerTask != null){ 
      timerTask.cancel(); 
      timerTask = null; 
     } 
    } 

    public void onDestory(){ 
     timer.cancel(); 
    } 

    private Handler handler = new Handler(){ 
     public void handleMessage(Message msg){ 
      switch (msg.what){ 
       case MSG_WHAT_SHOW_TIME: 
        tvHour.setText(tenMSecs/100/60/60+""); 
        tvMinute.setText(tenMSecs/100/60%60+""); 
        tvSecond.setText(tenMSecs/100%60+""); 
        tvMSecond.setText(tenMSecs%100+""); 
        break; 
       default: 
        break; 
      } 
     }; 
    }; 
} 
+0

您可以實現該按鈕的觸摸事件。當有觸摸事件時,你可以完成你的任務。 –

回答

1

如果您的按鈕放置在Scrollable父項中,則會導致響應延遲。嘗試不可滾動的容器或覆蓋OnTouchListener

button.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 
      if(motionEvent.getAction() == MotionEvent.ACTION_DOWN){ 
       button.setPressed(true); 
      } 
      return onTouchEvent(motionEvent); 
     } 
    });