欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android自定义倒计时控件示例

程序员文章站 2022-06-19 19:55:49
自定义textview控件timetextview代码: 复制代码 代码如下:import android.content.context;import androi...


android自定义倒计时控件示例

自定义textview控件timetextview代码:

复制代码 代码如下:

import android.content.context;
import android.content.res.typedarray;
import android.graphics.paint;
import android.text.html;
import android.util.attributeset;
import android.widget.textview;

import com.new0315.r;
/**
 * 自定义倒计时文本控件
 * @author administrator
 *
 */
public class timetextview extends textview implements runnable{

    paint mpaint; //画笔,包含了画几何图形、文本等的样式和颜色信息

    private long[] times;

    private long mday, mhour, mmin, msecond;//天,小时,分钟,秒

    private boolean run=false; //是否启动了

    public timetextview(context context, attributeset attrs) {
        super(context, attrs);
        mpaint=new paint();
        typedarray array = context.obtainstyledattributes(attrs, r.styleable.timetextview);

        array.recycle(); //一定要调用,否则这次的设定会对下次的使用造成影响
    }

    public timetextview(context context, attributeset attrs, int defstyle) {
        super(context, attrs, defstyle);
        mpaint=new paint();
        typedarray array = context.obtainstyledattributes(attrs, r.styleable.timetextview);

        array.recycle(); //一定要调用,否则这次的设定会对下次的使用造成影响
    }

    public timetextview(context context) {
        super(context);
    }

    public long[] gettimes() {
        return times;
    }

    public void settimes(long[] times) {
        this.times = times;
        mday = times[0];
        mhour = times[1];
        mmin = times[2];
        msecond = times[3];

    }

    /**
     * 倒计时计算
     */
    private void computetime() {
        msecond--;
        if (msecond < 0) {
            mmin--;
            msecond = 59;
            if (mmin < 0) {
                mmin = 59;
                mhour--;
                if (mhour < 0) {
                    // 倒计时结束
                    mhour = 59;
                    mday--;

                }
            }

        }

    }

    public boolean isrun() {
        return run;
    }

    public void setrun(boolean run) {
        this.run = run;
    }

    @override
    public void run() {
        //标示已经启动
        run=true;

        computetime();

        string strtime="还剩</pre>
<span style="color: red;">"+mday+"</span>
<pre>"+"天</pre>
<span style="color: red;">"+mhour+"</span>
<pre>小时</pre>
<span style="color: red;">"+
 mmin+"</span>
<pre>分钟</pre>
<span style="color: red;">"+msecond+"</span>
<pre>秒";
        this.settext(html.fromhtml(strtime));

        postdelayed(this, 1000);

    }

}

属性atts.xml

复制代码 代码如下:

<declare-styleable name="timetextview">
</declare-styleable>

adapter调用代码:

复制代码 代码如下:

import java.text.decimalformat;
import java.util.list;

import android.content.context;
import android.graphics.paint;
import android.util.log;
import android.view.layoutinflater;
import android.view.view;
import android.view.viewgroup;
import android.widget.baseadapter;
import android.widget.imageview;
import android.widget.linearlayout;
import android.widget.textview;

import com.new0315.r;
import com.new0315.entity.specialgoods;
import com.new0315.utils.correctspecialdataformhttp;
import com.new0315.utils.datetools;
import com.new0315.widgets.timetextview;
import com.nostra13.universalimageloader.core.imageloader;

public class specialgoodsadapter extends baseadapter {

    private context context;
    private list list;
    private long sumtime;

    public specialgoodsadapter(context context) {

        this.context = context;
    }

    public void setlist(list list) {
        this.list = list;
    }

    @override
    public int getcount() {
        // todo auto-generated method stub
        return list.size();
    }

    @override
    public object getitem(int arg0) {
        // todo auto-generated method stub
        return null;
    }

    @override
    public long getitemid(int arg0) {
        // todo auto-generated method stub
        return 0;
    }

    @override
    public view getview(int arg0, view convertview, viewgroup arg2) {
        //开始计时,性能测试用nanotime会更精确,因为它是纳秒级的
        long starttime = system.nanotime();
        log.d("position","getview " + arg0 + " " + convertview);
        viewholder viewholder;
        if(convertview == null)
        {
            convertview = layoutinflater.from(context).inflate(
                    r.layout.item_temai_list, null);
            viewholder = new viewholder();
            viewholder.goodname = (textview) convertview
                    .findviewbyid(r.id.temai_name);
            viewholder.price = (textview) convertview
                    .findviewbyid(r.id.temai_yuanjia_text);

            viewholder.specialprice = (textview) convertview
                    .findviewbyid(r.id.temai_xiajia_text);
            //特卖倒计时控件
            viewholder.mtimetext = (timetextview) convertview
                    .findviewbyid(r.id.temai_timetextview);

            viewholder.showdate = (textview) convertview
                    .findviewbyid(r.id.index_temai_day);
            viewholder.showdate_l = (linearlayout) convertview
                    .findviewbyid(r.id.temai_weikaishi);
            viewholder.showtime = (linearlayout) convertview
                    .findviewbyid(r.id.temai_yikaishi);
            viewholder.koukou = (textview) convertview
                    .findviewbyid(r.id.temai_zhekou_text);
            viewholder.image = (imageview) convertview
                    .findviewbyid(r.id.index_temai_image);
            log.d("googleio","new position:"+viewholder.goodname.gettext());

            convertview.settag(viewholder);

        }else {
            viewholder = (viewholder) convertview.gettag();
            resetviewholder(viewholder);
        }
        //setdata
        string off = getoff(list.get(arg0).getgoods_price(), list.get(arg0)
                .getgoods_specialprice());
        viewholder.goodname.settext(list.get(arg0).getgoods_name());
        viewholder.price.settext(list.get(arg0).getgoods_price());
        viewholder.price.getpaint().setflags(
                paint.strike_thru_text_flag | paint.anti_alias_flag);
        viewholder.specialprice.settext(list.get(arg0).getgoods_specialprice());
        viewholder.koukou.settext(off + "折");

        if (datetools.isstart(list.get(arg0).getspecialfrom())) {
            //特卖倒计时开始
            viewholder.mtimetext.settimes(datetools.getdate(correctspecialdataformhttp
                    .correctdata((list.get(arg0).getspecialend()))));
            //已经在倒计时的时候不再开启计时
            if(!viewholder.mtimetext.isrun())
            {
                viewholder.mtimetext.run();
            }
            viewholder.showdate_l.setvisibility(view.gone);
            viewholder.showtime.setvisibility(view.visible);
        } else {
            viewholder.showtime.setvisibility(view.gone);
            viewholder.showdate_l.setvisibility(view.visible);
            viewholder.showdate.settext(datetools.getday(list.get(arg0).getspecialfrom())
                    + "");
        }

        imageloader.getinstance().displayimage(list.get(arg0).getgoods_pic(),viewholder.image);

        //停止计时
        long endtime = system.nanotime();
        //耗时
        long spendtime = (endtime - starttime);

        sumtime += spendtime;
//        log.d("googleio", "position at:"+arg0+"--sumtime:"+string.valueof(sumtime));
        return convertview;
    }

    public string getoff(string price, string specialprice) {

        double off = double.parsedouble(specialprice)
                / double.parsedouble(price) * 10;

        decimalformat df = new decimalformat("0.0");
        string off_string = df.format(off);

        if (off_string.equals("nan") || off_string.equals("1")) {
            off_string = "10";
        }
        return off_string;
    }

    static class viewholder {
        imageview image;
        textview goodname;
        textview price;
        textview specialprice;
        textview koukou;
        timetextview mtimetext;
        textview showdate;
        linearlayout showdate_l;
        linearlayout showtime;

    }

    protected void resetviewholder(viewholder viewholder) {
        viewholder.image.setimagebitmap(null);
        viewholder.goodname.settext("");
        viewholder.price.settext("");
        viewholder.specialprice.settext("");
        viewholder.koukou.settext("");
        viewholder.mtimetext.settext("");
        viewholder.showdate.settext("");

    }
}

layout使用代码

复制代码 代码如下:

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/home_panicbuying_background"
android:orientation="vertical" >

<!-- 免单 -->

<relativelayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margintop="5dp" >

<framelayout
android:id="@+id/index_temai_image_layout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centervertical="true"
android:layout_margin="5dp" >

<imageview
android:id="@+id/index_temai_image"
android:layout_width="80dp"
android:layout_height="80dp" />

<imageview
android:id="@+id/index_temai_discount_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="top|left"
android:background="@drawable/app_limit_buy_sale"
android:src="@drawable/app_limit_buy_begin" />
</framelayout>

<linearlayout
android:id="@+id/temai_date_show"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_torightof="@id/index_temai_image_layout"
android:orientation="vertical" >

<relativelayout
android:layout_width="wrap_content"
android:layout_height="wrap_content" >

<linearlayout
android:id="@+id/temai_weikaishi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margintop="2dp"
android:orientation="horizontal" >

<textview
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="距离开始还有"
android:textcolor="@color/black"
android:textsize="@dimen/small_text_size"
android:textstyle="bold" />

<textview
android:id="@+id/index_temai_day"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="99"
android:textcolor="@color/red"
android:textsize="@dimen/small_text_size"
android:textstyle="bold" />

<textview
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="天"
android:textcolor="@color/black"
android:textsize="@dimen/small_text_size"
android:textstyle="bold" />
</linearlayout>

<linearlayout
android:id="@+id/temai_yikaishi"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margintop="2dp"
android:orientation="horizontal" >

<com.new0315.widgets.timetextview
android:id="@+id/temai_timetextview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textcolor="@android:color/black"
android:textsize="@dimen/small_text_size"
/>

</linearlayout>
</relativelayout>

<linearlayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginbottom="5dp"
android:layout_marginright="20dp"
android:layout_margintop="5dp"
android:orientation="horizontal" >

<textview
android:id="@+id/temai_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:lines="2"
android:text="大众甲壳虫,豪华款,曾全套汽车配件,十年加油卡,车库补贴,十年车险,五年以旧换新服务,比提供五年免费待架服务"
android:textcolor="@color/black"
android:textsize="12sp" />
</linearlayout>

<linearlayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >

<textview
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/index_raw_price"
android:textcolor="@color/darkgray"
android:textsize="@dimen/small_text_size" />

<textview
android:id="@+id/temai_yuanjia_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginleft="5dp"
android:textcolor="@color/darkgray"
android:textsize="@dimen/small_text_size" />
</linearlayout>
</linearlayout>
</relativelayout>

<linearlayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="5sp"
android:background="@drawable/app_limit_buy_sale_bg"
android:gravity="center_vertical" >

<linearlayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginleft="30dp"
android:layout_margintop="3dp"
android:orientation="horizontal" >

<textview
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="特卖价:"
android:textcolor="#919263"
android:textsize="13sp" />

<textview
android:id="@+id/temai_xiajia_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginleft="5dp"
android:layout_marginright="5sp"
android:text="¥400"
android:textcolor="@color/red"
android:textsize="13sp" />

<textview
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="折扣:"
android:textcolor="#919263"
android:textsize="13sp" />

<textview
android:id="@+id/temai_zhekou_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginleft="5dp"
android:layout_marginright="5sp"
android:text="5.0折"
android:textcolor="@color/green"
android:textsize="13sp" />
</linearlayout>
</linearlayout>

</linearlayout>