zoukankan      html  css  js  c++  java
  • Android倒计时案例展示




    1. Handler 与Message方法实现倒计时功能 

    关于Handler与Message消息机制的原理可查看: Android--Handler使用应运及消息机制处理原理分析

    这个设计思路也是最经常使用的一种设计 

    比如: 当点击一个button触发事件,在事件中调用 handler的sendMessage的方法。那么在相应的handler的handleMessage中就会接收到这个消息。在这里里面再进行一些逻辑推断,再通过调用handler的 sendMessageDelayed这个延时发送消息的方法进行消息发送,同一时候更新相关的设置信息

    </pre><pre>

    /**
    	 * 使用handler 与 message方法实现倒计时功能
    	 */
    
    	/**
    	 * 倒计时总长
    	 */
    	long totalCount = 6000;
    	/**
    	 * 倒计时时间间隔
    	 */
    	long flag = 1000;
    
    	private void startCountDown4() {
    		Message msg = Message.obtain();
    		msg.what = 001;
    		mhHandler.sendMessage(msg);
    	}
    
    	private Handler mhHandler = new Handler() {
    		public void handleMessage(android.os.Message msg) {
    			if (msg.what == 001) {
    				if (totalCount > 0) {
    					/**
    					 * 发送延迟1秒的消息
    					 */
    					Message msg1 = Message.obtain();
    					msg1.what = 001;
    					mhHandler.sendMessageDelayed(msg1, flag);
    					/**
    					 * 更新显示UI
    					 */
    					textview.setText(totalCount / 1000 + "秒");
    					/**
    					 * 更新倒计时总时间
    					 */
    					totalCount -= flag;
    				}
    
    			}
    
    		};
    	};

    2 使用Handler的post与Runnable结合实现倒计时功能 

    运行handler.post();方法,方法中传入一个runnable实例对象。会运行 这个实例对象的run方法。在run方法中再进行想着逻辑的推断。然后调用handler.postDelayed方法实例延迟运行相关操作的方法,这里是运行了相同的操作。从而达到实现一个倒计时的功能

    </pre><pre>

    /**
    	 * 使用handler的post方法与 runnable结合 实现倒计时的功能
    	 */
    	/**
    	 * 倒计时总长
    	 */
    	long totalCount = 6000;
    	/**
    	 * 倒计时时间间隔
    	 */
    	long flag = 1000;
    	public Handler handler = new Handler();
    	public Runnable countDownRunn = new Runnable() {
    
    		@Override
    		public void run() {
    			if (totalCount > 0) {
    				handler.postDelayed(countDownRunn, flag);
    				totalCount -= flag;
    				textview.setText(totalCount / 1000 + "秒");
    			}
    
    		}
    	};
    
    	public void startCountDown3() {
    		handler.post(countDownRunn);
    	}
    

    3  使用子线程来实现倒计时

    这里通过开启一个子线程,在线程中开启一个while循环,在这个循环中通过调用方法 seytemClock.sleep(time) 使用这个线程堵塞time时间,然后再进行相关的设置,从而达到倒计时的效果

    	/**
    	 * 倒计时总长
    	 */
    	long totalCount = 6000;
    	/**
    	 * 倒计时时间间隔
    	 */
    	long flag = 1000;
    
    	/**
    	 * 使用子线程实现倒计时的功能
    	 */
    	public void startCountDown2() {
    		new Thread() {
    			public void run() {
    				while (totalCount > 0) {
    					/**
    					 * 设置每隔flag时间间隔运行一次
    					 */
    					SystemClock.sleep(flag);
    					/**
    					 * 更新页面显示时间
    					 */
    					MainActivity.this.runOnUiThread(new Runnable() {
    
    						@Override
    						public void run() {
    							textview.setText(totalCount / 1000 + "秒");
    						}
    					});
    
    					totalCount -= flag;
    				}
    			};
    		}.start();
    	}
    



    4 使用CountDownTimer类来实现倒计时功能 

    相对来说使用这个类的设计逻辑比較简单

    	/**
    	 * 使用CountDownTimer 类实现倒计时功能
    	 */
    
    	public void startCountDown() {
    		TimeCount timeCount = new TimeCount(60000, 1000);
    		timeCount.start();
    
    	}
    
    	public class TimeCount extends CountDownTimer {
    
    		/**
    		 * 
    		 * @param millisInFuture
    		 *            总倒计时时长 单位毫秒
    		 * @param countDownInterval
    		 *            倒计时时间间隔 单位毫秒
    		 */
    		public TimeCount(long millisInFuture, long countDownInterval) {
    			super(millisInFuture, countDownInterval);
    		}
    
    		@Override
    		public void onTick(long l) {
    
    			textview.setText(l / 1000 + "秒");
    		}
    
    		@Override
    		public void onFinish() {
    
    		}
    	}




    5 使用属性动画的方式来实现倒计时 


    	/**
    	 * 使用属性动画的方式来实现
    	 * 
    	 */
    	int totalNumber = 6000;
    	private void startCountDown5(){
    		final ValueAnimator animator = ValueAnimator.ofInt(0,totalNumber/1000);
            animator.setDuration(totalNumber);
            animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                @Override
                public void onAnimationUpdate(ValueAnimator animation) {
                    Integer value = (Integer) animation.getAnimatedValue();
                    /**
                     * value 这里获取到的是递增获取到的时间 单位为秒
                     * 
                     */
                    textview.setText((totalCount-value*1000)/1000+"秒");
                    if (value*1000>(totalCount-1000)) {
    					animator.cancel();
    				}
                }
            });
            animator.start();
    		
    	}
    	

    这样的方式实现的效果可能会不佳,只是也不失为一种思路,在使用的时候能够调整ValueAnimator.ofInt()中第二个參数的计算參数


    6 .使用 Timer 与TimerTask方式实现


    Timer mSignTimer = new Timer();
    		mSignTimer.schedule(new TimerTask() {
    			@Override
    			public void run() {
    				mCurrentTime += 1000;
    				getActivity().runOnUiThread(
    						new Runnable() {
    							public void run() {
    								mSignDateTextView.setText(DataUtils
    										.getDateYear(mCurrentTime) + "");
    								
    
    							}
    						});
    
    			}
    		}, 0, 1000);

    这里用schedule方法。第一个參数是TimerTask对象,第二个參数表示開始运行前的延时时间(单位是milliseconds。这里定义了0),第三个參数是表示定时运行时间(单位是milliseconds,这里定义了1000)

    这里使用的mCurrentTime是系统当前的时间 ,设置schedule的第三个參数为1000,也就是每1秒运行一下这种方法,那么每次运行加1000毫秒。从而实现了计时功能,当然这里使用的不是倒计时的功能。加一些逻辑推断是能够实现倒计时功能的


    这里是直接调用Context对象的runOnUiThread方法。在主线程中进行更新Ui上的显示效果



    源代码: 






  • 相关阅读:
    快速入门各种跨域
    常用知识点
    比较少用的格式
    git
    “没有用var声明的为全局变量”这种说法不准确
    类数组对象
    函数上下文的变量对象实例
    var a =10 与 a = 10的区别
    原型链与作用域链、执行上下文
    闭包的作用
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/7301474.html
Copyright © 2011-2022 走看看