先上效果图,如果大家感觉不错,请参考实现代码。

重要的是如何实现自定义的view效果

(1)创建类,继承view,重写onDraw和onMesure方法

public class CirclePercentBar extends View{

private Context mContext;

private int mArcColor;

private int mArcWidth;

private int mCenterTextColor;

private int mCenterTextSize;

private int mCircleRadius;

private Paint arcPaint;

private Paint arcCirclePaint;

private Paint centerTextPaint;

private RectF arcRectF;

private Rect textBoundRect;

private float mCurData=0;

private int arcStartColor;

private int arcEndColor;

private Paint startCirclePaint;

public CirclePercentBar(Context context) {

this(context, null);

}

public CirclePercentBar(Context context, AttributeSet attrs) {

this(context, attrs, 0);

}

public CirclePercentBar(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

mContext=context;

TypedArray typedArray=context.obtainStyledAttributes(attrs,R.styleable.CirclePercentBar,defStyleAttr,0);

mArcColor = typedArray.getColor(R.styleable.CirclePercentBar_arcColor,0xff0000);

mArcWidth = typedArray.getDimensionPixelSize(R.styleable.CirclePercentBar_arcWidth, DisplayUtil.dp2px(context, 20));

mCenterTextColor = typedArray.getColor(R.styleable.CirclePercentBar_centerTextColor, 0x0000ff);

mCenterTextSize = typedArray.getDimensionPixelSize(R.styleable.CirclePercentBar_centerTextSize, DisplayUtil.dp2px(context, 20));

mCircleRadius = typedArray.getDimensionPixelSize(R.styleable.CirclePercentBar_circleRadius, DisplayUtil.dp2px(context, 100));

arcStartColor = typedArray.getColor(R.styleable.CirclePercentBar_arcStartColor,

ContextCompat.getColor(mContext, R.color.green));

arcEndColor = typedArray.getColor(R.styleable.CirclePercentBar_arcEndColor,

ContextCompat.getColor(mContext, R.color.yellow));

typedArray.recycle();

initPaint();

}

private void initPaint() {

startCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);

startCirclePaint.setStyle(Paint.Style.FILL);

//startCirclePaint.setStrokeWidth(mArcWidth);

startCirclePaint.setColor(arcStartColor);

arcCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG);

arcCirclePaint.setStyle(Paint.Style.STROKE);

arcCirclePaint.setStrokeWidth(mArcWidth);

arcCirclePaint.setColor(ContextCompat.getColor(mContext,R.color.colorAccent));

arcCirclePaint.setStrokeCap(Paint.Cap.ROUND);

arcPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

arcPaint.setStyle(Paint.Style.STROKE);

arcPaint.setStrokeWidth(mArcWidth);

arcPaint.setColor(mArcColor);

arcPaint.setStrokeCap(Paint.Cap.ROUND);

centerTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

centerTextPaint.setStyle(Paint.Style.STROKE);

centerTextPaint.setColor(mCenterTextColor);

centerTextPaint.setTextSize(mCenterTextSize);

//圓弧的外接矩形

arcRectF = new RectF();

//文字的边界矩形

textBoundRect = new Rect();

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, heightMeasureSpec);

setMeasuredDimension(measureDimension(widthMeasureSpec),measureDimension(heightMeasureSpec));

}

private int measureDimension(int measureSpec) {

int result;

int specMode=MeasureSpec.getMode(measureSpec);

int specSize=MeasureSpec.getSize(measureSpec);

if(specMode==MeasureSpec.EXACTLY){

result=specSize;

}else{

result=mCircleRadius*2;

if(specMode==MeasureSpec.AT_MOST){

result=Math.min(result,specSize);

}

}

return result;

}

@Override

protected void onDraw(Canvas canvas) {

canvas.rotate(-90, getWidth()/ 2, getHeight()/ 2);

arcRectF.set(getWidth()/2-mCircleRadius+mArcWidth/2,getHeight()/2-mCircleRadius+mArcWidth/2

,getWidth()/2+mCircleRadius-mArcWidth/2,getHeight()/2+mCircleRadius-mArcWidth/2);

canvas.drawArc(arcRectF, 0,360,false,arcCirclePaint);

arcPaint.setShader(new SweepGradient(getWidth()/2,getHeight()/2,arcStartColor,arcEndColor));

canvas.drawArc(arcRectF, 0,360* mCurData /100,false,arcPaint);

canvas.rotate(90, getWidth()/ 2, getHeight()/ 2);

canvas.drawCircle(getWidth()/2,getHeight()/2-mCircleRadius+mArcWidth/2,mArcWidth/2,startCirclePaint);

String data= String.valueOf(mCurData) +"%";

centerTextPaint.getTextBounds(data,0,data.length(),textBoundRect);

canvas.drawText(data,getWidth()/2-textBoundRect.width()/2,getHeight()/2+textBoundRect.height()/2,centerTextPaint);

}

public void setPercentData(float data, TimeInterpolator interpolator){

ValueAnimator valueAnimator=ValueAnimator.ofFloat(mCurData,data);

valueAnimator.setDuration((long) (Math.abs(mCurData-data)*30));

valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator valueAnimator) {

float value= (float) valueAnimator.getAnimatedValue();

mCurData=(float)(Math.round(value*10))/10;

invalidate();

}

});

valueAnimator.setInterpolator(interpolator);

valueAnimator.start();

}

}

(2)其中需要用到的类

public class DisplayUtil {

public static int px2dp(Context context,float pxValue){

final float scale=context.getResources().getDisplayMetrics().density;

return (int)(pxValue/scale+0.5f);

}

public static int dp2px(Context context,float dpValue){

final float scale=context.getResources().getDisplayMetrics().density;

return (int)(dpValue*scale+0.5f);

}

}

(3)attrs.xml

(4)在activity_main里面写布局

xmlns:app="http://schemas.android.com/apk/res-auto"

android:orientation="vertical" android:layout_width="match_parent"

android:layout_height="match_parent">

android:id="@+id/circle_bar"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_margin="20dp"

android:layout_gravity="center_horizontal"

app:arcWidth="30dp"

app:circleRadius="100dp"

app:centerTextSize="30sp"

app:arcColor="@color/colorPrimary"

app:centerTextColor="@color/colorAccent"

app:arcStartColor="@android:color/holo_green_light"/>

android:id="@+id/start_btn"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="随机"/>

(6)编程实现效果:

public class MainActivity extends AppCompatActivity {

CirclePercentBar circlePercentBar;

Button startBtn;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

circlePercentBar= (CirclePercentBar) findViewById(R.id.circle_bar);

circlePercentBar.setPercentData(55.2f,new DecelerateInterpolator());

startBtn= (Button) findViewById(R.id.start_btn);

startBtn.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View view) {

circlePercentBar.setPercentData((float) (100*Math.random()),new DecelerateInterpolator());

}

});

}

}

总结

以上所述是小编给大家介绍的Android自定义view实现圆环效果实例代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

Android 自定义 圆环,Android自定义view实现圆环效果实例代码相关推荐

  1. android自动悬浮窗代码,Android_Android实现桌面悬浮窗、蒙板效果实例代码,现在很多安全类的软件,比如3 - phpStudy...

    Android实现桌面悬浮窗.蒙板效果实例代码 现在很多安全类的软件,比如360手机助手,百度手机助手等等,都有一个悬浮窗,可以飘浮在桌面上,方便用户使用一些常用的操作. 今天这篇文章,就是介绍如何实 ...

  2. 自定义ListView实现任意View跑马灯效果

    自定义ListView实现任意View跑马灯效果 标签(空格分隔): 开源项目 看图 话不多说,先来看下大图效果吧,这里的GIF录制有点渣,不过真实的跑出来的效果还是挺不错的. 前言 最近项目中会加入 ...

  3. android筛选功能代码,Android中 TeaScreenPopupWindow多类型筛选弹框功能的实例代码

    Github地址 YangsBryant/TeaScreenPopupWindow (Github排版比较好,建议进入这里查看详情,如果觉得好,点个star吧!) 引入module allprojec ...

  4. android+底部评论框,Android 之BottomsheetDialogFragment仿抖音评论底部弹出对话框效果(实例代码)...

    实现的效果图: 自定义Fragment继承BottomSheetDialogFragment 重写它的三个方法: onCreateDialog() onCreateView() onStart() 他 ...

  5. android 今日头条加载动画,Android 仿今日头条简单的刷新效果实例代码

    点击按钮,先自动进行下拉刷新,也可以手动刷新,刷新完后,最后就多一行数据.有四个选项卡. 前两天导师要求做一个给本科学生预定机房座位的app,出发点来自这里.做着做着遇到很多问题,都解决了.这个效果感 ...

  6. android生命周期_Android开发 View的生命周期结合代码详解

    咱们以TextView控件为例: /** * Created by SunshineBoy on 2020/9/23. */ public class TestTextView extends and ...

  7. php仿微信朋友圈源码,Android开发仿微信发朋友圈浏览图片效果实例代码

    这篇文章主要介绍了Android仿微信发朋友圈浏览图片效果的相关资料,需要的朋友可以参考下 先看一下效果吧: 下面就来说一下具体怎么实现的: 实现思路1.首先我们要获取数据源,数据源就是我们的每条说说 ...

  8. 关闭Android电池温度告警框,android电源信息查看(电量、温度、电压)实例代码

    本文实例讲述了android电源信息查看方法.分享给大家供大家参考.具体如下: 1. PowerTestActivity: import android.app.Activity; import an ...

  9. android封装全局调用的toast_Android Toast提示封装实例代码

    Android Toast提示封装 Android中经常用到Toast提示,项目中很多Toast提示,写很长的一行,简单的封装一下,将Toast方法提出来,很方便使用: 实例代码: /** * 提示字 ...

最新文章

  1. C++中的explicitkeyword
  2. mysql Sql slow log_MySQL慢查询日志(SLOW LOG)
  3. 数据库优化:Mysql慢查询的定位和分析
  4. Android permission 访问权限一览
  5. WindowsServer2012史记5-简洁,管理更多的服务器
  6. LVS/keepalived配置
  7. Java 8 的List<V> 转成 Map<K, V>
  8. 在大公司天天调参数,感觉快废了~
  9. uniapp光标自动定义到文本框_word如何自动生成毕业论文目录!
  10. 如何删除office2007、以及安装新版本office
  11. mysql 1317,MySQL 中的-Error_code:1317-爱可生
  12. PowerDesigner物理模型生成Excel文件
  13. 基础训练(一~五)题解
  14. [导入]在asp.net中利用FileUplad控件从同一个页面上传多个文件
  15. SOFA-DTX 分布式事务的设计演进路线
  16. 中央电大c 语言程序设计本科试题,中央电大本科C语言程序设计试题2013年1月.pdf...
  17. 计算机编辑学,计算机常识及电文档编辑学习.doc
  18. Windows BAT批处理脚本教程
  19. 内存超频trfc_P55平台内存超频实战
  20. haproxy path_beg

热门文章

  1. shell实现矩阵转置
  2. BFS Codeforces Round #297 (Div. 2) D. Arthur and Walls
  3. Windows Phone 7 程序菜单栏ApplicationBar
  4. 用python语言编斐波那契数列_用python函数写斐波那契数列
  5. LSMW批处理使用方法(10)_步骤12、13
  6. 程序中下载采购申请的附件
  7. 武汉众邦银行的数字化升级秘诀:让每个业务⼈员都能自助式分析查询
  8. 频频转型的蘑菇街,能讲好直播这个“老故事”吗?
  9. 谁来搬走冷链物流头上的三座大山
  10. ie 不执行回调函时_javascript引擎执行的过程的理解--执行阶段