自定义view画圆+倒计时跳转

android自定义CountDownView 利用canvas绘图机制实现的漂亮的android自定义倒计时控件 立即下载

1.创建一个attrs,定义属性

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="CountDownView">
        <attr name="CountDownTime" format="integer"></attr>
        <attr name="CountDownRadius" format="dimension"></attr>
        <attr name="CountDownBgColor" format="color"></attr>
        <attr name="CountDownTextColor" format="color"></attr>
    </declare-styleable>

</resources>

2.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SplashActivity">

    <com.liqy.zhoukao1.view.CountDownView
        android:id="@+id/downText"
        android:layout_width="65dp"
        android:layout_margin="8dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        app:CountDownBgColor="@color/colorPrimary"
        app:CountDownRadius="30dp"
        android:layout_height="65dp" />

</RelativeLayout>

3.Activity

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.app.AppCompatActivity;
import android.view.View;

import com.liqy.zhoukao1.view.CountDownView;

public class SplashActivity extends AppCompatActivity {

    CountDownView downText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);

        downText = (CountDownView) findViewById(R.id.downText);
        downText.start(this,MainActivity.class);

        downText.setListener(new CountDownView.MyListener() {
            @Override
            public void onClick(View view) {
                //TODO 跳转
                downText.stop();//停止倒计时
                Intent intent=new Intent(SplashActivity.this,MainActivity.class);
                startActivity(intent);
                finish();
            }
        });

    }

}

4.创建自定义view类

public class CountDownView extends View {

    Paint paint;//画笔
    int time;
    float radius;
    int textColor;
    int bgColor;

    int cx;
    int cy;


    MyListener listener;
    Handler handler;

    public CountDownView(Context context) {
        super(context);
        init(context, null);
    }

    public CountDownView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }

    public CountDownView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }

    private void init(Context context, AttributeSet attrs) {
        //初始化属性
        if (attrs != null) {
            //获取属性列表
            TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CountDownView);
            //TODO 初始化自定义属性
            time = typedArray.getInteger(R.styleable.CountDownView_CountDownTime, 3);
            radius = typedArray.getDimension(R.styleable.CountDownView_CountDownRadius, 25);
            textColor = typedArray.getColor(R.styleable.CountDownView_CountDownTextColor, Color.BLACK);
            bgColor = typedArray.getColor(R.styleable.CountDownView_CountDownBgColor, Color.WHITE);
            //释放
            typedArray.recycle();
        } else {
            time = 3;
            radius = 30;
            textColor = Color.BLACK;
            bgColor = Color.WHITE;
        }

        //初始化画笔
        paint = new Paint();
        paint.setStyle(Paint.Style.STROKE);
        paint.setColor(bgColor);
        paint.setAntiAlias(true);
        paint.setStrokeWidth(2);

    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        cx = w / 2;
        cy = h / 2;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        //画圆形
        Path path = new Path();
        path.addCircle(cx, cy, radius, Path.Direction.CW);
        canvas.drawPath(path, paint);

        //绘制文字
        paint.setColor(textColor);
        paint.setTextSize(18);
        paint.setTextAlign(Paint.Align.CENTER);
        canvas.drawText("" + time, cx, cy, paint);

    }

    /**
     * 设置倒计时时间
     *
     * @param time
     */
    public void setTime(int time) {
        this.time = time;
        //TODO 刷新页面
        invalidate();
    }

    /**
     * 启动倒计时
     *
     * @param cur
     * @param next
     */
    public void start(final Activity cur, final Class<?> next) {
        //定义Handler
        handler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                //TODO 结束条件
                if (time == 0) {
                    //跳转到MainActivity
                    Intent intent = new Intent(cur, next);
                    cur.startActivity(intent);
                    cur.finish();
                } else {
                    time--;//倒计时
                    setTime(time); //刷新页面
                    sendEmptyMessageDelayed(1, 1000);//下一秒
                }
            }
        };


        //开始倒计时
        handler.sendEmptyMessageDelayed(1, 1000);

    }

    /**
     * 停止倒计时
     */
    public void stop() {
        if (handler != null) {
            handler.removeCallbacksAndMessages(null);
        }
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            if (listener != null) {
                listener.onClick(this);
            }
        }
        return super.onTouchEvent(event);
    }

    public void setListener(MyListener listener) {
        this.listener = listener;
    }

    //    设置点击事件
    public interface MyListener {
        void onClick(View view);
    }


}


android 自定义圆形倒计时控件时间递减显示 详情http://blog.youkuaiyun.com/jpxzqs/article/details/52439741 立即下载

相关推荐

Android 自定义View之倒计时实例代码

Android 自定义View之倒计时实例代码 需求: 大多数app在注册的时候,都有一个获取验证码的按钮,点击后,访问接口,最终用户会收到短信验证码。为了不多次写这个获取验证码的接口,下面将它自定义成一个view,方便使用。 分析一下,这是一个TextView,点击的时候变色,不能再点击,同时里面的倒计时开始显示。那么就有了下面的代码 代码: /** * 通过selector选择器来改变背景,其中倒计时运行时为android:state_enabled=true, * 不显示倒计时时为android:state_enabled=false; * */ public clas

CountdownView倒计时

一、CountdownView简介: CountdownView是Android中第三方的倒计时秒杀控件,在商城购物相关软件秒杀和倒计时中经常用 到,它可以在ListView和RecyclerView中显示秒杀倒计时,滑动时候并且时间不会错乱,且性能良好 二、常用布局文件和样式 android:id="@+id/cv_countdownViewTest1"

超大神的博客 1971

iOS安全攻防:从DarkSword漏洞利用链剖析到纵深防御实践

在移动安全领域,内存破坏漏洞(如堆溢出、释放后使用)是攻击者突破系统防线、实现远程代码执行和权限提升的核心技术原理。这些漏洞利用技术通过精心构造的攻击链,能够绕过沙箱、地址空间布局随机化等安全机制,最终威胁设备内核安全,其技术价值在于揭示了系统安全架构的潜在薄弱环节。在iOS应用开发与系统防护中,理解此类攻击链对于构建有效的纵深防御体系至关重要。应用场景涵盖从安全编码、网络通信加固到运行时应用程序自保护等多个层面。本文以DarkSword工具包为例,深入拆解其利用链,并分享如何通过内存安全实践、代码签名强化

weixin_30357231的博客 481

深度剖析之 CountdownView

剖析项目名称: CountdownView 剖析原项目地址:https://github.com/iwgang/CountdownView 剖析理由:只知其然而不知其所以然,如此不好。想要快速的进阶,不走寻常路,剖析开源项目,深入理解扩展知识,仅仅这样还不够,还需要如此:左手爱哥的设计模式,右手重构改善既有设计,如此漫长打坐,回过头再看来时的路,书已成山,相信翔哥说的,量变引起质变。在不久前做

AnalyzeSystem的博客 7912

SIMPLIS实战:从零构建理想BUCK电路,精准计算与POP稳态分析

本文详细介绍了如何使用SIMPLIS软件从零开始构建并仿真一个理想的BUCK降压电路。通过设定关键参数、计算理想器件值,并搭建仿真模型,文章重点演示了暂态仿真以观察电路上电过程,并深入讲解了高效的POP(周期性工作点)稳态分析技术,帮助工程师快速验证设计、评估稳态性能,从而加速电源设计迭代。

weixin_29165465的博客 396

保姆级教程:用ArcGIS Pro搞定云南30米分辨率DEM地形图(附数据下载与配色方案)

本文提供了一份详细的ArcGIS Pro教程,指导用户如何制作云南30米分辨率DEM地形图。从数据下载、预处理到镶嵌与质量控制,再到地形分析与可视化,全流程覆盖云南复杂地形的处理要点。特别包含数据下载链接、配色方案及常见问题解决方案,适合地理信息分析新手和专业人士。

weixin_30467199的博客 309

Android倒计时控件 CountdownView

中文 CountdownView Android countdown view,use canvas draw,supports multiple styles Download demo apk Screenshot Gradle compile 'com.github.iwgang:countdownview:2.1.6' Code CountdownV...

qq_36507831的博客 2814

5种隐藏代码到图片的实用技巧:从Notepad++到Linux命令全解析

本文详细解析了5种将代码或文本隐藏到图片中的实用数据隐写技巧。从Notepad++尾部追加、Windows命令行合并,到编辑图像元数据、使用十六进制编辑器,再到Linux的cat/dd命令,全面覆盖了从图形界面到命令行的工程化实践方法,帮助开发者和安全研究人员掌握隐蔽信息传输与存储的核心技术。

hh234的博客 353

自定义view_画圆倒计时

1:布局&lt;com.liqy.zhoukao1.view.CountDownView        android:id="@+id/downText"        android:layout_width="65dp"        android:layout_margin="8dp"        android:layout_alignParentRight="true"      ...

weixin_42493753的博客 248

YOLOv8环境搭建+训练自己的数据详细项目

直接按照路径会有问题,找到自己 requirements.txt 文件路径,我这里是pip install -r D:\ultralytics-main\ultralytics-main\requirements.txt。首先去自己的anaconda的安装的envs(虚拟环境),在导航栏输入cmd,进入命令窗口。到官方网站下载yolo模型 ,下载好后解压,里面有个文件requirements.txt。然后安装ultralytics ,这是必须的。

m0_63172128的博客 2万+

面向业务角色的 SAP Fiori Space 与 Page 创建全流程实战指南

业务角色导航设计:从Space与Page规划到实施 摘要:本文探讨了SAP S/4HANA Cloud和BTP ABAP环境中基于业务角色的导航设计方法。传统Fiori Launchpad的Group+Tile模式存在应用堆积问题,而新的Space与Page模型将导航按工作领域(如应付会计、销售代表)组织,每个Space包含多个任务导向的Page。文章详细介绍了从业务角色建模到Space/Page创建、分配的完整流程,包括核心概念解析、规划思路和具体操作步骤。重点阐述了如何根据业务需求选择创建方式(基于预交

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 183

android 自定义View--漂亮的倒计时功能CountDownView

最近在mooc网上看了一个课程---网页前端html5中的利用canvas机制制作出了一个灿烂的倒计时效果,一时兴起仿着在android上也做了一个类似效果的自定义View  ,因为只是出于兴趣,没有考虑到实际需求中的接口,这个只能算是一个半成品,仅仅实现了倒计时的效果,各位可自行根据需求编写合适的接口,先送上效果图:

LebronRan的专栏 2492

QQ也能连接OpenClaw啦!手机QQ远程操控本地AI保姆级教程

2026年最新OpenClaw与QQ连接教程发布,支持手机远程操控本地AI。腾讯官方推出QQ Bot插件,无需服务器即可实现三步绑定。教程提供三种连接方案:新手首选的扫码连接(10分钟搞定)、稳定的QQ群机器人方案,以及公网接入方案。详细步骤包括版本更新、插件安装、扫码绑定和功能测试,并附常见问题解决方案。该功能让用户通过QQ指令即可实现文件整理、文档生成等电脑操作,真正实现"手机发指令,电脑自动干"。

通俗易懂学IT 592

自定义View画圆跳转

public class CountDownView extends View{ Paint paint; int time; float radius; int textColor; int bgColor; Handler handler; int cx,cy; public CountDownView(Context contex...

qq_41636756的博客 230

冠层分析法提取叶面积指数及其应用

冠层分析法是利用植物冠层空间结构分析LAI的方法。其基本原理是通过相机或扫描仪对植物冠层垂直方向的照片或图像进行获取,再运用图像处理方法实现植被的自动识别和覆盖度计算,以此推算LAI。假设有一块田地,需测量其LAI,首先在田地中央设置一杆高度为3米、朝向田地中心、覆盖角度为50度的相机。利用上述函数,对相机采集到的图像进行处理,即可得到田地的LAI。在Matlab中,读取图片可以使用imread函数,对图片进行预处理可以使用imadjust函数调整灰度,使用imbinarize函数进行二值化处理。

m0_47037246的博客 739

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

倒计时

package com.example.monizk.view; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics...

MessageFang的博客 391

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Hack Club硬件编程进阶:七段数码管与伺服电机控制技术

Hack Club硬件编程进阶教程将带领你探索七段数码管与伺服电机的核心控制技术,通过Arduino平台实现从基础显示到物联网控制的完整项目。无论是电子骰子还是远程电机控制,这些实用技能将帮助你构建更复杂的硬件交互系统。 ## 硬件编程基础:认识核心组件 在开始项目前,让我们先熟悉两种关键硬件组件的工作原理和应用场景。这些组件是许多嵌入式系统和物联网设备的基础构建模块。 ### 七段数码管:

gitblog_01167的博客 399

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Bit v2.0.11 版本发布详解:非交互式导入、TypeScript 6 工具链与 CI 车道同步修复

本篇文章基于开源 Bit 仓库的 [v2.0.11 版本发布说明](https://link.gitcode.com/i/a7e5c523a3aba839935bd1342c17eb86) 展开,围绕该版本的核心变化:新增 `bit import --write-to-empty-dir` 非交互式导入能力、核心环境(core environments)向 TypeScript 6 工具链的整体迁

gitblog_00298的博客 364

CountDownView 开源项目教程

CountDownView 开源项目教程 项目介绍 CountDownView 是一个为 Android 框架设计的简单倒计时视图。它允许开发者在其应用中实现一个带有小时、分钟和秒的倒计时功能。该项目托管在 GitHub 上,遵循 MIT 许可证。 项目快速启动 添加依赖 首先,在你的项目的 build.gradle 文件中添加 JitPack 仓库: allprojects { repo...

gitblog_00849的博客 446

Android 倒计时控件

使用Android CountDownTimer 实现倒计时功能 在Android应用开发当中,我们常常会遇到获取验证码的需求,为了避免出现频繁获取验证码导致服务器资源浪费的情况,则需要在点击获取验证码后实现倒计时的功能。下面就介绍一种简单的实现方法给大家: 重写CountDownTimer类 import android.os.CountDownTimer; public clas...

QHZ742236498的专栏 817

CountdownView

CountdownView倒计时控件

Errol's Blog 540

Android 自定义View之倒计时

开发过程中会遇见很多app注册时,需要通过手机发送验证码验证 ,这是可以封装一个验证码按钮: attrs.xml &amp;amp;amp;lt;?xml version=&amp;amp;quot;1.0&amp;amp;quot; encoding=&amp;amp;quot;utf-8&amp;amp;quot;?&amp;amp;amp;gt; &amp;amp;amp;lt;resources&amp;amp;amp;gt

xiangxiongfly 1215

推荐项目:CountDownView —— 简约高效的倒计时视图

推荐项目:CountDownView —— 简约高效的倒计时视图 在应用开发的世界里,细节往往决定体验的优劣。今天,我们要向您隆重推荐一款简单而强大的开源组件——CountDownView。这款由开发者alexfu精心打造的倒计时视图,以其直观的设计和灵活的应用性,为您的Android应用增添了时间流逝的紧迫感与互动魅力。 项目介绍 CountDownView,正如其名,是一个轻量级的视图控件,能...

gitblog_00345的博客 501

Android 启动页,倒计时 view

Android 启动页,倒计时 view

未来很长,但我会努力的走下去。 2123

Splitting.js插件开发指南:从零构建自定义文本分割模块

Splitting.js是一款轻量级JavaScript库,专注于将元素按单词、字符、子元素等方式分割,并通过CSS变量提供丰富的样式控制能力。本指南将带您从零开始了解如何开发自定义文本分割模块,掌握Splitting.js的核心插件机制。 ## 一、Splitting.js核心工作原理 Splitting.js的核心功能集中在[src/core/splitting.js](https://l

gitblog_00071的博客 576

开源项目CountDownView指南及常见问题解答

开源项目CountDownView指南及常见问题解答 项目基础介绍 CountDownView是一个简单的Android倒计时视图库,由开发者alexfu维护。此项目基于MIT许可协议发布,提供了一个直观易用的UI组件,能够显示小时、分钟和秒的倒计时。项目核心功能在于创建一个可定制的倒计时体验,非常适合用于应用中的限时活动展示或计时器功能。 **主要编程语言:**Java 新手使用注意事项及解决步...

gitblog_00144的博客 749
上一篇: 横向标题滑动和频道管理
下一篇: MVP模式
Android_ZMY
博客等级 码龄8年 2粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值