文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-06-14 14:22

关注

本篇文章为大家展示了怎么在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中实现一个启动页倒计时效果,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯