【移动应用开发技术】怎么在Android中通过自定义view实现圆环效果_第1页
【移动应用开发技术】怎么在Android中通过自定义view实现圆环效果_第2页
【移动应用开发技术】怎么在Android中通过自定义view实现圆环效果_第3页
【移动应用开发技术】怎么在Android中通过自定义view实现圆环效果_第4页
【移动应用开发技术】怎么在Android中通过自定义view实现圆环效果_第5页
免费预览已结束,剩余2页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】怎么在Android中通过自定义view实现圆环效果

怎么在Android中通过自定义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<?xml

version="1.0"

encoding="utf-8"?>

<resources>

<declare-styleable

name="CirclePercentBar">

<attr

name="arcColor"

format="color"/>

<attr

name="arcWidth"

format="dimension"/>

<attr

name="centerTextColor"

format="color"/>

<attr

name="centerTextSize"

format="dimension"/>

<attr

name="circleRadius"

format="dimension"/>

<attr

name="arcStartColor"

format="color"/>

<attr

name="arcEndColor"

format="color"/>

</declare-styleable>

</resources>(4)在activity_main里面写布局<?xml

version="1.0"

encoding="utf-8"?>

<LinearLayout

xmlns:android="/apk/res/android"

xmlns:app="/apk/res-auto"

android:orientation="vertical"

android:layout_width="match_parent"

android:layout_height="match_parent">

<com.example.administrator.textc.CirclePercentBar

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"/>

<Button

android:id="@+id/start_btn"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="随机"/>

</LinearLayout>(6)编程实现效果:public

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论