2016-08-31 11:25:28 qq_33897656 阅读数 678
  • 微信小程序开发实战第三季

    本季完成一个辩论赛计时器APP,涉及到动画使用、声音播放、action-sheet、tabBar、表单元素form、switch、slider、radio-group、button等,涉及到面向对象的编程思路

    18644 人正在学习 去看看 邹积超

倒计时代码如下:


package com.myresume.cn.activity;


import com.myresume.cn.R;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.CountDownTimer;

import android.widget.TextView;

public class MainActivity extends Activity {
    private TextView tvCount;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化控件
        tvCount=(TextView) findViewById(R.id.tvCount);
        new TimeCount(4000, 1000).start();//计时开始

    }

    //定义一个倒计时的内部类
    class TimeCount extends CountDownTimer{
        public TimeCount(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);//参数依次为总时长,和计时的时间间隔
            
        }

        @Override
        public void onTick(long millisUntilFinished) {//计时过程显示
            tvCount.setText(millisUntilFinished/1000+"");
            
        }

        @Override
        public void onFinish() {//计时完毕时触发该方法
            Intent intent=new Intent(MainActivity.this, HomepageActivity.class);
            startActivity(intent);
            finish();//跳转activity后,关闭掉当前的额activity
            
        }
        
    }

}



          有什么问题可以给我留言。

          我的微博http://weibo.com/laokuzai  安卓派,关注android最新资讯

          微信:zhuj8989,加微信畅聊android技术


2017-03-20 18:06:12 CrazyMo_ 阅读数 577
  • 微信小程序开发实战第三季

    本季完成一个辩论赛计时器APP,涉及到动画使用、声音播放、action-sheet、tabBar、表单元素form、switch、slider、radio-group、button等,涉及到面向对象的编程思路

    18644 人正在学习 去看看 邹积超

引言

突然发现自己在博客中分了好多模块,每一个模块都还没能完整的总结完毕,ORZ,只能慢慢来,后面逐步完善吧。其实严格来说无论是定时、倒计时还是延时都是一类功能,只需我们灵活改变下逻辑即可。

一、Android倒计时器

实现倒计时器很很多方式:CountDownTimer借用Java中的Timer和TimerTask以及用Thread自己去实现等等,但是在Android中更多采用的是Android自己封装的CountDownTimer去实现。

1、CountDownTimer概述

CountDownTimer是一个轻量级的多线程机制,从源码中可以看到他是一个抽象类,本质是通过Handler实现线程之间的通信。由于CountDownTimer是抽象类不能直接通过new 构造实例,往往我们采用匿名类赋值初始化和构造子类实例两种方式来获取CountDownTimer对象,然后调用start方法开启倒计时即可

2、CountDownTimer的应用及注意事项

public class MainActivity extends AppCompatActivity{

    private MyCountDownTimer timer;
    private TextView textView;
    private long openTime= 20000L;
    private static final String TIMES="timer";
    private long leftTime=0L;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        init();
    }
    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putLong(TIMES,leftTime);
    }

    @Override
    protected void onRestoreInstanceState(Bundle bundle){
        if(bundle!=null) {
            textView.setText(formatDuring(bundle.getLong(TIMES)));
        }
    }


    private void init(){
        getViews();
        textView.setText(formatDuring(openTime));
        timer=new MyCountDownTimer(openTime,1000);
        timer.start();
    }

    private void getViews(){
        textView= (TextView) findViewById(R.id.tv_delay_open);
    }

    //使用匿名类赋值的方式初始化
    private CountDownTimer countDownTimer=new CountDownTimer(openTime,1000) {
        @Override
        public void onTick(long l) {
            textView.setText(formatDuring(l));
            openTime=l;
            Log.e("CrazyMO", "onTick"+String.valueOf(l / 1000));
        }

        @Override
        public void onFinish() {
            Log.e("CrazyMO","OnFinish");
        }
    };

    private class MyCountDownTimer extends CountDownTimer{
        public MyCountDownTimer(long durings,long interval){
            super(durings,interval);
        }

        @Override
        public void onTick(long millisUntilFinished) {
            leftTime=millisUntilFinished;
            textView.setText(formatDuring(millisUntilFinished));
            Log.e("CrazyMO", "onTick"+String.valueOf(millisUntilFinished / 1000));
        }

        @Override
        public void onFinish() {
            Log.e("CrazyMO", "onFinish");
        }
    }

    public static String formatDuring(long mss) {
        long days = mss / (1000 * 60 * 60 * 24);
        long hours = (mss % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60);
        long minutes = (mss % (1000 * 60 * 60)) / (1000 * 60);
        long seconds = (mss % (1000 * 60)) / 1000;
        return days + " days " + hours + " hours " + minutes + " minutes "
                + seconds + " seconds ";
    }

    /**
     *
     * @param begin 时间段的开始
     * @param end   时间段的结束
     * @return  输入的两个Date类型数据之间的时间间格用* days * hours * minutes * seconds的格式展示
     */
    public static String formatDuring(Date begin, Date end) {
        return formatDuring(end.getTime() - begin.getTime());
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.e("CrazyMO", "onPause");
        countDownTimer.cancel();
        countDownTimer=null;
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.e("CrazyMO", "onPause"+leftTime);
        if(leftTime>1000) {
            countDownTimer = new MyCountDownTimer(leftTime, 1000).start();
        }
    }
}

运行结果

  • 当设置的总持续时间刚好是间隔时间的整数倍的时候,onTick按照间隔时间被调用直到持续时间结束,最后调用onFinish
    这里写图片描述
  • 当设置的总持续时间小于是间隔时间的,onTick将不会被触发,直接回调onFinish
    这里写图片描述
  • 当设置的总持续时间不是间隔时间的整数倍时,onTick按照间隔时间被调用直到持续时间结束,最后调用onFinish(设置持续时间6.5s,间隔1s)
    这里写图片描述
  • 在持续时间周期内手动cancel时,不会触发onFinish(设置持续时间12s,间隔时间1s 在6秒的时候手动cancel)
    这里写图片描述

二、定时和延时

android实现定时器的方式也有很多种:Handler类的postDelyed方法Handler+Timer+TimerTaskHandler+Thread,其实这三种方式核心就是Handler的通信。

1、Handler+Timer+TimerTask

这种方式本质就是在TimerTask 中发送Message,Handler负责接收并处理消息完成UI更新,最后由Timer负责启动计时。

public class CountdownActivity Activity extends Activity {
    TextView tvShow;
    private int i = 0;
    private int TIME = 1000;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        tvShow = (TextView) findViewById(R.id.tv_show);
        timer.schedule(task, 1000, 1000); // 1s后执行task,经过1s再次执行
    }

    Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            if (msg.what == 1) {
                tvShow.setText(Integer.toString(i++));//更新UI
            }
            super.handleMessage(msg);
        };
    };
    Timer timer = new Timer();
    TimerTask task = new TimerTask() {

        @Override
        public void run() {
            // 需要做的事:发送消息
            Message message = new Message();
            message.what = 1;
            handler.sendMessage(message);
        }
    };
} 

2、Handler类的postDelyed方法

这种方法也很简单,本质就是利用Handler的postDelay方法不断触发回调,所以只需要构造postDelay的所需的参数即可

public class CountdownActivity extends Activity {
    TextView tvShow;
    private int i = 0;
    private final int TIME = 1000L;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        tvShow = (TextView) findViewById(R.id.tv_show);
        handler.postDelayed(runnable, TIME); //启动计时器每隔1s执行
        ////handler.removeCallbacks(runnable); 停止计时
    }

    Handler handler = new Handler();
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            try {
                handler.postDelayed(this, TIME);//每1秒执行一次runnable.
                tvShow.setText(Integer.toString(i++));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };
}

3、Handler+Thread

这种方式不仅仅可以用于模拟计时,因为本质就是利用Handler实现线程间的通信,对于这种方式记得在倒计时完毕之后处理下子线程,别让线程一直在后台跑。

public class CountdownActivity extends Activity {
    TextView tvShow;
    private int i = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        tvShow = (TextView) findViewById(R.id.tv_show);
        new Thread(new ThreadShow()).start();
    }

    // 主线程的handler接收并处理消息
    Handler handler = new Handler() {
        public void handleMessage(Message msg) {
            if (msg.what == 1) {
                tvShow.setText(Integer.toString(i++));//完成UI更新
                System.out.println("receive....");
            }
        }

        ;
    };

    // 在线程获得Handler对象并发送消息至主线程
    class ThreadShow implements Runnable {
        public  boolean isNeedRun=true;
        @Override
        public void run() {
            while (!Thread.currentThread().isInterrupted()&&isNeedRun) {
                try {
                    Thread.sleep(1000);
                    Message msg = new Message();
                    msg.what = 1;
                    handler.sendMessage(msg);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
2018-02-01 15:18:35 ytwe520 阅读数 944
  • 微信小程序开发实战第三季

    本季完成一个辩论赛计时器APP,涉及到动画使用、声音播放、action-sheet、tabBar、表单元素form、switch、slider、radio-group、button等,涉及到面向对象的编程思路

    18644 人正在学习 去看看 邹积超

countdown

一个简单的计时器

图片描述

提供了一些方法

设置marginpublic void setLinearLayoutMargin(int left, int top, int right, int bottom)public void setTextViewMargin(int left, int top, int right, int bottom)设置Paddingpublic void setLinearLayoutPadding(int left, int top, int right, int bottom)public void setTextViewPadding(int left, int top, int right, int bottom)设置背景public void setLinearLayoutDrawable(Drawable d)public void setTextViewDrawable(Drawable d)设置背景色public void setLinearLayoutBgColor(int color)public void setTextViewBgColor(int color)

xml中的一些方法

countdown:color_bg //设置背景色countdown:color_text //设置字体颜色countdown:text_size //设置字体大小countdown:setDrawable //设置父容器背景countdown:setDrawable_sub //设置子控件背景

怎么使用

xml中

<com.zy.lib.countdown.CountDownViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"/>

Java中

setStopTime();//设置一个long类型的停止时间

源码详细地址:http://www.apkbus.com/blog-920677-76987.html


2016-05-04 22:03:24 Maoxf_Boss 阅读数 1021
  • 微信小程序开发实战第三季

    本季完成一个辩论赛计时器APP,涉及到动画使用、声音播放、action-sheet、tabBar、表单元素form、switch、slider、radio-group、button等,涉及到面向对象的编程思路

    18644 人正在学习 去看看 邹积超

前一篇讲了关于Timer定时器的用法,详细请看
Android关于定时器Timer的定义及用法
这一篇简单介绍一下关于倒计时定时器的用法,这涉及到一个CountDownTimer类,写了一个简单的案例, 整个案例就一个布局文件,一个Activity类,直接看代码

首先是布局,就一个按钮

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/send"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="发送验证" />

</LinearLayout>


接下来是MainActivity中实现
public class MainActivity extends Activity {

    private Button mSend;
    private boolean isClick = true;//按钮是否可点击
    private MyCountDownTimer timer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mSend = (Button) findViewById(R.id.send);

        timer = new MyCountDownTimer(10000,1000);


        mSend.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View arg0) {
                //按钮可点击时,触发倒计时
                if (isClick) {
                    isClick = false;
                    timer.start();
                }
            }
        });
    }

    /**
     * 自定义倒计时Timer类
     * @author maoxf
     *
     */
    class MyCountDownTimer extends CountDownTimer{

        //构造方法,第一个参数是倒计时时间,第二个参数是每次减少的时间
        public MyCountDownTimer(long millisInFuture, long countDownInterval) {
            super(millisInFuture, countDownInterval);
        }

        //倒计时结束调用
        @Override
        public void onFinish(){
            isClick = true;
            mSend.setClickable(isClick);
            mSend.setText("重新发送");
        }

        //每次减少时间调用
        @Override
        public void onTick(long time) {
            mSend.setClickable(isClick);
            mSend.setText(time/1000+"");
        }

    }
}

最后来看看成果吧

这里写图片描述

2016-10-05 23:13:01 MAGIC_JSS 阅读数 1502
  • 微信小程序开发实战第三季

    本季完成一个辩论赛计时器APP,涉及到动画使用、声音播放、action-sheet、tabBar、表单元素form、switch、slider、radio-group、button等,涉及到面向对象的编程思路

    18644 人正在学习 去看看 邹积超

转载请注明出处:http://blog.csdn.net/magic_jss/article/details/52741332;
Android中的计时操作主要包括,倒计时处理、定时器处理。其实倒计时处理sdk提供了CountDownTimer类,定时器处理则提供了Timer、TimerTask类,今天就通过CountDownTimer、Timer分别实现获取手机验证码效果

效果图:
这里写图片描述

比较low~~~由于非常简单,就不多赘述了,直接上代码·

1、CountDownTimer实现

CountDownTimer:安排一个倒计时,直到未来的时间,定期通知在路上的时间间隔。

/**
 * Created by magic on 2016年10月5日.获取验证码效果
 */
@SuppressLint("HandlerLeak")
public class MainActivity extends Activity {

	Button btn;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		btn = (Button) findViewById(R.id.btn);

		btn.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View arg0) {
				// 开始倒计时
				timer.start();
				btn.setClickable(false);
			}
		});

	}

	// 第一个参数表示总时间,第二个参数表示间隔时间。意思就是每隔一秒会回调一次方法onTick,然后60秒之后会回调onFinish方法
	final CountDownTimer timer = new CountDownTimer(60000, 1000) {

		@Override
		public void onTick(long arg0) {
			// 定期定期回调
			btn.setText((arg0 / 1000) + "秒后可重发");
		}

		@Override
		public void onFinish() {
			// 结束后回到
			btn.setText("获取验证码");
			btn.setClickable(true);
		}
	};

}

布局文件main.xml,就一个按钮。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="获取验证码" />

</LinearLayout>

2、Timer、TimerTask实现

/**
 * Created by magic on 2016年10月5日.获取验证码效果
 */
@SuppressLint("HandlerLeak")
public class MainActivity extends Activity {
	Button btn;
	// 总时间
	long totalTime;
	// 剩余时间
	long remainingTime;
	// 定时器
	Timer timer;
	// 定时器任务
	Task task;

	Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			if (remainingTime <= 0) {
			    // 取消定时器所有预定的任务
				timer.cancel();
				task.cancel();
				btn.setText("获取验证码");
				btn.setClickable(true);
				return;
			}
			btn.setText((remainingTime / 1000) + "秒后可重发");
		};
	};

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		btn = (Button) findViewById(R.id.btn);

		btn.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View arg0) {
				remainingTime = 10000;
				timer = new Timer();
				task = new Task();
				// 执行任务
				timer.schedule(task, 0, 1000);
				btn.setClickable(false);

			}
		});

	}

	/**
	 * 定时器任务 会开启一个工作线程
	 */
	class Task extends TimerTask {

		@Override
		public void run() {
			remainingTime = remainingTime - 1000;
			// 发送消息通过主线程更新UI
			handler.sendEmptyMessage(0);
		}
	}
}

是不是很简单呢!

天生我材必有用,千金散尽还复来。

没有更多推荐了,返回首页