Android中自定义View仿京东秒杀倒计时

效果图
1.创建View:

<?xml version="1.0" encoding="utf-8"?>"http://schemas.android.com/apk/res/android"              android:layout_width="wrap_content"              android:layout_height="wrap_content"              android:orientation="horizontal"              android:padding="@dimen/j2dp">    "@+id/lay_days"        android:layout_width="wrap_content"        android:layout_height="match_parent"        android:orientation="horizontal"        android:gravity="center">        "wrap_content"            android:layout_height="wrap_content"            android:background="@drawable/goodsdetail_timer_bg"            android:gravity="center"            android:paddingLeft="3dp"            android:paddingRight="3dp">            "@+id/tv_days_decade"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:text="0"                android:textColor="@color/text_10"                android:textSize="@dimen/j18dp"                android:textStyle="bold"                />            "@+id/tv_days_unit"                android:layout_width="wrap_content"                android:layout_height="wrap_content"                android:text="0"                android:textColor="@color/text_10"                android:textSize="@dimen/j18dp"                android:textStyle="bold"                />                "wrap_content"            android:layout_height="match_parent"            android:gravity="center"            android:text="天"            android:textSize="@dimen/j12dp"            android:textColor="@color/white"/>        "@+id/lay_hour"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:background="@drawable/goodsdetail_timer_bg"        android:gravity="center"        android:paddingLeft="3dp"        android:paddingRight="3dp">        "@+id/tv_hour_decade"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="0"            android:textColor="@color/text_10"            android:textSize="@dimen/j18dp"            android:textStyle="bold"            />        "@+id/tv_hour_unit"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="0"            android:textColor="@color/text_10"            android:textSize="@dimen/j18dp"            android:textStyle="bold"            />        "wrap_content"        android:layout_height="match_parent"        android:layout_marginLeft="@dimen/j3dp"        android:layout_marginRight="@dimen/j3dp"        android:gravity="center"        android:text=":"        android:textColor="@color/white"        android:textSize="@dimen/j18dp"/>    "@+id/lay_min"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:background="@drawable/goodsdetail_timer_bg"        android:gravity="center"        android:paddingLeft="3dp"        android:paddingRight="3dp">        "@+id/tv_min_decade"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="0"            android:textColor="@color/text_10"            android:textSize="@dimen/j18dp"            android:textStyle="bold"            />        "@+id/tv_min_unit"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="0"            android:textColor="@color/text_10"            android:textSize="@dimen/j18dp"            android:textStyle="bold"            />        "wrap_content"        android:layout_height="match_parent"        android:layout_marginLeft="@dimen/j3dp"        android:layout_marginRight="@dimen/j3dp"        android:gravity="center"        android:text=":"        android:textColor="@color/white"        android:textSize="@dimen/j18dp"/>    "@+id/lay_s"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:background="@drawable/goodsdetail_timer_bg"        android:gravity="center"        android:paddingLeft="3dp"        android:paddingRight="3dp">        "@+id/tv_sec_decade"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="0"            android:textColor="@color/text_10"            android:textSize="@dimen/j18dp"            android:textStyle="bold"            />        "@+id/tv_sec_unit"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="0"            android:textColor="@color/text_10"            android:textSize="@dimen/j18dp"            android:textStyle="bold"            />    

goodsdetail_timer_bg.xml

<?xml version="1.0" encoding="utf-8"?>"http://schemas.android.com/apk/res/android" >    "@color/white" />            "1dp" />        "2dp" android:color="#ffffff" />

2.重写View:

@SuppressLint("HandlerLeak")public class GoodsDetailTimerView extends LinearLayout { // 天数,十位 private TextView tv_days_decade; // 天数,个位 private TextView tv_days_unit; // 小时,十位 private TextView tv_hour_decade; // 小时,个位 private TextView tv_hour_unit; // 分钟,十位 private TextView tv_min_decade; // 分钟,个位 private TextView tv_min_unit; // 秒,十位 private TextView tv_sec_decade; // 秒,个位 private TextView tv_sec_unit; //布局:时 ,分,秒 private LinearLayout layHour, layMin, layS, layDays; private Context context; private int day; private int days_decade; private int days_unit; private int hour_decade; private int hour_unit; private int min_decade; private int min_unit; private int sec_decade; private int sec_unit; // 计时器 private Timer timer; private Handler handler = new Handler() { public void handleMessage(Message msg) { countDown(); } }; // 回调接口 public interface OnTimeOutCallBack { void onCallBack(); } private OnTimeOutCallBack callBack; public GoodsDetailTimerView(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View view = inflater.inflate(R.layout.view_goodsdetailtimer, this); tv_days_decade = (TextView) view.findViewById(R.id.tv_days_decade); tv_days_unit = (TextView) view.findViewById(R.id.tv_days_unit); tv_hour_decade = (TextView) view.findViewById(R.id.tv_hour_decade); tv_hour_unit = (TextView) view.findViewById(R.id.tv_hour_unit); tv_min_decade = (TextView) view.findViewById(R.id.tv_min_decade); tv_min_unit = (TextView) view.findViewById(R.id.tv_min_unit); tv_sec_decade = (TextView) view.findViewById(R.id.tv_sec_decade); tv_sec_unit = (TextView) view.findViewById(R.id.tv_sec_unit); layDays = (LinearLayout) view.findViewById(R.id.lay_days); layHour = (LinearLayout) view.findViewById(R.id.lay_hour); layMin = (LinearLayout) view.findViewById(R.id.lay_min); layS = (LinearLayout) view.findViewById(R.id.lay_s); } public void setOnTimeOutCallBack(OnTimeOutCallBack callBack) { this.callBack = callBack; } /** * @param * @return void * @throws * @Description: 开始计时     */    public void start() {        if (timer == null) {            timer = new Timer();            timer.schedule(new TimerTask() {                @Override                public void run() {                    handler.sendEmptyMessage(0);                }            }, 0, 1000);        }    }    /**     * @param     * @return void     * @throws     * @Description: 停止计时     */    public void stop() {        if (timer != null) {            timer.cancel();            timer = null;        }    }    /**     * @param     * @return void     * @throws Exception     * @throws     * @Description: 设置倒计时的时长     */    public void setTime(int day, int hour, int min, int sec) {        try {            if (hour >= 24 || min >= 60 || sec >= 60 || hour < 0 || min < 0 || sec < 0) {                throw new RuntimeException("Time format is error,please check out your code");            }            this.day = day;            days_decade = day / 10;            days_unit = day - days_decade * 10;            hour_decade = (hour) / 10;            hour_unit = (hour) - hour_decade * 10;            min_decade = min / 10;            min_unit = min - min_decade * 10;            sec_decade = sec / 10;            sec_unit = sec - sec_decade * 10;            tv_days_decade.setText(days_decade + "");            tv_days_unit.setText(days_unit + "");            tv_hour_decade.setText(hour_decade + "");            tv_hour_unit.setText(hour_unit + "");            tv_min_decade.setText(min_decade + "");            tv_min_unit.setText(min_unit + "");            tv_sec_decade.setText(sec_decade + "");            tv_sec_unit.setText(sec_unit + "");            if (day <= 0) {                layDays.setVisibility(GONE);            } else {                layDays.setVisibility(VISIBLE);            }        } catch (Exception e) {            e.printStackTrace();        }    }    /**     * @param     * @return boolean     * @throws     * @Description: 倒计时     */    private void countDown() {        if (isCarry4Unit(tv_sec_unit)) {            if (isCarry4Decade(tv_sec_decade)) {                if (isCarry4Unit(tv_min_unit)) {                    if (isCarry4Decade(tv_min_decade)) {                        if (isHourUnit(tv_hour_unit)) {                            if (isHourDecade(tv_hour_decade)) {                                if (isDayUnit(tv_days_unit)) {                                    if (isDayDecade(tv_days_decade)) {                                        if (callBack != null) {                                            callBack.onCallBack();                                        }                                        Log.d("TEST", "时间到了");                                        stop();                                    }                                }                            }                        }                    }                }            }        }}    /**     * @param     * @return boolean     * @throws     * @Description: 天数变化十位,并判断是否需要进位     */    private boolean isDayDecade(TextView tv) {        int time = Integer.valueOf(tv.getText().toString());        time = time - 1;        if (time < 0) {            time = 9;            tv.setText(time + "");            return true;        } else {            tv.setText(time + "");            return false;        }    }    /**     * @param     * @return boolean     * @throws     * @Description: 天数变化个位,并判断是否需要进位     */    private boolean isDayUnit(TextView tv) {        int time = Integer.valueOf(tv.getText().toString());        time = time - 1;        if (time < 0) {            time = 9;            tv.setText(time + "");            return true;        } else {            tv.setText(time + "");            return false;        }    }    /**     * @param     * @return boolean     * @throws     * @Description: 小时变化十位,并判断是否需要进位     */    private boolean isHourDecade(TextView tv) {        int time = Integer.valueOf(tv.getText().toString());        time = time - 1;        if (time < 0) {            time = 2;            tv.setText(time + "");            return true;        } else {            tv.setText(time + "");            return false;        }    }    /**     * @param     * @return boolean     * @throws     * @Description: 小时变化个位,并判断是否需要进位     */    private boolean isHourUnit(TextView tv) {        int time = Integer.valueOf(tv.getText().toString());        time = time - 1;        if (time < 0) {            time = 3;            tv.setText(time + "");            return true;        } else {            tv.setText(time + "");            return false;        }    }    /**     * @param     * @return boolean     * @throws     * @Description: 分钟、秒钟变化十位,并判断是否需要进位     */    private boolean isCarry4Decade(TextView tv) {        int time = Integer.valueOf(tv.getText().toString());        time = time - 1;        if (time < 0) {            time = 5;            tv.setText(time + "");            return true;        } else {            tv.setText(time + "");            return false;        }    }    /**     * @param     * @return boolean     * @throws     * @Description: 分钟、秒钟变化个位,并判断是否需要进位     */    private boolean isCarry4Unit(TextView tv) {        int time = Integer.valueOf(tv.getText().toString());        time = time - 1;        if (time < 0) {            time = 9;            tv.setText(time + "");            return true;        } else {            tv.setText(time + "");            return false;        }    }}
"@+id/timerView"     android:layout_width="wrap_content"     android:layout_height="wrap_content"/>

启动计时器

GoodsDetailTimerView timerView=(LinearLayout) view.findViewById(R.id.lay_timerview);timerView.setTime(day, hour, min, s);// 设置时间(day,hour,min,sec)timerView.start();// 开始倒计时
timerView.stop();// 停止倒计时

更多相关文章

  1. Android源码 半小时下完Android系统源码
  2. Android桌面小部件实例 桌面小时钟
  3. 实战!半小时写一个脑力小游戏 [每日前端夜话0x21]
  4. PHP如何计算两个时间段交集的天数?
  5. 两小时学会用php做网站购物车
  6. 一小时学会简易在线投票系统(php)

随机推荐

  1. 2.3 SQLite存储
  2. Android开发实战-项目学习笔记(1)
  3. android学习日志(一)
  4. Android ADB使用之详细篇
  5. Android开发环境搭配
  6. Android书页翻页设计:android-flip
  7. 转Android 安全攻防(一):SEAndroid的編譯
  8. Android下利用zbar类库实现扫一扫
  9. android github 知名库
  10. Android(安卓)Clipboard(复制/剪贴板)