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>

(0)

相关推荐

  • Android实现时间倒计时功能

    本文实例为大家分享了Android实现时间倒计时功能展示的具体代码,供大家参考,具体内容如下 效果展示 MainActivity(主页面代码) public class MainActivity extends Activity { private RelativeLayout countDown; // 倒计时 private TextView daysTv, hoursTv, minutesTv, secondsTv; private long mDay = 10; private long

  • Android自定义圆形倒计时进度条

    效果预览 源代码传送门:https://github.com/yanzhenjie/CircleTextProgressbar 实现与原理 这个文字圆形的进度条我们在很多APP中看到过,比如APP欢迎页倒计时,下载文件倒计时等. 分析下原理,可能有的同学一看到这个自定义View就慌了,这个是不是要继承View啊,是不是要绘制啊之类的,答案是:是的.但是我们也不要担心,实现这个效果实在是so easy.下面就跟我一起来看看核心分析和代码吧. 原理分析 首先我们观察上图,需要几个部分组成: 1. 外

  • Android实现计时与倒计时的常用方法小结

    本文实例总结了Android实现计时与倒计时的常用方法.分享给大家供大家参考,具体如下: 方法一 Timer与TimerTask(Java实现) public class timerTask extends Activity{ private int recLen = 11; private TextView txtView; Timer timer = new Timer(); public void onCreate(Bundle savedInstanceState){ super.onC

  • Android开发之获取短信验证码后按钮背景变化并且出现倒计时

    目前越来越多的app在注册或是进行对应操作时,要求获取短信验证码,在点击了获取短信验证码的按钮后,就是出现倒计时,比如倒计时120S,在倒计时期间内,按钮背景变化并且出现倒计时,当倒计时结束后,如果你没有获取到验证码,可以再次点击. 代码如下所示: VerCodeTimer mVerCodeTimer=(Button) findViewById(R.id.login_get_ver_code); private class VerCodeTimer extends CountDownTimer

  • Android实现加载广告图片和倒计时的开屏布局

    这是一个android开屏布局的实例,可以用于加载广告图片和倒计时的布局.程序中设置的LayoutParams,划分额外空间比例为6分之5,具体权重比例可根据用户自己需求来自定义,异步加载广告图片,相关的Android代码. 具体实现代码如下: package cn.waps.extend; import android.app.Activity; import android.content.Context; import android.content.res.Configuration;

  • Android账号注册实现点击获取验证码倒计时效果

    网站中为了防止恶意获取验证短信.验证邮箱,都会在点击获取验证码的按钮上做个倒计时的效果,如何实现这个效果,具体内容如下 效果图:   代码: RegisterActivity.java import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.Button; import com.jialianjia.bzw.BaseAct

  • Android 实现闪屏页和右上角的倒计时跳转实例代码

    以前编程的时候,遇到倒计时的功能时,经常自己去写,但其实Android已经帮封装好了一个倒计时类CountDownTimer,其实是将后台线程的创建和Handler队列封装成为了一个方便的类调用. 闪屏页用到了handler和CountDownTimer类,还需配置一下Activity的主题,这里是:android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 全屏主题的意思. 给大家展示下效果图: 代码如下所示: package

  • Android中使用TextView实现高仿京东淘宝各种倒计时效果

    今天给大家带来的是仅仅使用一个TextView实现一个高仿京东.淘宝.唯品会等各种电商APP的活动倒计时.最近公司一直加班也没来得及时间去整理,今天难得休息想把这个分享给大家,只求共同学习,以及自己后续的复习.为什么会想到使用一个TextView来实现呢?因为最近公司在做一些优化的工作,其中就有一个倒计时样式,原来开发的这个控件的同事使用了多个TextView拼接在一起的,实现的代码冗余比较大,故此项目经理就说:小宏这个就交给你来优化了,并且还要保证有一定的扩展性,当时就懵逼了.不知道从何处开始

  • Android中CountDownTimer倒计时器用法实例

    本文实例讲述了Android中CountDownTimer倒计时器用法.分享给大家供大家参考,具体如下: 在平时我们编程的时候,经常会用到倒计时这个功能,很多人不知道Android已经帮封装好了一个类,往往都自己写.现在发现了这个类,大家共享一下: 在一个TextView不断显示剩下的时间,代码如下: private TextView vertifyView; private CountDownTimer timer = new CountDownTimer(10000, 1000) { @Ov

  • android实现倒计时功能代码

    效果图,每隔1秒,变换一下时间  xml: 复制代码 代码如下: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="mat

随机推荐