栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 移动开发 > Android

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

Android 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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



 
  

 

倒计时帮助类

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() {
     @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() {

     }
    });
 }


 
 public void setonCountDownListener(onCountDownListener onCountDownListener) {
  this.onCountDownListener = onCountDownListener;
 }

 public interface onCountDownListener {

  
  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'

欢迎小伙伴们评论

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/153763.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号