日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android 自定义 圆环,Android自定义view实现圆环效果实例代码

發布時間:2025/3/20 Android 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android 自定义 圆环,Android自定义view实现圆环效果实例代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

先上效果圖,如果大家感覺不錯,請參考實現代碼。

? ? ? ? ?

重要的是如何實現自定義的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實現圓環效果實例代碼,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

與50位技術專家面對面20年技術見證,附贈技術全景圖

總結

以上是生活随笔為你收集整理的Android 自定义 圆环,Android自定义view实现圆环效果实例代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 无毛av| 无码人妻精品一区二区三区不卡 | 九九精品久久 | 看黄网站在线 | 美国黄色一级毛片 | 91精品久久香蕉国产线看观看 | 日韩精品一区二区三区免费视频 | 国产日韩精品在线 | 小明天天看 | 日韩色一区 | 亚洲一区二区在线观看视频 | 日韩精品一区二区三区高清免费 | 午夜激情电影在线观看 | 性高跟鞋xxxxhd人妖 | 日本一区二区三区四区视频 | 天天夜夜人人 | 日韩高清一区 | 久久久久久九九九九九 | av电影免费在线播放 | 日韩中文字幕综合 | 天天天综合网 | 国产黄av| 国产1区在线观看 | 97精品人妻一区二区三区 | 国产做爰免费观看 | 四虎成人免费视频 | 久久深夜福利 | 亚洲日本在线观看视频 | 免费欧美黄色片 | 日韩在线免费视频观看 | 日韩全黄 | 欧美性色黄 | 亚洲成人精品一区 | 香蕉视频三级 | 那里可以看毛片 | 色老头网址 | 91爱爱视频 | 亚洲久操| xxxx毛片| 欧美日韩一区二区三区在线 | 那个网站可以看毛片 | 久久e热| 九色网站在线观看 | 国产精品美乳在线观看 | 亚洲精品一线二线三线 | 亚洲美女一区 | 最好看的中文字幕 | 外国黄色录像 | 久草热在线观看 | 亚洲欧洲国产视频 | 免费国产网站 | 欧美一二三| 色网站免费在线观看 | 日本老师巨大bbw丰满 | 91久久在线观看 | 久久靠逼视频 | 久久国产视频播放 | 蜜桃麻豆视频 | 91免费网站在线观看 | 日韩一级片网址 | 日韩在线国产精品 | 久久亚洲成人av | 992在线观看 | 激情中文网| 91香蕉一区二区三区在线观看 | 欧洲美一区二区三区亚洲 | 国产美女网站视频 | 日本狠狠操 | 久久久久久逼 | 久国久产久精永久网页 | 国产aⅴ精品一区二区果冻 台湾性生生活1 | 国产成人在线网站 | 人妻人人澡人人添人人爽 | 97在线免费 | 亚欧洲乱码视频 | chien国产乱露脸对白 | 久久久99国产精品免费 | www.国产com | 奇米激情 | 91桃色网站 | 玩弄少妇人妻 | 欧美黄在线 | 色宗合 | 九九九九色 | 91超碰在线| 青青草视频网站 | 中文字幕亚洲一区 | 饥渴丰满的少妇喷潮 | 日韩福利视频网 | 欧美大片黄色 | 久久久999国产 | 99热精品久久 | 国产精品人人妻人人爽 | 影音先锋在线视频观看 | 亚洲精品少妇久久久久久 | 人人草人人 | 亚洲vs天堂 | 中文字幕高清在线 | 福利在线免费观看 |