您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)怎么在Android中自定義View實現(xiàn)QQ運動步數(shù)效果,小編覺得挺實用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
首先自定義屬性:
<?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="MyQQStep"> <attr name="out_color" format="color"/> <attr name="inner_color" format="color"/> <attr name="border_width" format="dimension"/> <attr name="text_size" format="dimension"/> <attr name="text_color" format="color"/> </declare-styleable> </resources>
自定義View代碼如下:
/** * Created by Michael on 2019/11/1. */ public class MyQQStep extends View { private int out_color; private int inner_color; private float width; private float textSize; private int color; private int width01; private int height01; private Paint outPaint; private Paint innerPaint; private Paint textPaint; private float percent; private int step; public MyQQStep(Context context) { this(context,null); } public MyQQStep(Context context, @Nullable AttributeSet attrs) { this(context, attrs,0); } public MyQQStep(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray array = context.obtainStyledAttributes(attrs,R.styleable.MyQQStep); out_color = array.getColor(R.styleable.MyQQStep_out_color, Color.BLACK); inner_color = array.getColor(R.styleable.MyQQStep_inner_color, Color.RED); width = array.getDimension(R.styleable.MyQQStep_border_width,10); textSize = array.getDimensionPixelSize(R.styleable.MyQQStep_text_size,20); color = array.getColor(R.styleable.MyQQStep_text_color, Color.GREEN); array.recycle(); initPaint(); percent = 0; step = 5000; } private void initPaint() { outPaint = new Paint(); outPaint.setAntiAlias(true); outPaint.setStyle(Paint.Style.STROKE); outPaint.setStrokeWidth(width); outPaint.setColor(out_color); outPaint.setStrokeCap(Paint.Cap.ROUND); innerPaint = new Paint(); innerPaint.setAntiAlias(true); innerPaint.setStrokeWidth(width); innerPaint.setStyle(Paint.Style.STROKE); innerPaint.setColor(inner_color); innerPaint.setStrokeCap(Paint.Cap.ROUND); textPaint = new Paint(); textPaint.setAntiAlias(true); textPaint.setColor(color); textPaint.setStyle(Paint.Style.STROKE); textPaint.setTextSize(textSize); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { //super.onMeasure(widthMeasureSpec, heightMeasureSpec); int widthMode = MeasureSpec.getMode(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); if (widthMode == MeasureSpec.AT_MOST){ }else{ width01 = MeasureSpec.getSize(widthMeasureSpec); } if (heightMode == MeasureSpec.AT_MOST){ }else{ height01 = MeasureSpec.getSize(heightMeasureSpec); } setMeasuredDimension((width01>height01?height01:width01) ,(width01>height01?height01:width01)); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); int realWidth = getWidth()>getHeight()?getHeight():getWidth(); int realHeight = getWidth()>getHeight()?getHeight():getWidth(); RectF r1 = new RectF(width/2,width/2,realWidth-width/2 ,realHeight-width/2); canvas.drawArc(r1,135,270,false,outPaint); canvas.drawArc(r1,135,270*percent,false,innerPaint); Rect r = new Rect(); String s = step+""; textPaint.getTextBounds(s,0,s.length(),r); int textWidth = r.width(); int textHeight = r.height(); Paint.FontMetricsInt fontMetricsInt = new Paint.FontMetricsInt(); int dy = (fontMetricsInt.bottom-fontMetricsInt.top)/2-fontMetricsInt.bottom; int baseLine = textHeight/2+dy+realHeight/2-textHeight/2; int x0 = realWidth/2-textWidth/2; canvas.drawText(s,x0,baseLine,textPaint); } public void setPercent(float percent,float value){ this.percent = percent; this.step = (int) value; invalidate(); } }
最后在布局以及MainActivity中調(diào)用:
<com.example.qq_step.MyQQStep android:id="@+id/qq_step" android:layout_width="match_parent" android:layout_height="match_parent" app:out_color="@color/colorAccent" app:border_width="10dp" app:inner_color="@color/colorPrimary" app:text_size="20sp" app:text_color="@color/colorPrimaryDark" />
private void initView() { final MyQQStep qq_view = findViewById(R.id.qq_step); ValueAnimator animator = ValueAnimator.ofFloat(0,5000); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float p = animation.getAnimatedFraction(); qq_view.setPercent(p,5000*p); } }); animator.setDuration(10000); animator.start(); }
以上就是怎么在Android中自定義View實現(xiàn)QQ運動步數(shù)效果,小編相信有部分知識點可能是我們?nèi)粘9ぷ鲿姷交蛴玫降?。希望你能通過這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。