我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android利用SurfaceView实现简单计时器

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Android利用SurfaceView实现简单计时器

自学了android有几个月了,跟着网上的节奏,应该早点写些博客来提高自己的水准的。但苦于技术水准始终不自信(也是不过关的结果吧),就一直只是将自己学习过程中的问题和重要的知识点写在自己的笔记文档中。

但,总感觉一个人写下来成就感还是欠缺了那么一些,而且有些问题及解答方法抛出来,是有可能得到更多好的反馈及解决方案的。于是,本着不作不会死的心态,一步一步在技术成长的道路前行——>这篇博客就是其中一步!

若博客中有些技术知识点有误或者有更优化的解答方案,还望各位小伙伴多多指出。

以下是正题了:

目标:利用SurfaceView实现一个简单的计时器

图示:

描述:1.利用SurfaceView来实现计时功能,同时不断将圆弧画满;2.点击按钮可以停止计时;

重点:

1.自定义SurfaceView中针对SurfaceHolder.CallBack的三个方法进行覆写;

2.通过surfaceHolder.lockCanvas()在新开的线程中得到canvas对象,从而进行图形和时间文字的绘制;

3.通过设置flag值,从而控制在线程run()方法中逻辑代码的执行;

重要部分代码:


public TestView(Context context) { 
  super(context); 
  surfaceHolder = getHolder(); 
  surfaceHolder.addCallback(this); 
  countThread = new CountThread(surfaceHolder); 
} 
public TestView(Context context, AttributeSet attributeSet) { 
  super(context, attributeSet); 
  surfaceHolder = getHolder(); 
  surfaceHolder.addCallback(this); 
  countThread = new CountThread(surfaceHolder); 
} 

以上为自定义的SurfaceView(TestView)的构造函数,做相应的初始化工作。(第二个构造方法在实现过程中没有覆写,导致如果是通过布局文件引入进Activity中时,则显示不出View——>也就是一般自定义View一定要覆写的构造方法)。
在构造方法中初始化了自定义的内部线程类CountThread,用来执行绘制工作。

以下为CountThread类的run()方法执行逻辑:


@Override 
    public void run() { 
      Canvas canvas = null; 
      int pivotX = getResources().getDisplayMetrics().widthPixels / 2; 
      RectF rectF = new RectF(pivotX - 300, pivotX - 300, pivotX + 300, pivotX + 300); 
      while (!isStop) { 
        try { 
          canvas = surfaceHolder.lockCanvas(); 
          canvas.drawColor(Color.WHITE);//设置画布背景为白色 
//          canvas.drawRoundRect(300, 300, 600, 600, 150, 150, paint);//直接使用该行代码来画圆是行不通的,因为这个方法要求版本21,我的手机运行android版本是19 
          canvas.drawArc(rectF, -90, endAngle++, false, paint);//-90在这里不等于270,所以要想从最上方开始画弧,就得用-90 
          canvas.drawText(countTime(endAngle), pivotX, pivotX, paintText);//显示计算的时间 
          Thread.sleep(1000); 
        } catch (Exception e) { 
          e.printStackTrace(); 
        } finally { 
          if (canvas != null) {//需要对canvas进行非空判断 
            surfaceHolder.unlockCanvasAndPost(canvas); 
          } 
        } 
      } 
    } 

主要就是通过Thread.sleep(1000)来停顿一秒,从而通过endAngle来计数。

至此,基本的程序逻辑已经实现。再讲该自定义View引入进Activity指定的layout布局文件中即可进行显示。

但,这其中也会涉及到相应的问题。譬如:

1.图示中的按钮无法显示出来,只能看到自定义的SurfaceView的视图;

我的做法是:将布局设定为FrameLayout即可。因为SurfaceView是浮在窗口的一层,那么就可以把它看做一个图层。

2.java.lang.IllegalThreadStateException:Thread already started

该错误表明,线程已经存在了。这种错误的操作重现是:按下home键或者menu键会导致该自定的SurfaceView销毁,但线程并没有被销毁,再次启动该自定义SurfaceView的时候又去重新启动该线程。解决的方法是:


@Override 
public void surfaceCreated(SurfaceHolder holder) { 
  if (!countThread.isAlive()) {//如果线程不存在,则启动线程——>当应用挂起的时候Thread是存在的,如果不做这个判断,会报“Thread already started ”错误 
    countThread.start();//SurfaceView创建时开启线程 
  } 
} 

在surfaceCreated()方法中对该线程是否是在存活中进行判断。

当然,这里面还有最重要的一个问题:

当按下home键或者menu键时,程序是没有在计时的。那么这种情况下,我的一个解决方案是,通过开启一个service来接收程序停止( onStop() )时已经计时的数值,然后传递给service记下并计时,当应用程序界面重新回归屏幕时( onRestart() )则将数据取出并回传到自定义的SurfaceView的逻辑run()方法中继续计时。

整个小程序的代码可以通过以下链接下载:

点击进入下载页面:http://xiazai.jb51.net/201701/yuanma/AndroidSurfaceView(jb51.net).rar

您可能感兴趣的文章:android之计时器(Chronometer)的使用以及常用的方法android计时器,时间计算器的实现方法android开发教程之间隔执行程序(android计时器)Android 编程下的计时器代码Android时分秒计时器的两种实现方法Android编程之简单计时器实现方法Android中CountDownTimer倒计时器用法实例Android实现的秒表计时器示例Android Wear计时器开发学习使用Android Chronometer计时器


免责声明:

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

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

Android利用SurfaceView实现简单计时器

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android利用SurfaceView实现简单计时器

自学了android有几个月了,跟着网上的节奏,应该早点写些博客来提高自己的水准的。但苦于技术水准始终不自信(也是不过关的结果吧),就一直只是将自己学习过程中的问题和重要的知识点写在自己的笔记文档中。 但,总感觉一个人写下来成就感还是欠缺了
2022-06-06

Android中SurfaceView用法简单实例

本文实例讲述了Android中SurfaceView用法。分享给大家供大家参考,具体如下: 这里贴上一个小程序代码,主要运用SurfaceView来实现在屏幕上画一个圆,你可以通过按方向键和触摸屏幕来改变圆的位置 代码: Activity:
2022-06-06

利用Android实现一个简单的计算器功能

今天就跟大家聊聊有关利用Android实现一个简单的计算器功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。 安卓计算器Android calculatorpackage
2023-05-31

Android 简单实现倒计时功能

在 Android 中倒计时功能是比较常用的一个功能,比如短信验证码,付款倒计时等。实现方式有Handler、Thread 等,但是实现起来都有点麻烦,其实Android已经为我们封装好了一个抽象类 CountDownTimer,可以简单的
2022-06-06

Android编程之简单计时器实现方法

本文实例讲述了Android编程之简单计时器实现方法。分享给大家供大家参考,具体如下: 这里利用ContextMenu(上下文菜单),Chronometer实现简单计数器。 Main.xml:
2022-06-06

Android studio实现简单计算器

本文实例为大家分享了Android studio实现简单计算器的具体代码,供大家参考,具体内容如下 需求分析 在Android studio中设计并实现一个简单的计算器,实现连续的加减乘除运算。 界面设计 采用网格GridLayout布局,
2022-06-06

Android实现简单加法计算器

本文实例为大家分享了Android实现简单加法计算器的具体代码,供大家参考,具体内容如下package com.example.calculator; import android.os.Bundle; import android.app
2022-06-06

android计算器简单实现代码

本文实例为大家分享了android计算器的具体实现代码,供大家参考,具体内容如下java代码:package com.itheima74.simplecalculator4; import android.os.Bundle; import
2022-06-06

简单实现Android计算器功能

自己写的安卓的计算器: 注:这个是在mac中开发的,如果要在windows的eclipse中运行可能会出现路径问题,解决办法从windows中已有的安卓工程根目录下复制一下classpath文件,然后复制粘贴覆盖掉这个工程根目录里面的路径文
2022-06-06

Android Studio实现简单计算器APP

一、简介:用Android Studio 实现一个简单的计算器APP,并在蓝叠模拟器中运行。 该计算器只能实现两位数字的四则运算。 二、代码 activity_main.xml ---界面设计
2022-06-06

怎么用Python实现简单的计时器

这篇文章主要介绍“怎么用Python实现简单的计时器”,在日常操作中,相信很多人在怎么用Python实现简单的计时器问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Python实现简单的计时器”的疑惑有所
2023-06-20

Android Studio实现简单计算器功能

本文实例为大家分享了Android Studio实现简单计算器功能的具体代码,供大家参考,具体内容如下 程序步骤: (1)在布局文件定义一些计算器界面的文本框,按钮等组件。 (2)在Activity中获取组件实例。 (3)通过swtich函
2022-06-06

JS实现简单网页倒计时器

这篇文章主要为大家详细介绍了JS实现简单网页倒计时器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
2022-11-13

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录