当前位置: 首页 > news >正文

Android 自己定义View学习(2)

上一篇学习了基本使用方法,今天学一下略微复杂一点的。先看一下效果图

为了完毕上面的效果还是要用到上一期开头的四步


1,属性应该要有颜色,要有速度

<?xml version="1.0" encoding="utf-8"?>
<resources>

    <attr name="speed" format="integer" />
    <attr name="circleColor" format="color" />

    <declare-styleable name="ViewCircle">
        <attr name="speed" />
        <attr name="circleColor" />
    </declare-styleable>

</resources>
假设对这里有什么不了解能够看我上一篇Android 自己定义View学习(1)


2, 在构造方法中获得这些属性

	TypedArray a = context.obtainStyledAttributes(attrs,
				R.styleable.ViewCircle, defStyle, 0);
		int n = a.getIndexCount();
		for (int i = 0; i < n; i++) {
			int attr = a.getIndex(i);
			switch (attr) {
			case R.styleable.ViewCircle_speed:
				mSpeed = a.getInteger(attr, 300);
				break;
			case R.styleable.ViewCircle_circleColor:
				mColor = a.getColor(attr, Color.GREEN);
				break;
			}
		}
		a.recycle();

3,这次我们不重写 onMeasure


4,重写onDraw


protected void onDraw(Canvas canvas) {
		// 居中
		canvas.translate(getWidth() / 2, getHeight() / 2);
		// 画出三个圆
		canvas.drawCircle(0, 0, 200, mCircle);
		canvas.drawCircle(0, 0, 180, mCentreCircle);
		canvas.drawCircle(0, 0, 160, mNexCircle);
        //进度
		RectF rectF = new RectF(-180, -180, 180, 180);
		canvas.drawArc(rectF, -90, mProgress, true, mTimer);
        //算出字体所占大小,使其居中
		mLinePaint.getTextBounds(String.valueOf(mProgress), 0,
				String.valueOf(mProgress).length(), rect);
		canvas.drawText(String.valueOf(mProgress), -rect.width() / 2, 0,
				mLinePaint);
		//总进度为六十
		int count = 60;
		//刻度从190--200
		int y = 190;
		Rect rect = new Rect();
		mLinePaint.getTextBounds("00", 0, "00".length(), rect);
		//当i%10==0时画一道刻度线
		for (int i = 0; i < count; i++) {
			if (i % 10 == 0) {
				canvas.drawLine(0, y, 0, 200, mLinePaint);
				canvas.drawText(String.valueOf(i / 10) + "0",
						-rect.width() / 2, 220, mLinePaint);
			}
			canvas.rotate(360 / count, 0, 0);
		}
	}
我们注意一下canvas.drawArc(rectF, -90, mProgress, true, mTimer);

我们传进去的为true效果就是



假设我们传进去false




能够明显的看到区别,没事也能够试试我们这个demo传进去false会是什么效果。


接下来为了让这个进度动起来我们就要用到线程来刷新ui

new Thread() {
			public void run() {
				while (true) {
					mProgress++;
					if (mProgress == 360) {
						mProgress = 0;
					}

					postInvalidate();
					try {
						Thread.sleep(mSpeed);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			};
		}.start();

这样基本就差点儿相同了。

接下来看看终于效果



项目源代码




相关文章:

  • redis订阅/发布 分享
  • 红与黑
  • 读取Web.Config中的设置参数之二
  • 自学有感7
  • Http之Get/Post请求区别
  • 清河好程序猿训练营是什么?
  • 分享:Ajax工具文件
  • 洛谷P1287 盒子与球 数学
  • 识别地图上的地名-- 笔记一
  • 如何破解来自私有云的安全挑战
  • SQL优化34条[转载]
  • 你的每行代码值多少钱?
  • 日常开发工作快照(一)
  • Catalog Service - 解析微软微服务架构eShopOnContainers(三)
  • 2008-08-23
  • 时间复杂度分析经典问题——最大子序列和
  • Effective Java 笔记(一)
  • Git 使用集
  • java取消线程实例
  • LeetCode18.四数之和 JavaScript
  • OSS Web直传 (文件图片)
  • Python爬虫--- 1.3 BS4库的解析器
  • Spring Cloud Feign的两种使用姿势
  • uva 10370 Above Average
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • windows-nginx-https-本地配置
  • WordPress 获取当前文章下的所有附件/获取指定ID文章的附件(图片、文件、视频)...
  • 对JS继承的一点思考
  • 基于 Ueditor 的现代化编辑器 Neditor 1.5.4 发布
  • 前端
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 新书推荐|Windows黑客编程技术详解
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • - 语言经验 - 《c++的高性能内存管理库tcmalloc和jemalloc》
  • 原生js练习题---第五课
  • 在 Chrome DevTools 中调试 JavaScript 入门
  • nb
  • 支付宝花15年解决的这个问题,顶得上做出十个支付宝 ...
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • #QT(一种朴素的计算器实现方法)
  • #微信小程序(布局、渲染层基础知识)
  • (31)对象的克隆
  • (4)事件处理——(6)给.ready()回调函数传递一个参数(Passing an argument to the .ready() callback)...
  • (C++17) optional的使用
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (安卓)跳转应用市场APP详情页的方式
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (十一)手动添加用户和文件的特殊权限
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • **CI中自动类加载的用法总结
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .bat批处理(四):路径相关%cd%和%~dp0的区别