Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android 開發第六彈:簡易時鐘(計時器)

Android 開發第六彈:簡易時鐘(計時器)

編輯:關於Android編程

接上篇Android 開發第五彈:簡易時鐘(鬧鐘) ,這次是一個時鐘類應用,目前依舊是主要的功能,長得還是很挫。當然了,核心功能是有的……

這裡寫圖片描述

時鐘

先把簡單的時鐘給列出來吧,這裡都寫的很簡單,即便要用世界各個城市的話,也只是相應的加上或減去幾個小時。

新建TimeView類,並擴展自LinearLayout,然後布局文件和上一篇中那麼寫就好了。



    
    // 實例化TextView控件
    private TextView tvTime;

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

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

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

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

        tvTime = (TextView)findViewById(R.id.tvTime);
        tvTime.setText(H);

        timeHandler.sendEmptyMessage(0);
    }

    private Handler timeHandler = new Handler() {

        public void handleMessage(Message msg){
            // 刷新時間
            refreshTime();

            if(getVisibility() == View.VISIBLE){
                timeHandler.sendEmptyMessageDelayed(0, 1000);
            }
        }
    };

    // 刷新時間
    private void refreshTime(){
        Calendar c = Calendar.getInstance();

        // 試著顯示的時間格式 
        tvTime.setText(String.format(%d:%d:%d,
                c.get(Calendar.HOUR_OF_DAY),
                c.get(Calendar.MINUTE),
                c.get(Calendar.SECOND)));
    }

    @Override
    protected void onVisibilityChanged(View changedView, int visibility) {
        super.onVisibilityChanged(changedView, visibility);

        if(visibility == View.VISIBLE){
            timeHandler.sendEmptyMessage(0);
        }else{
            timeHandler.removeMessages(0);
        }
    }

就這些了,下面正式開始計時器的部分。

TimerView

TimerView類同樣是擴展自LinearLayout,並且布局的寫法也是如出一轍:



    

    
        android:singleLine = true / >

    

    

    

    
    < / LinearLayout>

    

先把該定義的都定義好了:

    private Button btnStart, btnPause, btnResume, btnReset;
    private EditText etHour, etMinute, etSecond;

    private static final int MSG_WHAT_TIME_IS_UP = 1;
    private static final int MSG_WHAT_TIME_TICK = 2;

    // 所有時間計數
    private int allTimerCount = 0;
    private Timer timer = new Timer();
    private TimerTask timerTask = null;

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

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

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

核心部分,首先給各個按鈕設置監聽,其中的點擊分別實現相應的功能,並且設置相應的可見度,還要為每個EditText設置一個動態的判斷,使其值不大於59也不小於0。

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

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

                btnPause.setVisibility(View.GONE);
                btnResume.setVisibility(View.VISIBLE);

            }
        });

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

                etHour.setText(0);
                etMinute.setText(0);
                etSecond.setText(0);

                btnReset.setVisibility(View.GONE);
                btnResume.setVisibility(View.GONE);
                btnPause.setVisibility(View.GONE);
                btnStart.setVisibility(View.VISIBLE);
            }
        });

        // 恢復
        btnResume = (Button)findViewById(R.id.btnResume);
        btnResume.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                startTime();

                btnResume.setVisibility(View.GONE);
                btnPause.setVisibility(View.VISIBLE);
            }
        });

        // 開始
        btnStart = (Button)findViewById(R.id.btnStart);
        btnStart.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                startTime();

                btnStart.setVisibility(View.GONE);
                btnPause.setVisibility(View.VISIBLE);
                btnReset.setVisibility(View.VISIBLE);
            }
        });

        etHour = (EditText)findViewById(R.id.etHour);
        etMinute = (EditText)findViewById(R.id.etMinute);
        etSecond = (EditText)findViewById(R.id.etSecond);

        // 對每一個EditText實例都作判斷,值不可以大於59或小於0
        etHour.setText(00);
        etHour.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if (!TextUtils.isEmpty(s)) {
                    int value = Integer.parseInt(s.toString());

                    if (value > 59) {
                        etHour.setText(59);
                    } else if (value < 0) {
                        etHour.setText(0);
                    }
                }
                checkToEnableBtnStart();
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

        etMinute.setText(00);
        etMinute.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if (!TextUtils.isEmpty(s)) {
                    int value = Integer.parseInt(s.toString());

                    if (value > 59) {
                        etMinute.setText(59);
                    } else if (value < 0) {
                        etMinute.setText(0);
                    }
                }
                checkToEnableBtnStart();
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

        etSecond.setText(00);
        etSecond.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if(!TextUtils.isEmpty(s)){
                    int value = Integer.parseInt(s.toString());

                    if(value > 59){
                        etSecond.setText(59);
                    }else if(value < 0){
                        etSecond.setText(0);
                    }
                }
                checkToEnableBtnStart();
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

        btnStart.setVisibility(View.VISIBLE);
        btnPause.setVisibility(View.GONE);
        btnResume.setVisibility(View.GONE);
        btnReset.setVisibility(View.GONE);
    }

判斷是否可以開始計數,每個輸入框都不能小於等於0更不能為空。

// 判斷是否可以開始
    private void checkToEnableBtnStart(){
        btnStart.setEnabled((!TextUtils.isEmpty(etHour.getText())
                && Integer.parseInt(etHour.getText().toString()) > 0) ||
                (!TextUtils.isEmpty(etMinute.getText())
                        && Integer.parseInt(etMinute.getText().toString()) > 0) ||
                (!TextUtils.isEmpty(etSecond.getText())
                        && Integer.parseInt(etSecond.getText().toString()) > 0));
    }

接下來就可以開始計時了。

    // 開始
    private void startTime(){
        if(timerTask == null){
            // 從三個輸入框中獲取需要計數的總秒數
            allTimerCount = Integer.parseInt(etHour.getText().toString())*60*60
                    + Integer.parseInt(etMinute.getText().toString())*60
                    + Integer.parseInt(etSecond.getText().toString());
            timerTask = new TimerTask() {
                @Override
                // 執行計數,allTimerCount自減
                public void run() {
                    allTimerCount-- ;

                    handler.sendEmptyMessage(MSG_WHAT_TIME_TICK);

                    // 如果剩下的所有計數已經小於0,通知handler停止
                    if(allTimerCount <= 0){
                        handler.sendEmptyMessage(MSG_WHAT_TIME_IS_UP);
                        stopTimer();
                    }
                }
            };
            // 設置scedule,開始時間以及時間間隔,間隔此處為1秒
            timer.schedule(timerTask,1000,1000);
        }
    }

當然除了開始計時外,也需要能夠停止計時。

    // 停止計時
    private void stopTimer(){
        if(timerTask != null){
            timerTask.cancel();
            timerTask = null;
        }
    }

接下來就是Handler了,也不算難,多寫幾遍就會了。

    private Handler handler = new Handler() {
        public void handleMessage(Message msg){
            switch (msg.what){
                case MSG_WHAT_TIME_TICK:

                    // 獲取時間
                    int hour = allTimerCount/60/60;
                    int min = (allTimerCount/60)%60;
                    int sec = allTimerCount%60;

                    // 將時間寫到對應的EditText上
                    etHour.setText(hour + );
                    etMinute.setText(min + );
                    etSecond.setText(sec + );

                    break;
                case MSG_WHAT_TIME_IS_UP:

                    // 彈出對話框進行提示,包括標題、消息、返回按鈕
                    new AlertDialog.Builder(getContext()).setTitle(Time is up)
                            .setMessage(Message: Time is up)
                            .setNegativeButton(Cancel,null)
                            .show();

                    // 設置相應的可見與否
                    btnReset.setVisibility(View.GONE);
                    btnResume.setVisibility(View.GONE);
                    btnPause.setVisibility(View.GONE);
                    btnStart.setVisibility(View.VISIBLE);

                    break;
                default:
                    break;
            }
        }
    };

結束

這是第二篇,還有一篇比較短的了, Android 開發第七彈:簡易時鐘(秒表)……

需要代碼的話,直接評論留郵箱吧,我就不上傳到CSDN資源了。代碼會繼續更新的,注釋也會繼續更新……

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved