效果图

中间一个圆+一个文本,外面是一个圆弧,可以用来显示一些进度的信息,弧线的角度可调.

  1. attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources><declare-styleable name="ArcView"><attr name="mProgress" format="integer"></attr><attr name="mCenterText" format="string"></attr><attr name="mCenterTextColor" format="color"></attr><attr name="mCenterBackgroundColor" format="color"></attr><attr name="mArcColor" format="color"></attr><attr name="mArcWidth" format="dimension"></attr><attr name="mRadius" format="dimension"></attr></declare-styleable>
</resources>

2.模型图

3.代码:

package com.example.customview;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;
public class ArcView extends View {/** 画图工具*/private Paint    mPaint;/*** 属性*/private int        mProgress;private String    mCenterText;private int        mCenterTextColor;private int        mCenterBackgroundColor;private int        mArcColor;private int        mArcWidth;private int        mRadius;private int        mTextHeight;private int        mTextWidth;public ArcView(Context context) {this(context, null);}public ArcView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public ArcView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);TypedArray ta = context.getTheme().obtainStyledAttributes(attrs, R.styleable.ArcView, defStyleAttr, 0);int n = ta.getIndexCount();for (int i = 0; i < n; i++) {int attr = ta.getIndex(i);switch (attr) {case R.styleable.ArcView_mProgress:mProgress = ta.getInt(attr, 90);break;case R.styleable.ArcView_mCenterText:mCenterText = ta.getString(attr);break;case R.styleable.ArcView_mCenterTextColor:mCenterTextColor = ta.getColor(attr, Color.RED);break;case R.styleable.ArcView_mCenterBackgroundColor:mCenterBackgroundColor = ta.getColor(attr, Color.RED);break;case R.styleable.ArcView_mArcColor:mArcColor = ta.getColor(attr, Color.RED);break;case R.styleable.ArcView_mArcWidth:mArcWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, ta.getDimension(attr, 5),getResources().getDisplayMetrics());break;case R.styleable.ArcView_mRadius:mRadius = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, ta.getDimension(attr, 5),getResources().getDisplayMetrics());break;default:break;}}ta.recycle();mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);}@Overrideprotected void onDraw(Canvas canvas) {/*** 注: 文字必须在内圆之后绘画,否则内圆会把文字部分覆盖*/super.onDraw(canvas);int mCenterX = getMeasuredWidth() / 2;int mCenterY = getMeasuredHeight() / 2;/*** 确定圆心位置,在中间*/mPaint.setColor(mCenterBackgroundColor);canvas.drawCircle(mCenterX, mCenterY, mRadius - 2 * mArcWidth, mPaint);/*** 画出最外面的圆*/mPaint.setColor(mArcColor);mPaint.setStyle(Paint.Style.STROKE);mPaint.setStrokeWidth(mArcWidth);/*** 设置画笔类型与宽度*/canvas.drawArc(new RectF(mCenterX - mRadius, mCenterY - mRadius, mCenterX + mRadius, mCenterY + mRadius), 270,mProgress, false, mPaint);/*** 画弧线*/mPaint.setColor(mCenterTextColor);mPaint.setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 16, getResources().getDisplayMetrics()));mTextWidth = (int) mPaint.measureText(mCenterText);mTextHeight = getFontHeight(mPaint);mPaint.setStyle(Paint.Style.FILL);canvas.drawText(mCenterText, mCenterX - mTextWidth / 2, mCenterY + mTextHeight / 2, mPaint);/*** 画文字*/}private int getFontHeight(Paint paint) {Paint.FontMetrics fm = paint.getFontMetrics();return (int) (Math.ceil(fm.descent - fm.ascent));}
}

4.布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res/com.example.customview"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical" ><com.example.customview.ArcViewandroid:layout_width="match_parent"android:layout_height="match_parent"app:mArcColor="#f00"app:mArcWidth="5dp"app:mCenterBackgroundColor="#f00"app:mCenterText="Arc View"app:mCenterTextColor="#fff"app:mProgress="180"app:mRadius="50dp" />
</LinearLayout>

转载于:https://my.oschina.net/august1996/blog/671429

Android进阶学习-使用Canvas自定义ArcView(4)相关推荐

  1. android java服务,Android进阶学习必会:Java Binder中的系统服务

    前言 这个知识点是Android进阶学习必须掌握的知识点之一,也是高阶Android架构师经常问到的点.在这里分想给大家,希望对大家的工作和学习有所帮助.喜欢本文的记得点赞关注哦~ 在前面的Andro ...

  2. android进阶知识总结,Android进阶学习有哪些知识点

    Android进阶学习有哪些知识点 发布时间:2020-07-29 12:50:39 来源:亿速云 阅读:114 作者:Leah 本篇文章给大家分享的是有关Android进阶学习有哪些知识点,小编觉得 ...

  3. apk开发用什么语言!从入门到精通的Android进阶学习笔记整理,醍醐灌顶!

    行业激烈变化时,恰恰是机会最多的时候 坦白讲,许多人骨子里害怕变化和竞争. 其实大可不必. 一来,怕也没用嘛.二来,变化越快,组合要素增加了,意味着新的工作机会越多. 就像传统媒体VS新媒体. 放在1 ...

  4. Android进阶学习-自定义主题(3)

    效果图,略骚,不要笑!!! 我们使用的是这么一张图片,图片是静态的,我们通过旋转动画去实现加载的效果. 首先我们看下,一个加载窗口需要些什么.一个ImageVIew和一个TextView,那么我们就有 ...

  5. 安卓系统培训!从入门到精通的Android进阶学习笔记整理,已整理成文档

    热修复技术是Android开发中比较高级的知识点,是中级开发人员通向高级开发中必须掌握的技能.本篇重点讲解热修复热修复的原理,各大热修复框架的比较,以及自身产品中热修复功能的实践. 一.什么是热修复? ...

  6. Android进阶:十三、自定义类加载器加载加密类文件

    之前面试的时候有许多面试官问类加载器相关的问题,所以这是一个很重要的知识点.而且对于高级Android研发来讲,懂得更多类加载相关的东西,对开发也会有很多的帮助,比如热更新,类加密等. 其实笔者对类加 ...

  7. Android进阶学习--十几行代码实现美女撕衣服效果

        效果图: 在这篇文章文章里有介绍过PorterDuffXfermode这个类,下面来用这个知识点来实现一下那种撕衣服的特效,先给两张图片: 上面叫做bg.jpg,下面叫做fg.jpg 然后就直 ...

  8. 【Android进阶学习】Http编程之HttpClient

    在Android开发中,Android SDK附带了Apache的HttpClient,它是一个完善的客户端.它提供了对HTTP协议的全面支持,可以使用HttpClient的对象来执行HTTP GET ...

  9. 【Android进阶学习】设置透明效果的三种方法

    1.使用Android系统自带的透明效果资源 <android:backgroundandroid:background="@android:color/transparent&quo ...

  10. python中的序列类型数据结构元素的切片操作_PythonI/O进阶学习笔记_4.自定义序列类(序列基类继承关系/可切片对象/推导式)...

    前言: 本文代码基于python3 Content: 1.python中的序列类分类 2. python序列中abc基类继承关系 3. 由list的extend等方法来看序列类的一些特定方法 4. l ...

最新文章

  1. 机器学习(MACHINE LEARNING) 【周志华版-”西瓜书“-笔记】 DAY10-降维和度量学习
  2. [HDOJ6165] FFF at Valentine(强联通分量,缩点,拓扑排序)
  3. mysql 5.7 修改配置文件_如何找到并修改MySQL57的配置文件m
  4. 四、MapReduce和Yarn基本架构
  5. linux 指令引用变量,Linux之变量引用与命令替换
  6. 《2019~2020网络安全态势观察报告》重磅发布!
  7. [bzoj1925][Sdoi2010]地精部落
  8. 一个小小的总结--关于写博客这件事
  9. jquery项目中一些比较常用的简单方法
  10. video上传架构设计与实现
  11. 17 行为型模式-----迭代器模式
  12. PIL imagefont 添加下划线
  13. 网络基础--TCP/IP网络基础
  14. 学生信息表 成绩表+12章练习
  15. QNX-Adaptive Partition
  16. 利用easyui实现 菜单节点和选项卡的联动效果
  17. 专访腾讯云谢岳峰:只做连接器,五大措施支持渠道伙伴成长
  18. 3.1 TMO MATLAB 框架(Advanced High Dynamic Range Imaging )
  19. Docker入门实战---修改Docker镜像源
  20. 为什么静下心来阅读会是一种奢侈?

热门文章

  1. VASP服务器第一次安装各种软件(上)
  2. 汉语字典_Android版最新官方版,汉语字典专业版2020
  3. python门店会员管理系统_python---CRM用户关系管理
  4. 【离散数学】集合论 第四章 函数与集合(5) 集合的基数、可数与不可数集合
  5. 【UE4】UE4文件系统
  6. 【MyBatis】MyBatis找不到mapper文件
  7. python 快速排名发包_SEO怎么快速排名?SEO快排发包技术原理是怎么实现的呀?(悬赏5元) - 搜外问答...
  8. 从入门到精通,C程序员必读的3本
  9. 深入浅出设计模式---3、代理模式和工厂模式
  10. R语言读取Excel的神器——openxlsx