• [原创]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

  • 相关阅读:
    phpexcel读取excel文件
    laravel的表单验证(下面有些信息未验证,转的)
    Laravel框架学习(Response)
    laravel文件存储Storage
    Laravel 5 教程
    js中substring和substr的用法
    jquery 规范
    总结oninput、onchange与onpropertychange事件的用法和区别
    jquery 选择器的总结
    jquery选择器中的find和空格,children和>的区别、及父节点兄弟节点,还有判断是否存在的写法
  • 原文地址:https://www.cnblogs.com/mikel/p/3533689.html
Copyright © 2020-2023  润新知