温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么在Android中实现一个启动页倒计时效果

发布时间:2021-04-20 15:31:29 来源:亿速云 阅读:278 作者:Leah 栏目:开发技术

本篇文章为大家展示了怎么在Android中实现一个启动页倒计时效果,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

Android是什么

Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。

开始准备

新建一个类继承TextView,因为中间还有跳过的文本,所以选择用TextView来画个动起来的背景图。

/**  * 倒计时文本  */ @SuppressLint("AppCompatCustomView") public class CountDownTextView extends TextView {     // 倒计时动画时间     private int duration = 5000;     // 动画扫过的角度     private int mSweepAngle = 360;     // 属性动画     private ValueAnimator animator;     // 矩形用来保存位置大小信息     private final RectF mRect = new RectF();     // 圆弧的画笔     private Paint mBackgroundPaint;     public CountDownTextView(Context context) {         this(context, null);     }     public CountDownTextView(Context context, AttributeSet attrs) {         this(context, attrs, 0);     }     public CountDownTextView(Context context, AttributeSet attrs, int defStyleAttr) {         super(context, attrs, defStyleAttr);         init();     }   private void init() {         // 设置画笔平滑         mBackgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);         // 设置画笔颜色         mBackgroundPaint.setColor(Color.WHITE);         // 设置画笔边框宽度         mBackgroundPaint.setStrokeWidth(5);         // 设置画笔样式为边框类型         mBackgroundPaint.setStyle(Paint.Style.STROKE);     } }

开始动画

原理:利用圆的360度角来做属性动画,让它平滑的分配做每帧动画的角度值,然后调用invalidate()来重绘自己本身,从而进入到本身的onDraw()方法来画图。

/**      * 开始倒计时      */     public void start() {         // 在动画中         if (mSweepAngle != 360) return;         //  初始化属性动画         animator = ValueAnimator.ofInt(mSweepAngle).setDuration(duration);         // 设置插值         animator.setInterpolator(new LinearInterpolator());         // 设置动画监听         animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {             @Override             public void onAnimationUpdate(ValueAnimator animation) {                 // 获取属性动画返回的动画值                 mSweepAngle = (int) animation.getAnimatedValue();                 // 重绘自己                 invalidate();             }         });         // 开始动画         animator.start();     }

画圆弧

画圆弧比较简单, 从效果图来看,有的同学可能刚开始以为要画两个圆,一个背景的内圆和一个白色边框的大圆,其实这里可以利用画笔设置画笔样式paint.setStyle()和宽度大小paint.setStrokeWidth()的特性来实现。代码很简单,开始的角度选择-90,从头顶开始画。这样实现的是一个顺时针的倒计时效果。如果你想实现酷狗的逆时针效果,就控制mSweepAngle的值用mSweepAngle = 360 - mSweepAngle开始就可以了。

 @Override     protected void onDraw(Canvas canvas) {         int padding = dp2px(4);         mRect.top = padding;         mRect.left = padding;         mRect.right = getWidth() - padding;         mRect.bottom = getHeight() - padding;         // 画倒计时线内圆         canvas.drawArc(mRect, //弧线所使用的矩形区域大小                 -90,  //开始角度                 mSweepAngle, //扫过的角度                 false, //是否使用中心                 mBackgroundPaint); // 设置画笔         super.onDraw(canvas);     }

什么是插值动画?

为了让动画过度的更加自然或者添加一些动画效果,比如匀速运动、加速运动、减速运动、弹跳运动等等,这些的动画的效果就是靠插值来实现的。在Android中系统内置了一些插值,更加直观的展示下面介绍的动画效果。

插值说明
LinearInterpolator以常量速率改变
BounceInterpolator动画结束的时候弹起
CycleInterpolator动画循环播放特定的次数,速率改变沿着正弦曲线
DecelerateInterpolator在动画开始的地方快然后慢
OvershootInterpolator向前甩一定值后再回到原来位置
AccelerateInterpolator在动画开始的地方速率改变比较慢,然后开始加速
AnticipateInterpolator开始的时候向后然后向前甩
AccelerateDecelerateInterpolator在动画开始与介绍的地方速率改变比较慢,在中间的时候加速
AnticipateOvershootInterpolator开始的时候向后然后向前甩一定值后返回最后的值

项目使用

这里要定义文本的宽高,因为没有画底部的黑色圆背景,还要设置一下背景图。

 <com.example.viewdemo.CountDownTextView         android:id="@+id/tv_skip"                  android:layout_width="40dp"         android:layout_height="40dp"         android:layout_gravity="center"         android:background="@drawable/bg_count_down"         android:text="跳过"         android:textColor="#ffffff"         android:textSize="12sp"         android:visibility="visible" />

背景图

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android">     <item android:state_pressed="true">         <shape android:shape="oval">             <solid android:color="#302d2d2d" />         </shape>     </item>     <item>         <shape android:shape="oval">             <solid android:color="#7F2d2d2d" />         </shape>     </item> </selector>

完整代码

/**  * 倒计时文本  */ @SuppressLint("AppCompatCustomView") public class CountDownTextView extends TextView {     // 倒计时动画时间     private int duration = 5000;     // 动画扫过的角度     private int mSweepAngle = 360;     // 属性动画     private ValueAnimator animator;     // 矩形用来保存位置大小信息     private final RectF mRect = new RectF();     // 圆弧的画笔     private Paint mBackgroundPaint;     public CountDownTextView(Context context) {         this(context, null);     }     public CountDownTextView(Context context, AttributeSet attrs) {         this(context, attrs, 0);     }     public CountDownTextView(Context context, AttributeSet attrs, int defStyleAttr) {         super(context, attrs, defStyleAttr);         init();     }     @Override     protected void onDraw(Canvas canvas) {         int padding = 5;         mRect.top = padding;         mRect.left = padding;         mRect.right = getWidth() - padding;         mRect.bottom = getHeight() - padding;         // 画倒计时线内圆         canvas.drawArc(mRect, //弧线所使用的矩形区域大小                 -90,  //开始角度                 mSweepAngle, //扫过的角度                 false, //是否使用中心                 mBackgroundPaint); // 设置画笔         start();         super.onDraw(canvas);     }     private void init() {         // 设置画笔平滑         mBackgroundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);         // 设置画笔颜色         mBackgroundPaint.setColor(Color.WHITE);         // 设置画笔边框宽度         mBackgroundPaint.setStrokeWidth(5);         // 设置画笔样式为边框类型         mBackgroundPaint.setStyle(Paint.Style.STROKE);     }     /**      * 开始倒计时      */     public void start() {         // 在动画中         if (mSweepAngle != 360) return;         //  初始化属性动画         animator = ValueAnimator.ofInt(mSweepAngle).setDuration(duration);         // 设置插值         animator.setInterpolator(new LinearInterpolator());         // 设置动画监听         animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {             @Override             public void onAnimationUpdate(ValueAnimator animation) {                 // 获取属性动画返回的动画值                 mSweepAngle = (int) animation.getAnimatedValue();                 // 重绘自己                 invalidate();             }         });         // 开始动画         animator.start();     } }

上述内容就是怎么在Android中实现一个启动页倒计时效果,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI