Android自定义View --- 绘制圆环

2023-10-29

Android自定义View实现很简单

继承View,重写构造函数、onDraw,(onMeasure)等函数。

如果自定义的View需要有自定义的属性,需要在values下建立attrs.xml。在其中定义你的属性。

在使用到自定义View的xml布局文件中需要加入xmlns:前缀="http://schemas.android.com/apk/res/你的自定义View所在的包路径".

在使用自定义属性的时候,使用前缀:属性名,如my:textColor="#FFFFFFF"。

例子:

package com.cn.myvdun;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;

public class RingView extends View {

	private final  Paint paint;
	private final Context context;
	
	public RingView(Context context) {
		
		// TODO Auto-generated constructor stub
		this(context, null);
	}

	public RingView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		this.context = context;
		this.paint = new Paint();
		this.paint.setAntiAlias(true); //消除锯齿
		this.paint.setStyle(Paint.Style.STROKE); //绘制空心圆 
	}

	@Override
	protected void onDraw(Canvas canvas) {
		// TODO Auto-generated method stub
		int center = getWidth()/2;
		int innerCircle = dip2px(context, 83); //设置内圆半径
		int ringWidth = dip2px(context, 5); //设置圆环宽度
		
		//绘制内圆
		this.paint.setARGB(155, 167, 190, 206);
		this.paint.setStrokeWidth(2);
		canvas.drawCircle(center,center, innerCircle, this.paint);
		
		//绘制圆环
		this.paint.setARGB(255, 212 ,225, 233);
		this.paint.setStrokeWidth(ringWidth);
		canvas.drawCircle(center,center, innerCircle+1+ringWidth/2, this.paint);
		
		//绘制外圆
		this.paint.setARGB(155, 167, 190, 206);
		this.paint.setStrokeWidth(2);
		canvas.drawCircle(center,center, innerCircle+ringWidth, this.paint);

		
		super.onDraw(canvas);
	}
	
	
	/**
	 * 根据手机的分辨率从 dp 的单位 转成为 px(像素)
	 */
	public static int dip2px(Context context, float dpValue) {
		final float scale = context.getResources().getDisplayMetrics().density;
		return (int) (dpValue * scale + 0.5f);
	}
}

布局文件:

<com.cn.myvdun.RingView
                    	android:layout_width="@dimen/ring_view_width"
           		android:layout_height="@dimen/ring_view_height" 
 >


参考的代码:

自定义view



本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android自定义View --- 绘制圆环 的相关文章

  • 如何制作像 Google+ 应用程序中那样的气泡? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 有谁知道如何使用 Google An
  • Android ToggleButton 始终检查

    如果切换按钮处于选中或取消选中状态 我想存储在 SharedPreferences 中 toggle setOnCheckedChangeListener new OnCheckedChangeListener public void on
  • Android中将JSON数据存储到本地数据库

    好的 我创建了一个应用程序 它使用 JSON 从我的服务器检索数据 现在我想将检索到的数据存储在手机的本地存储 数据库中 我该怎么做 我是android编程新手 这是我从服务器收到的 JSON messages id 44 issender
  • 如何在 Android 应用程序中隐藏 Flutterwave API 密钥

    我正在构建一个 Android 应用程序 目前正在将 Flutterwave 集成到我的应用程序中以进行支付 建议我永远不要将 Flutterwave API 密钥放在我的应用程序上 那么我该如何隐藏这些键呢 我正在使用 Retrofit
  • 无法在 Android Studio 中导出签名的 APK

    当我使用keytool list keystore path to keyfile jks并提供我的密码 我可以看到那里的条目 但是当我在尝试使用相同的密码生成签名的 APK 时使用相同的密码时 我收到错误 无法加载密钥库 密钥库被篡改 或
  • 蓝牙 BLE Android 以最大吞吐量写入外设

    我们公司开发了一个具有蓝牙 BLE 的硬件单元 并且我们在 Nexus 7 2013 中有一个服务应用程序 我们希望使用它向该单元发送固件文件 文件最大可达 500kb BT芯片是德州仪器CC2540 我浏览了大量的页面 并扫描了 Stac
  • VOIP通话录音

    我正在开发一个在 android 中录制 VOIP 通话的项目 我没有找到任何解决方案 有很多应用程序支持手机上的 VOIP 录音 我找不到任何教程和帮助 立方体通话记录器 https play google com store apps
  • CoordinatorLayout 和 ImageView 在滚动时调整宽度的问题

    我正在尝试放置一个ImageView in a CollapsingToolbarLayout它在加载时占据整个屏幕 并且当您滚动内容时 16x9 分辨率图像宽度会调整大小 直到图像占据屏幕的整个宽度 那时 我希望图像具有视差app lay
  • 使用 OkHttp 下载损坏的文件

    我编写的下载文件的方法总是会产生损坏的文件 public static String okDownloadToFileSync final String link final String fileName final boolean te
  • Android L,使用 joda.time 库的异常

    该应用程序适用于所有设备 包括 nexus 5 和 nexus 7 在 Android L 预览版上运行相同的应用程序时 应用程序崩溃了 我一直在调试 并且调用 DateTime 构造函数发现了异常 public static String
  • 在光标所在行强制关闭!

    嘿 我正在尝试创建一个应用程序来查找存储在 SQlite 数据库中的 GPS 数据 但我面临一个问题 我构建了一个 DbAdapter 类来创建数据库 现在我尝试使用以下函数从另一个类获取所有数据上的光标 public Cursor fet
  • 在 Android 中加密/解密字符串的简单方法

    我的问题是如何加密String String AndroidId Override public void onCreate Bundle savedInstanceState super onCreate savedInstanceSta
  • 如何在 60 分钟后删除共享首选项

    我想存储登录数据 但希望在 60 分钟后删除该数据 执行此操作的正确方法是什么 在这 60 分钟内可以关闭 停止 打开应用程序 我不想使用内部数据库 这是我的访问代码SharedPreferences sharedpreferences g
  • 如何将 JSON 数据从 Android 发送到 php url?

    我想将登录信息从我的应用程序发送到 php url 因为这我的应用程序将崩溃 任何人都可以帮助我解决这个问题 这是我的服务器登录方法 我想将数据发送到此登录方法 Method public method login Parameters 3
  • Expresso 的 Android 测试首选项片段

    我在通过 Expresso 测试我的代码时遇到问题 我写了这段代码 public class SettingsActivity extends Activity Override protected void onCreate Bundle
  • 以 HTML 格式发送电子邮件

    我想发送 HTML 格式的电子邮件 如下图所示 我怎样才能做到这一点 请帮我 提前致谢 String body new String table tr td br header td tr br br Get b Best Score b
  • 用于请求带有临时缓存的远程 Observable 的 RxJava 模式

    用例是这样的 我想暂时缓存最新发出的昂贵的Observable响应 但在它过期后 返回到昂贵的源Observable并再次缓存它 等等 一个非常基本的网络缓存场景 但我真的很难让它工作 private Observable
  • 调试android数据绑定?

    谁能告诉我如何调试或找到数据绑定生成的代码 从this https www youtube com watch v NBbeQMOcnZ0链接我发现它生成了所需的代码 我猜您正在寻找自动生成的绑定 java 文件 我也在寻找他们 最后我在这
  • Android AppWidgetManager 方法 updateAppWidget 无法设置意图、加载数据。而且它是随机发生的

    我的小部件由 2 个按钮和一个显示数据的列表视图组成 大多数时候 当调用小部件提供程序的 onUpdate 方法时 一切都会正常加载 每个人都很高兴 但是我注意到有时在调用更新方法后 小部件完全无法加载其数据 列表视图为空 所有按钮均无响应
  • 在数组列表中过滤 Filterable 不取消之前的过滤

    我看过过滤器方法文档 其中显示调用过滤器会取消所有先前未执行的过滤请求 并发布一个稍后将执行的新过滤请求 但我收到的实际回调有些不同 在我的实现中 它不会取消先前的过滤器请求并调用publishResults 最近一次搜索条件后的上一次搜索

随机推荐

  • Matlab 归一化(normalization)/标准化 (standarization)

    数据规范中的归一化与标准化 A 归一化 vs 标准化 归一化 要把你需要处理的数据经过处理后 通过某种算法 限制在你需要的一定范围内 首先归一化是为了后面数据处理的方便 其次是保正程序运行时收敛加快 一般指将数据限制在 0 1 之间 把数变
  • 2020年计算机、信安推免总结

    这里写自定义目录标题 个人情况 夏令营 浙软和南软 四川大学网络空间安全学院 湖南大学信科院 西工大软件学院 北京交通大学软件学院 预推免 中科院网络信息中心 浙江大学软件学院 天津大学智算学部 华中科技大学网络空间安全学院 东南大学网络空
  • 添加votedisk

    1 添加votedisk 必须有一半以上的votedisk同时可用 clusterware才能正常工作 否则cluster立刻宕掉 所以最好votedisk保持单数个 添加和删除votedisk的操作非常危险 必须在停止数据库 停止asm
  • Unity3D暂停,继续游戏,重新开始,退出,以及 UnityEditor.EditorApplication打包后不会执行

    1 暂停游戏 Time timescale 0 2 继续游戏 Time timescale 1 3 重新开始 using UnityEngine SceneManagement SceneManager LoadScene 0 其中 0 为
  • Python 中的<>和!= 区别

    今天在编写Python MySQL 采集脚本过程中 需要使用到 不等于 表达方式 第一种写法 在Python2 6以前版本 不等于 if string atof func get item mysql status Qcache hits
  • C++/C++11中头文件algorithm的使用

  • Ubuntu20.04 操作系统切换中文 & 安装中文输入法

    网上有很多的帖子指导如何安装搜狗输入法 我也尝试过 需要安装一些指令 解决依赖很麻烦 很消耗精力 也找不到简便的办法 因此还是用系统自带的输入法吧 一 换源 这一步很重要 系统下载输入法时 能够从阿里云服务器下载大大提升速度 具体请参考拙作
  • 中国数字经济发展指数报告(2023年)

    报告 显示 数字经济具有高度发展驱动性 各地区数字经济发展指数与地区综合经济实力具有高度正相关性 数字经济对于促进地区经济发展的驱动能力强劲 关注公众号 互联互通社区 回复 SZJJ396 获取全部报告内容 从总指数结果来看 我国数字经济呈
  • DDR3相关概念

    1 BL8 突发长度 理解一下概念 突发传输 在通信领域中一般指在短时间内进行相对高带宽的数据传输 Burst 突发 是指在同一行中相邻的存储单元连续进行数据传输的方式 BL突发长度 连续传输的周期数就是突发长度 在突发传输的模式下 多个数
  • tcp长连接的双向加密

    一 历史和基础 做即时通讯项目 网游登录等业务时 我们通常需要一种能在线回推的机制 这时候客户端的tcp长连接就可能派上用场了 示意图 二 问题产生 曾经做过一个项目 之前老的加密方案为 1 客户端发一个rsa公钥G1给服务端 明文 自己留
  • PaddleOCR详解和识别图片中文字

    前言 paddleocr可以说是最近ocr的主 军 家对于paddleocr的认可度是相当的 特别是最近推出的轻量级模型 可以识别近80种语 并且效率是这三种ocr工具种最 的 相同的图 paddleocr只需要2秒左右 对于多场景的 语种
  • 计算机键盘字母记忆,键盘26个字母口诀是怎样的?

    01 七 Q 碗 W 鹅 E 肉 R 汤 T 已 Y 无 W 一 Y 我 W 婆 P 爱 A 死 S 豆 D 腐 F 羹 G 回 H 家 J 快 K 乐 L 自 Z 行 X 车 C 未 V 帮 B 你 N 买 M 众所周知 计算机键盘字母是
  • MongoDB3.0+ 添加用户命令

    关键命令 db createUser user coolead pwd coolead roles role dbOwner db mycoolead C Program Files MongoDB Server 3 2 bin gt mo
  • matlabe基于残差学习的图像去噪_《利用组稀疏残差约束进行图像去噪》

    题目 利用组稀疏残差约束进行图像去噪 来源 Zha Z Liu X Zhou Z et al Image denoising via group sparsity residual constraint C 2017 IEEE Intern
  • Java do-while循环学习小结

    do while循环先执行循环 再判断条件 do while循环会至少执行一次 具体内容扫描关注公众号
  • Django基础之Model操作

    一 数据库操作 1 创建model表 基本结构 1 coding Utf8 2 from django db import models 3 4 class userinfo models Model 5 如果没有models AutoFi
  • 程序员工作交接文档怎么写_程序员如何优雅的做好离职交接工作?

    1背景 某项目负责人离职 仅在离职前不到一周工作交接给我 该项目特点 1 所有参与人员尽数几乎全部离职 2 项目开始时间 2012年 数易版本 已经4年多的大项目 3 涉及模块众多 部署文档已经没有最新的 4 有Git版本管理 但资料不全且
  • 三极管驱动电路(扩充单片机的输出电流)

    常见的三极管驱动有两种结构 共射极输出 共集电极输出 I 共射极输出 PNP 要求输入的动态范围要大 而且输出的电压范围永远比输入小0 7V 射极输出电路就不能有效的利用 5V的电源 实际上 加到继电器上的电压 不足 4V 除非是使用4V的
  • 2.2 Git 基础 - 记录每次更新到仓库

    2 2 Git 基础 记录每次更新到仓库 版本说明 版本 作者 日期 备注 0 1 loon 2019 3 19 初稿 目录 文章目录 2 2 Git 基础 记录每次更新到仓库 版本说明 目录 记录每次更新到仓库 Figure 8 文件的状
  • Android自定义View --- 绘制圆环

    Android自定义View实现很简单 继承View 重写构造函数 onDraw onMeasure 等函数 如果自定义的View需要有自定义的属性 需要在values下建立attrs xml 在其中定义你的属性 在使用到自定义View的x