[原创]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>
最终效果:

[原创]Android秒杀倒计时自定义TextView的更多相关文章
- Android项目实战(十):自定义倒计时的TextView
项目总结 -------------------------------------------------------------------------------------------- 有这 ...
- Android开发学习笔记-自定义TextView属性模版
如果项目中有很多个控件使用的是同一种样式,则为了方便,可以将样式设置到系统中去,这样使用的时候会方便很多. 下面是自定义样式模版的方法. 1.在style.xml文件中添加自己要设置的样式内容 < ...
- Android源码分析(十二)-----Android源码中如何自定义TextView实现滚动效果
一:如何自定义TextView实现滚动效果 继承TextView基类 重写构造方法 修改isFocused()方法,获取焦点. /* * Copyright (C) 2015 The Android ...
- Android自定义控件之自定义ViewGroup实现标签云
前言: 前面几篇讲了自定义控件绘制原理Android自定义控件之基本原理(一),自定义属性Android自定义控件之自定义属性(二),自定义组合控件Android自定义控件之自定义组合控件(三),常言 ...
- Android自定义控件之自定义组合控件
前言: 前两篇介绍了自定义控件的基础原理Android自定义控件之基本原理(一).自定义属性Android自定义控件之自定义属性(二).今天重点介绍一下如何通过自定义组合控件来提高布局的复用,降低开发 ...
- Android开发之自定义的ListView(UITableViewController)
Android开发中的ListView, 顾名方法思义,就是表视图.表示图在iOS开发中就是TableView.两者虽然名称不一样,但是其使用方法,使用场景以及该控件的功能都极为相似,都是用来展示大量 ...
- Android开发之自定义组件和接口回调
说到自定义控件不得不提的就是接口回调,在Android开发中接口回调用的还是蛮多的.在这篇博客开始的时候呢,我想聊一下iOS的自定义控件.在iOS中自定义控件的思路是继承自UIView, 在UIVie ...
- 自定义TextView 调用ttf格式字体
自定义TextView 调用ttf格式字体 1.<strong>将ttf格式文件存放在assets/fonts/下</strong> 注:PC系统字体存放在C:\Windows ...
- Android之垂直显示TextView
Android之垂直显示TextView 1因为界面需求原因,需要TextView垂直显示,话不多说,看代码,我也是搜的例子,在此感谢写这个例子的大神,在此做个笔记和分享给大家 2.用到了自定义控件的 ...
随机推荐
- hadoop2.2.0安装
64位编译和安装 http://blog.csdn.net/licongcong_0224/article/details/12972889 http://blog.csdn.net/w1377026 ...
- Annotation【转】
1.Annotation的工作原理: JDK5.0中提供了注解的功能,允许开发者定义和使用自己的注解类型.该功能由一个定义注解类型的语法和描述一个注解声明的语法,读取注解的API,一个使用注解修饰的c ...
- 在运行时切换 WinForm 程序的界面语言 System.ComponentModel.ComponentResourceManager .ApplyResources
Download the code for this article: WinForm-Multilanguages-2.rar (11 KB). 方法二: 下面介绍一种只需对现有代码做较小改动的方法 ...
- Innodb parent table open时导致crash
case描述: innodb中,父表和子表通过foreign constraint进行关联, 因为在更新数据时需要check 外键constraint,如果父表被大量的子表reference, 那么在 ...
- 函数page_align
/************************************************************//** Gets the start of a page. @return ...
- 逆序对的相关问题:bzoj1831,bzoj2431
先从简单一点的bzoj2431入手: n个数1~n已经限定了,所以 对于1~i-1,新加入i,最多可以增加i-1个逆序对,最少增加0个逆序对 f[i,j]表示1~i形成的序列逆序对为j的方案数 比较容 ...
- NopCommerce架构分析之一----依赖类生成容器
NopCommerce为了实现松耦合的框架设计目的,使用了IOC框架:Autofac.据有人测试,Autofac是性能好的IOC工具. 1.在IOC中,组件首先需要在IOC中注册,有通过配置文件注册的 ...
- xmlns 属性
xmlns 属性 xmlns 属性可以在文档中定义一个或多个可供选择的命名空间.该属性可以放置在文档内任何元素的开始标签中.该属性的值类似于 URL,它定义了一个命名空间,浏览器会将此命名空间用于该属 ...
- [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.4.6
Let $A$ and $B$ be two matrices (not necessarily of the same size). Relative to the lexicographicall ...
- [Bhatia.Matrix Analysis.Solutions to Exercises and Problems]ExI.3.1
Let $A=A_1\oplus A_2$. Show that (1). $W(A)$ is the convex hull of $W(A_1)$ and $W(A_2)$; i.e., the ...