[原创]Android秒杀倒计时自定义TextView

自定义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>

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

赞(0) 打赏
分享到: 更多 (0)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏