91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Android中自定義一個圓環式進度條

發布時間:2021-04-30 15:31:40 來源:億速云 閱讀:180 作者:Leah 欄目:開發技術

如何在Android中自定義一個圓環式進度條?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

Android是什么

Android是一種基于Linux內核的自由及開放源代碼的操作系統,主要使用于移動設備,如智能手機和平板電腦,由美國Google公司和開放手機聯盟領導及開發。

package com.djt.aienglish.widget;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;

import com.djt.aienglish.R;



public class CirclePgBar extends View {
    private int mHeight = 0;
    private int mWidth = 0;

    // 畫圓環的畫筆
    private Paint mRingPaint;
    // 畫圓環的畫筆背景色
    private Paint mRingPaintBg;
    // 畫字體的畫筆
    private Paint mTextPaint;
    // 圓環顏色
    private int mRingColor;
    // 圓環背景顏色
    private int mRingBgColor;
    // 半徑
    private float mRadius;
    // 圓環半徑
    private float mRingRadius;
    // 圓環寬度
    private float mStrokeWidth;
    // 圓心x坐標
    private int mXCenter;
    // 圓心y坐標
    private int mYCenter;
    // 字的長度
    private float mTxtWidth;
    // 字的高度
    private float mTxtHeight;
    // 總進度
    private int max = 100;
    // 當前進度
    private int progress;
    private String text;

    public CirclePgBar(Context context, AttributeSet attrs) {
        super(context, attrs);
        // 獲取自定義的屬性
        initAttrs(context, attrs);
        initVariable();
    }

    /**
     * 屬性
     */
    private void initAttrs(Context context, AttributeSet attrs) {
        TypedArray typeArray = context.getTheme().obtainStyledAttributes(attrs,
                R.styleable.TasksCompletedView, 0, 0);
        mStrokeWidth = typeArray.getDimension(R.styleable.TasksCompletedView_circleWidth, 0);
        mRingColor = typeArray.getColor(R.styleable.TasksCompletedView_ringColor, 0xFFFFFFFF);
        mRingBgColor = typeArray.getColor(R.styleable.TasksCompletedView_ringBgColor, 0xFFFFFFFF);
        text = typeArray.getString(R.styleable.TasksCompletedView_text);
        max = typeArray.getInteger(R.styleable.TasksCompletedView_max, 0);
        progress = typeArray.getInteger(R.styleable.TasksCompletedView_progress, 0);
    }

    /**
     * 初始化畫筆
     */
    private void initVariable() {
        //外圓弧背景
        mRingPaintBg = new Paint();
        mRingPaintBg.setAntiAlias(true);
        mRingPaintBg.setColor(mRingBgColor);
        mRingPaintBg.setStyle(Paint.Style.STROKE);
        mRingPaintBg.setStrokeWidth(mStrokeWidth);
        //外圓弧
        mRingPaint = new Paint();
        mRingPaint.setAntiAlias(true);
        mRingPaint.setColor(mRingColor);
        mRingPaint.setStyle(Paint.Style.STROKE);
        mRingPaint.setStrokeWidth(mStrokeWidth);
        //mRingPaint.setStrokeCap(Paint.Cap.ROUND);//設置線冒樣式,有圓 有方
        //中間字
        mTextPaint = new Paint();
        mTextPaint.setAntiAlias(true);
        mTextPaint.setStyle(Paint.Style.FILL);
        mTextPaint.setColor(mRingColor);
        invalidate();
    }

    //測量
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        //實際測量寬高
        mHeight = getMeasuredHeight();
        mWidth = getMeasuredWidth();
        if (mWidth > mHeight) {
            mRadius = mHeight / 2;
        } else {
            mRadius = mWidth / 2;
        }
        //半徑
        mRingRadius = mRadius - mStrokeWidth / 2;
        //文字寬高測量
        mTextPaint.setTextSize(mRadius / 2);
        Paint.FontMetrics fm = mTextPaint.getFontMetrics();
        mTxtHeight = (int) Math.ceil(fm.descent - fm.ascent);
    }

    /**
     * 畫圖
     */
    @Override
    protected void onDraw(Canvas canvas) {
        mXCenter = mWidth / 2;
        mYCenter = mHeight / 2;
        //外圓弧背景
        RectF rectBg = new RectF(mXCenter - mRingRadius, mYCenter - mRingRadius, mXCenter + mRingRadius, mYCenter + mRingRadius);
        canvas.drawArc(rectBg, 0, 360, false, mRingPaintBg);
        //外圓弧//進度
        if (progress > 0) {
            RectF oval = new RectF(mXCenter - mRingRadius, mYCenter - mRingRadius, mXCenter + mRingRadius, mYCenter + mRingRadius);
            canvas.drawArc(oval, -90, ((float) progress / max) * 360, false, mRingPaint);
        }
        //字體
        if(!TextUtils.isEmpty(text)) {
            mTxtWidth = mTextPaint.measureText(text, 0, text.length());
            canvas.drawText(text, mXCenter - mTxtWidth / 2, mYCenter + mTxtHeight / 4, mTextPaint);
        }
    }

    /**
     * 設置進度
     *
     * @param progress
     */
    public void setProgress(int progress) {
        this.progress = progress;
        postInvalidate();//重繪
    }

    /**
     * 設置最大值
     *
     * @param max
     */
    public void setMax(int max) {
        this.max = max;
        postInvalidate();
    }

    /**
     * 設置文字內容
     *
     * @param text
     */
    public void setText(String text) {
        this.text = text;
        postInvalidate();
    }
}

別忘記在value下的attr.xml中加入默認配置屬性

<!--圓弧進度條-->
    <declare-styleable name="TasksCompletedView">
        <attr name="circleWidth" format="dimension" />
        <attr name="ringColor" format="color" />
        <attr name="ringBgColor" format="color" />
        <attr name="text" format="string" />
        <attr name="progress" format="integer" />
     <attr name="max" format="integer" />
</declare-styleable>

看完上述內容,你們掌握如何在Android中自定義一個圓環式進度條的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

文安县| 监利县| 酒泉市| 那坡县| 永济市| 乾安县| 泰和县| 凤阳县| 鄂托克前旗| 习水县| 马鞍山市| 友谊县| 抚松县| 石阡县| 盐山县| 古丈县| 正定县| 渝中区| 凌源市| 烟台市| 昭觉县| 安顺市| 康乐县| 都匀市| 上林县| 邛崃市| 措美县| 沙洋县| 哈尔滨市| 嵊州市| 闻喜县| 民和| 靖边县| 同德县| 凤凰县| 林甸县| 旬阳县| 鹿邑县| 乐亭县| 龙门县| 左权县|