老规矩先上效果图:

这就是我们要实现的效果,现在我们看代码

public class CountDownView extends View {//圆轮颜色private int mRingColor;//圆轮宽度private float mRingWidth;//圆轮进度值文本大小private int mRingProgessTextSize;//宽度private int mWidth;//高度private int mHeight;private Paint mPaint;//圆环的矩形区域private RectF mRectF;//private int mProgessTextColor;private int mCountdownTime;private float mCurrentProgress;private OnCountDownFinishListener mListener;public CountDownView(Context context) {this(context, null);}public CountDownView(Context context, @Nullable AttributeSet attrs) {this(context, attrs, 0);}public CountDownView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CountDownView);mRingColor = a.getColor(R.styleable.CountDownView_ringColor, context.getResources().getColor(R.color.white));mRingWidth = a.getFloat(R.styleable.CountDownView_ringWidth, 6);mRingProgessTextSize = a.getDimensionPixelSize(R.styleable.CountDownView_progressTextSize, DensityUtils.sp2px(context, 10));mProgessTextColor = a.getColor(R.styleable.CountDownView_progressTextColor, context.getResources().getColor(R.color.white));mCountdownTime = a.getInteger(R.styleable.CountDownView_countdownTime, 3);a.recycle();mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mPaint.setAntiAlias(true);this.setWillNotDraw(false);}public void setCountdownTime(int mCountdownTime) {this.mCountdownTime = mCountdownTime;}@Overrideprotected void onLayout(boolean changed, int left, int top, int right, int bottom) {super.onLayout(changed, left, top, right, bottom);mWidth = 2 * getMeasuredWidth() / 3;mHeight = 2 * getMeasuredHeight() / 3;mRectF = new RectF(0 + mRingWidth / 3, 0 + mRingWidth / 3,mWidth - mRingWidth / 3, mHeight - mRingWidth / 3);}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);/***圆环*///颜色mPaint.setColor(mRingColor);//空心mPaint.setStyle(Paint.Style.STROKE);//宽度mPaint.setStrokeWidth(mRingWidth);canvas.drawArc(mRectF, -90, mCurrentProgress - 360, false, mPaint);//绘制圆形,此处绘制的是图中红色区域Paint circlePaint=new Paint();circlePaint.setAntiAlias(true);circlePaint.setColor(getResources().getColor(R.color.gray_7d7d7d));circlePaint.setAlpha(180);canvas.drawCircle(50,50,(mWidth/2-6),circlePaint);//绘制文本,可以根据需求进行更改,例如倒计时几秒Paint textPaint = new Paint();textPaint.setAntiAlias(true);textPaint.setTextAlign(Paint.Align.CENTER);
//        String text = mCountdownTime - (int) (mCurrentProgress / 360f * mCountdownTime) + "";String text = "跳过";textPaint.setTextSize(mRingProgessTextSize);textPaint.setColor(mProgessTextColor);//文字居中显示Paint.FontMetricsInt fontMetrics = textPaint.getFontMetricsInt();int baseline = (int) ((mRectF.bottom + mRectF.top - fontMetrics.bottom - fontMetrics.top) / 2);canvas.drawText(text, mRectF.centerX(), baseline, textPaint);}private ValueAnimator getValA(long countdownTime) {ValueAnimator valueAnimator = ValueAnimator.ofFloat(0, 100);valueAnimator.setDuration(countdownTime);valueAnimator.setInterpolator(new LinearInterpolator());valueAnimator.setRepeatCount(0);return valueAnimator;}/*** 开始倒计时*/public void startCountDown() {setClickable(false);ValueAnimator valueAnimator = getValA(mCountdownTime * 1000);valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {float i = Float.valueOf(String.valueOf(animation.getAnimatedValue()));mCurrentProgress = (int) (360 * (i / 100f));invalidate();}});valueAnimator.start();valueAnimator.addListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationEnd(Animator animation) {super.onAnimationEnd(animation);//倒计时结束回调if (mListener != null) {mListener.countDownFinished();}setClickable(true);}});}//倒计时监听,可在countDownFinished()方法中进行倒计时结束后的逻辑public void setAddCountDownListener(OnCountDownFinishListener mListener) {this.mListener = mListener;}public interface OnCountDownFinishListener {void countDownFinished();}
}

现在我们来看一下此view的用法::

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"><demo.com.jumpdemo.CountDownView
        android:id="@+id/splshjumpView"android:layout_width="50dp"android:layout_height="50dp"android:layout_alignParentRight="true"android:paddingRight="35dp"android:layout_marginTop="20dp"/></RelativeLayout>

这是在布局文件中的写法:
cdv.startCountDown(); 这是此view开始计时的方法,

cdv.setAddCountDownListener(new CountDownView.OnCountDownFinishListener() {@Overridepublic void countDownFinished() {Toast.makeText(MainActivity.this, "倒计时结束", Toast.LENGTH_SHORT).show();}});

这是倒计时结束监听,我在此进行显示吐司,大家可根据自己的需求进行更改。

这就是整个倒计时功能。。。

App启动页倒计时圆形并且跳过功能实现相关推荐

  1. android开发 时间倒计时的启动页,App启动页倒计时功能

    示例代码采用 RxJava + RxLifecycle + Data-Binding 模式编写 示例图: 话不多说,实现方式如下: 1.导入依赖库 ① RxJava: Reactive Extensi ...

  2. 小视频app源码无障碍服务实现自动跳过APP启动页广告

    小视频app源码无障碍服务实现自动跳过APP启动页广告实现的相关代码 一. res目录下新建xml文件夹新建文件accessibility.xml <?xml version="1.0 ...

  3. app启动页自动跳转源码_关于移动端App启动页的策划方案

    App启动页是指app在启东时需要加载必要的运行环境和配置,在这个过程中提示用户等待的一个过渡页面. 在产品经理眼里启动页是app给予用户重要的第一印象:也是App最重要的黄金页面之一,所有用户100 ...

  4. android 一分钟倒计时动画,Android View篇之启动页倒计时动画的实现

    Hello,小伙伴们大家好,今天介绍一个很简单的倒计时动画,仿酷狗音乐的启动页倒计时效果,也是大多数APP在用的一个动画,来看看效果图: 在这里插入图片描述 整体的思路就是用一个平滑的帧动画来画圆弧就 ...

  5. app启动页的设计技巧(一)

    虽然,每一个APP的启动页界面设计是需要按使用场景设计的.但是每一个APP启动页的存在的意义与APP产品定位.APP运营策略有关的. 第一部分:对于设计一个好的APP启动页作品,必须满足这三个特征 认 ...

  6. ios启动页尺寸_关于移动端App启动页的策划方案

    App启动页是指app在启东时需要加载必要的运行环境和配置,在这个过程中提示用户等待的一个过渡页面. 在产品经理眼里启动页是app给予用户重要的第一印象:也是App最重要的黄金页面之一,所有用户100 ...

  7. UI培训教程分享:APP启动页UI界面设计

    本期为大家分享的ui培训教程是关于APP启动页面的UI设计方面,作为一名合格的UI设计师,APP产品的启动页是需要会的,下面就来看看详细的教程吧. UI培训教程分享:APP启动页UI界面设计 启动页面 ...

  8. 产品策划三:App启动页的策划方案

    App启动页是指app在启东时需要加载必要的运行环境和配置,在这个过程中提示用户等待的一个过渡页面. 在产品经理眼里启动页是app给予用户重要的第一印象:也是App最重要的黄金页面之一,所有用户100 ...

  9. android启动页广告图,一张图搞定APP启动页广告

    之前我们产品里的启动页比较简单,就是背景色加上我们的logo.slogan等,这种形式适配起来比较容易,把元素切出来交给开发写出来就行.最近由于运营的需求,我们需要在APP启动页展示广告,广告图更新频 ...

  10. android打开app白色页面,完美解决Android App启动页有白屏闪过的问题

    应用启动的时候有短暂的白屏,如图: 可以通过设置theme的方式来解决 @color/colorPrimary @color/colorPrimaryDark @color/colorAccent t ...

最新文章

  1. 使用NeMo快速入门NLP、实现机器翻译任务,英伟达专家实战讲解,内附代码
  2. [sqlserver脚本]查看指定SQL语句生成了哪些执行计划
  3. redis-sentinel主从复制高可用
  4. linux学习笔记-第六课-/etc/passwd,/etc/shadow,useradd,su,sudo等
  5. pytorch dropout_PyTorch初探MNIST数据集
  6. myEclipse背景控制插件方案 内附使用说明
  7. 嵌入式开发之davinci--- MSB和LSB
  8. 【数据结构与算法基础】线性表
  9. 将浮点数转换为字符串
  10. Windows via C/C++ 学习(6)内核对象
  11. window10运行python弹出商店_Python上架Windows 10应用商店,但主要用于学习,正式项目还...
  12. python的字符串类型本质上是一种字符序列_20170402Python变量类型 知识点梳理
  13. java 打印 xps_使用PrintTicket打印XPS,OutputColor PagesPerSheet无效
  14. 压力传感器的封装形式
  15. 台式计算机的安规测试要求,美国EPA发布能源之星计算机规范V8.0版
  16. 2013腾讯实习生面试经历
  17. 商业研究(5):宠物服务市场-概览
  18. 项目时间(概念、活动定义、活动排序)(笔记)
  19. 美元中线强势,英镑熊途漫漫
  20. php中的 notice,PHP中出现Notice: Undefined index的三种解决办法

热门文章

  1. Mysql 解决 Your password has expired.
  2. Error: Delta RPMs disabled because /usr/bin/applyd
  3. 物联网方面的竞赛有那些?
  4. 数字逻辑educoder实训项目 logisim实现 交通灯系统设计超详细实验步骤,绝对完整
  5. protobuf 中 repeated fields 细节
  6. 如何删除剽悍的应用软件
  7. 26岁考计算机研究生,26岁考研究生好还是考公务员好?总结得太精辟了
  8. 浏览器攻击框架BeEF简介
  9. Debian(Linux) 安装Windows通用字体(可解决TimesNewRoman等字体的报错)
  10. 韩波兄的好文:写给过去,现在和未来的自己