App启动页倒计时圆形并且跳过功能实现
老规矩先上效果图:
这就是我们要实现的效果,现在我们看代码
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启动页倒计时圆形并且跳过功能实现相关推荐
- android开发 时间倒计时的启动页,App启动页倒计时功能
示例代码采用 RxJava + RxLifecycle + Data-Binding 模式编写 示例图: 话不多说,实现方式如下: 1.导入依赖库 ① RxJava: Reactive Extensi ...
- 小视频app源码无障碍服务实现自动跳过APP启动页广告
小视频app源码无障碍服务实现自动跳过APP启动页广告实现的相关代码 一. res目录下新建xml文件夹新建文件accessibility.xml <?xml version="1.0 ...
- app启动页自动跳转源码_关于移动端App启动页的策划方案
App启动页是指app在启东时需要加载必要的运行环境和配置,在这个过程中提示用户等待的一个过渡页面. 在产品经理眼里启动页是app给予用户重要的第一印象:也是App最重要的黄金页面之一,所有用户100 ...
- android 一分钟倒计时动画,Android View篇之启动页倒计时动画的实现
Hello,小伙伴们大家好,今天介绍一个很简单的倒计时动画,仿酷狗音乐的启动页倒计时效果,也是大多数APP在用的一个动画,来看看效果图: 在这里插入图片描述 整体的思路就是用一个平滑的帧动画来画圆弧就 ...
- app启动页的设计技巧(一)
虽然,每一个APP的启动页界面设计是需要按使用场景设计的.但是每一个APP启动页的存在的意义与APP产品定位.APP运营策略有关的. 第一部分:对于设计一个好的APP启动页作品,必须满足这三个特征 认 ...
- ios启动页尺寸_关于移动端App启动页的策划方案
App启动页是指app在启东时需要加载必要的运行环境和配置,在这个过程中提示用户等待的一个过渡页面. 在产品经理眼里启动页是app给予用户重要的第一印象:也是App最重要的黄金页面之一,所有用户100 ...
- UI培训教程分享:APP启动页UI界面设计
本期为大家分享的ui培训教程是关于APP启动页面的UI设计方面,作为一名合格的UI设计师,APP产品的启动页是需要会的,下面就来看看详细的教程吧. UI培训教程分享:APP启动页UI界面设计 启动页面 ...
- 产品策划三:App启动页的策划方案
App启动页是指app在启东时需要加载必要的运行环境和配置,在这个过程中提示用户等待的一个过渡页面. 在产品经理眼里启动页是app给予用户重要的第一印象:也是App最重要的黄金页面之一,所有用户100 ...
- android启动页广告图,一张图搞定APP启动页广告
之前我们产品里的启动页比较简单,就是背景色加上我们的logo.slogan等,这种形式适配起来比较容易,把元素切出来交给开发写出来就行.最近由于运营的需求,我们需要在APP启动页展示广告,广告图更新频 ...
- android打开app白色页面,完美解决Android App启动页有白屏闪过的问题
应用启动的时候有短暂的白屏,如图: 可以通过设置theme的方式来解决 @color/colorPrimary @color/colorPrimaryDark @color/colorAccent t ...
最新文章
- 使用NeMo快速入门NLP、实现机器翻译任务,英伟达专家实战讲解,内附代码
- [sqlserver脚本]查看指定SQL语句生成了哪些执行计划
- redis-sentinel主从复制高可用
- linux学习笔记-第六课-/etc/passwd,/etc/shadow,useradd,su,sudo等
- pytorch dropout_PyTorch初探MNIST数据集
- myEclipse背景控制插件方案 内附使用说明
- 嵌入式开发之davinci--- MSB和LSB
- 【数据结构与算法基础】线性表
- 将浮点数转换为字符串
- Windows via C/C++ 学习(6)内核对象
- window10运行python弹出商店_Python上架Windows 10应用商店,但主要用于学习,正式项目还...
- python的字符串类型本质上是一种字符序列_20170402Python变量类型 知识点梳理
- java 打印 xps_使用PrintTicket打印XPS,OutputColor PagesPerSheet无效
- 压力传感器的封装形式
- 台式计算机的安规测试要求,美国EPA发布能源之星计算机规范V8.0版
- 2013腾讯实习生面试经历
- 商业研究(5):宠物服务市场-概览
- 项目时间(概念、活动定义、活动排序)(笔记)
- 美元中线强势,英镑熊途漫漫
- php中的 notice,PHP中出现Notice: Undefined index的三种解决办法
热门文章
- Mysql 解决 Your password has expired.
- Error: Delta RPMs disabled because /usr/bin/applyd
- 物联网方面的竞赛有那些?
- 数字逻辑educoder实训项目 logisim实现 交通灯系统设计超详细实验步骤,绝对完整
- protobuf 中 repeated fields 细节
- 如何删除剽悍的应用软件
- 26岁考计算机研究生,26岁考研究生好还是考公务员好?总结得太精辟了
- 浏览器攻击框架BeEF简介
- Debian(Linux) 安装Windows通用字体(可解决TimesNewRoman等字体的报错)
- 韩波兄的好文:写给过去,现在和未来的自己