android自定义Countdown控件

来源:互联网 发布:医学生刷题软件 编辑:程序博客网 时间:2024/06/01 21:19

自定义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" ><!-- 免单 --><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="5dp" ><FrameLayoutandroid:id="@+id/index_temai_image_layout"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_margin="5dp" ><ImageViewandroid:id="@+id/index_temai_image"android:layout_width="80dp"android:layout_height="80dp" /><ImageViewandroid: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><LinearLayoutandroid: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" ><RelativeLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content" ><LinearLayoutandroid:id="@+id/temai_weikaishi"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="2dp"android:orientation="horizontal" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="距离开始还有"android:textColor="@color/black"android:textSize="@dimen/small_text_size"android:textStyle="bold" /><TextViewandroid: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" /><TextViewandroid: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><LinearLayoutandroid:id="@+id/temai_yikaishi"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="2dp"android:orientation="horizontal" ><com.new0315.widgets.TimeTextViewandroid: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><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginBottom="5dp"android:layout_marginRight="20dp"android:layout_marginTop="5dp"android:orientation="horizontal" ><TextViewandroid: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><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:orientation="horizontal" ><TextViewandroid: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" /><TextViewandroid: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><LinearLayoutandroid: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" ><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginLeft="30dp"android:layout_marginTop="3dp"android:orientation="horizontal" ><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="特卖价:"android:textColor="#919263"android:textSize="13sp" /><TextViewandroid: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" /><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="折扣:"android:textColor="#919263"android:textSize="13sp" /><TextViewandroid: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>
复制代码

最终效果:
Screenshot_2014-01-26-09-18-25


0 0
原创粉丝点击