Android自定义view实现倒计时控件

本文实例为大家分享了Android自定义view实现倒计时控件的具体代码,供大家参考,具体内容如下

直接上代码

自定义TextView

文字展示

public class StrokeTextView extends TextView {

 private TextView borderText = null;///用于描边的TextView
 private Context mContext;

 public StrokeTextView(Context context) {
  super(context);
  mContext = context;
  borderText = new TextView(context);
  init();
 }

 public StrokeTextView(Context context, AttributeSet attrs) {
  super(context, attrs);
  mContext = context;
  borderText = new TextView(context, attrs);
  init();
 }

 public StrokeTextView(Context context, AttributeSet attrs, int defStyle) {
  super(context, attrs, defStyle);
  mContext = context;
  borderText = new TextView(context, attrs, defStyle);
  init();
 }

 public void init() {
  TextPaint tp1 = borderText.getPaint();
  tp1.setStrokeWidth(12);         //设置描边宽度
  tp1.setStyle(Paint.Style.STROKE);        //对文字只描边
  //设置自定义字体
  Typeface fromAsset = Typeface.createFromAsset(mContext.getAssets(), "fonts/Alibaba-PuHuiTi-Heavy.ttf");
  borderText.setTypeface(fromAsset, Typeface.ITALIC); //自定义字体 ITALIC斜体
  borderText.setTextColor(Color.parseColor("#F46059")); //设置描边颜色
  borderText.setShadowLayer(3.0F, 2F, 2F, Color.parseColor("#ffd44042")); //设置阴影效果(投影)
  borderText.setGravity(getGravity());
 }

 @Override
 public void setLayoutParams(ViewGroup.LayoutParams params) {
  super.setLayoutParams(params);
  borderText.setLayoutParams(params);
 }

 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  CharSequence tt = borderText.getText();

  //两个TextView上的文字必须一致
  if (tt == null || !tt.equals(this.getText())) {
   borderText.setText(getText());
   this.postInvalidate();
  }
  super.onMeasure(widthMeasureSpec, heightMeasureSpec);
  borderText.measure(widthMeasureSpec, heightMeasureSpec);
 }

 protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
  super.onLayout(changed, left, top, right, bottom);
  borderText.layout(left, top, right, bottom);
 }

 @Override
 protected void onDraw(Canvas canvas) {
  borderText.draw(canvas);
  super.onDraw(canvas);
 }

}

xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:app="http://schemas.android.com/apk/res-auto"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:background="#F3B243"
 android:layout_height="match_parent"
 tools:context=".countdown.TestCountActivity">

 <RelativeLayout
  android:layout_width="match_parent"
  android:layout_height="wrap_content">
  <com.xiao.test.countdown.StrokeTextView
   android:layout_marginTop="100dp"
   android:id="@+id/tv_test"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:background="@drawable/play_advertising_timer_bg"
   android:paddingLeft="15dp"
   android:textColor="#FFFFFF"
   android:textSize="33sp"
   android:layout_centerHorizontal="true"
   android:layout_gravity="center"
   android:gravity="center_vertical"
   android:textStyle="italic"
   android:typeface="monospace"
   tools:ignore="RtlSymmetry"
   android:paddingStart="15dp" />

 </RelativeLayout>

</LinearLayout>

倒计时帮助类

public class CountDownHelper {

 private OnCountDownListener onCountDownListener;
 private Disposable disposable;
 private long remainingTime;

 public CountDownHelper(long remainingTime) {
  this.remainingTime = remainingTime;
 }

 /**
  * 回收倒计时
  */
 public void destory() {
  if (disposable != null && !disposable.isDisposed()) {
   disposable.dispose();
  }
 }

 /**
  * 开始倒计时
  */
 public void startCompute() {
  Observable.interval(1, TimeUnit.SECONDS)
    .subscribeOn(Schedulers.newThread())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Observer<Long>() {
     @Override
     public void onSubscribe(Disposable d) {
      disposable = d;
     }

     @Override
     public void onNext(Long aLong) {
      if (onCountDownListener == null) {
       return;
      }
      remainingTime -= 1000;
      if (remainingTime > 0) {
       int day = (int) (remainingTime / (1000 * 60 * 60 * 24));
       int hour = (int) ((remainingTime % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
       int minute = (int) ((remainingTime % (1000 * 60 * 60)) / (1000 * 60));
       int second = (int) ((remainingTime % (1000 * 60)) / 1000);
       String dayStr = day >= 10 ? String.valueOf(day) : "0" + day;
       String hourStr = hour >= 10 ? String.valueOf(hour) : "0" + hour;
       String minuteStr = minute >= 10 ? String.valueOf(minute) : "0" + minute;
       String secondStr = second >= 10 ? String.valueOf(second) : "0" + second;
       onCountDownListener.countDown(dayStr, hourStr, minuteStr, secondStr);
       if (remainingTime <= 0) {
        onCountDownListener.countDownFinish();
        if (disposable != null && !disposable.isDisposed()) {
         disposable.dispose();
        }
       }
      } else {
       onCountDownListener.countDownFinish();
       if (disposable != null && !disposable.isDisposed()) {
        disposable.dispose();
       }
      }
     }

     @Override
     public void onError(Throwable e) {

     }

     @Override
     public void onComplete() {

     }
    });
 }

 /**
  * 设置倒计时回调监听
  *
  * @param onCountDownListener 倒计时监听
  */
 public void setOnCountDownListener(OnCountDownListener onCountDownListener) {
  this.onCountDownListener = onCountDownListener;
 }

 public interface OnCountDownListener {

  /**
   * 倒计时
   *
   * @param day 天
   * @param hour 小时
   * @param minute 分钟
   * @param second 秒
   */
  void countDown(String day, String hour, String minute, String second);

  /**
   * 倒计时完成
   */
  void countDownFinish();
 }
}

TestCountActivity.java

public class TestCountActivity extends AppCompatActivity {
 private CountDownHelper mCountDownHelper;
 private StrokeTextView mTvTest;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_test_count);

  mTvTest = findViewById(R.id.tv_test);

//设置自定义字体
  Typeface fromAsset = Typeface.createFromAsset(getAssets(), "fonts/Alibaba-PuHuiTi-Heavy.ttf");
  mTvTest.setTypeface(fromAsset, Typeface.ITALIC); //自定义字体 ITALIC斜体

  long aLong = 1787;
  mCountDownHelper = new CountDownHelper(aLong * 1000);
  mCountDownHelper.startCompute();
  mCountDownHelper.setOnCountDownListener(new CountDownHelper.OnCountDownListener() {
   @SuppressLint("SetTextI18n")
   @Override
   public void countDown(String day, String hour, String minute, String second) {
    mTvTest.setText(hour + ":" + minute + ":" + second);
   }

   @Override
   public void countDownFinish() {
    Log.d("", "结束倒计时");
    mCountDownHelper.destory();
    //延时跳转
    new Handler(new Handler.Callback() {
     @Override
     public boolean handleMessage(Message msg) {

      Toast.makeText(TestCountActivity.this, "时间到了", Toast.LENGTH_SHORT).show();

      return false;
     }
    }).sendEmptyMessageDelayed(0, 10000);//表示延迟10秒发送任务

   }
  });

 }
}

引入依赖

implementation ‘io.reactivex.rxjava2:rxjava:2.0.1'
implementation ‘io.reactivex.rxjava2:rxandroid:2.0.1'

欢迎小伙伴们评论

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

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

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

  • Android实现时间倒计时功能

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

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

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

  • Android自带倒计时控件Chronometer使用方法详解

    公司的以前的项目,看到使用了这个Android自带的倒计时控件Chronometer,现在整合了一下 先看看效果: <Chronometer android:id="@+id/chronometer" android:layout_width="wrap_content" android:layout_height="30dp" /> <Button android:onClick="start" andro

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

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

  • 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

  • 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 列表倒计时的实现的示例代码(CountDownTimer)

    实习一段时间了,一直想写点技术总结,但一直没找到合适的主题.刚好,最近版本中我负责的模块遇到了个线程相关问题(之前一直画界面,做点基础功能,有点乏味),列表项倒计时的实现. 于是乎,我的第一篇android技术文章就诞生了. [醒目]该demo用Kotlin语言实现. 背景介绍 需要在ListView的item里实现倒计时,初看还挺简单的,但是真正做的时候也遇到了不少坑. 网上有不少类似文章,有用对TextView扩展实现的,也有用自带的CountDownTimer实现的,本文就是用CountD

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

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

  • 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;

随机推荐