下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】怎么在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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024-2034年中国蛋品加工市场运营状况及投资规划研究报告
- 2024-2034年中国茶吧机行业市场深度评估及投资战略规划报告
- 2024-2034年中国船用燃料油市场运营动态及发展策略研究报告
- 2024-2034年中国膨胀阀芯行业竞争格局分析及投资规划研究报告
- 2024-2034年中国肥皂市场运营态势分析及投资前景预测报告
- 2024-2034年中国聚乙烯波纹管行业市场现状分析及竞争格局与投资发展研究报告
- 2024-2034年中国纺织用滑石粉市场竞争格局分析及投资方向研究报告
- 2024-2034年中国糖画机市场分析及投资策略研究报告
- 2024-2034年中国移动剪叉式升降机行业市场现状分析及竞争格局与投资发展研究报告
- 2024-2034年中国石油天然气输送管市场评估分析及发展前景调研战略研究报告
- 2024-2030年中国氟化工行业深度分析及发展战略研究咨询报告
- 2024年公路护栏安装合同范本
- (2024年)物业管理基础知识培训
- 万达宝软件逻辑计算笔试题
- 2024-2029全球及中国水晶玻璃行业市场发展分析及前景趋势与投资发展研究报告
- 智能网联车路云协同系统架构与关键技术研究综述
- 动漫ip策划方案
- 2023年12月河南省文物考古研究院招考聘用68人笔试近6年高频考题难、易错点荟萃答案带详解附后
- 桨板器材知识培训课件
- 2023-2024学年四川省乐山七中学中考三模数学试题含解析
- 初二各类型的非连阅读含答案
评论
0/150
提交评论