<bdo id='0AYMm'></bdo><ul id='0AYMm'></ul>

<tfoot id='0AYMm'></tfoot>

<small id='0AYMm'></small><noframes id='0AYMm'>

<i id='0AYMm'><tr id='0AYMm'><dt id='0AYMm'><q id='0AYMm'><span id='0AYMm'><b id='0AYMm'><form id='0AYMm'><ins id='0AYMm'></ins><ul id='0AYMm'></ul><sub id='0AYMm'></sub></form><legend id='0AYMm'></legend><bdo id='0AYMm'><pre id='0AYMm'><center id='0AYMm'></center></pre></bdo></b><th id='0AYMm'></th></span></q></dt></tr></i><div id='0AYMm'><tfoot id='0AYMm'></tfoot><dl id='0AYMm'><fieldset id='0AYMm'></fieldset></dl></div>

    1. <legend id='0AYMm'><style id='0AYMm'><dir id='0AYMm'><q id='0AYMm'></q></dir></style></legend>

    2. 环形进度条上的 Android 圆形边缘

      Android round edges on ring shaped progressbar(环形进度条上的 Android 圆形边缘)

        1. <legend id='QbWrn'><style id='QbWrn'><dir id='QbWrn'><q id='QbWrn'></q></dir></style></legend>
        2. <tfoot id='QbWrn'></tfoot>

          <small id='QbWrn'></small><noframes id='QbWrn'>

          <i id='QbWrn'><tr id='QbWrn'><dt id='QbWrn'><q id='QbWrn'><span id='QbWrn'><b id='QbWrn'><form id='QbWrn'><ins id='QbWrn'></ins><ul id='QbWrn'></ul><sub id='QbWrn'></sub></form><legend id='QbWrn'></legend><bdo id='QbWrn'><pre id='QbWrn'><center id='QbWrn'></center></pre></bdo></b><th id='QbWrn'></th></span></q></dt></tr></i><div id='QbWrn'><tfoot id='QbWrn'></tfoot><dl id='QbWrn'><fieldset id='QbWrn'></fieldset></dl></div>
            <tbody id='QbWrn'></tbody>
            <bdo id='QbWrn'></bdo><ul id='QbWrn'></ul>

                本文介绍了环形进度条上的 Android 圆形边缘的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

                问题描述

                我正在尝试在 android 上制作一个圆形进度条,这似乎是一项非常简单的任务,但我正在努力解决进度和次要进度的边缘.

                I'm trying to make a circular progress bar on android and it seems pretty straightforward task , but I'm struggling with rounding the edges of the progress and secondary progress.

                有没有办法在不制作自定义视图的情况下做到这一点?使用拐角半径?还是九个可绘制的补丁?

                Is there a way to do that without making a custom view ? Using a corners radius ? or nine patch drawable ?

                对于这个视图(见附件),我使用的是一个简单的 xml 文件

                For this view (see attachement) I'm using a simple xml file

                <item android:id="@android:id/progress">
                
                
                    <shape
                        android:useLevel="true"
                        android:innerRadius="@dimen/sixty_dp"
                        android:shape="ring"
                        android:thickness="@dimen/seven_dp">
                
                        <solid android:color="#477C5B"/>
                
                        <stroke android:width="1dip"
                            android:color="#FFFF"/>
                    </shape>
                
                
                
                
                
                
                </item>
                

                推荐答案

                只需在你的包中创建名为 MyProgress 的类..然后粘贴以下代码..

                Just create class called MyProgress in your package .. and paste the following code..

                import android.content.Context;
                import android.content.res.TypedArray;
                import android.graphics.Canvas;
                import android.graphics.Paint;
                import android.graphics.RectF;
                import android.text.TextPaint;
                import android.util.AttributeSet;
                import android.view.View;
                
                public class MyProgress extends View {
                
                    private Paint mPrimaryPaint;
                    private Paint mSecondaryPaint;
                    private RectF mRectF;
                    private TextPaint mTextPaint;
                    private Paint mBackgroundPaint;
                
                    private boolean mDrawText = false;
                
                    private int mSecondaryProgressColor;
                    private int mPrimaryProgressColor;
                    private int mBackgroundColor;
                
                    private int mStrokeWidth;
                
                    private int mProgress;
                    private int mSecodaryProgress;
                
                    private int mTextColor;
                
                    private int mPrimaryCapSize;
                    private int mSecondaryCapSize;
                    private boolean mIsPrimaryCapVisible;
                    private boolean mIsSecondaryCapVisible;
                
                    private int x;
                    private int y;
                    private int mWidth = 0, mHeight = 0;
                
                
                    public MyProgress(Context context) {
                        super(context);
                        init(context, null);
                    }
                
                    public MyProgress(Context context, AttributeSet attrs) {
                        super(context, attrs);
                        init(context, attrs);
                    }
                
                    public MyProgress(Context context, AttributeSet attrs, int defStyleAttr) {
                        super(context, attrs, defStyleAttr);
                        init(context, attrs);
                    }
                
                    void init(Context context, AttributeSet attrs) {
                        TypedArray a;
                        if (attrs != null) {
                            a = context.getTheme().obtainStyledAttributes(
                                    attrs,
                                    R.styleable.MyProgress,
                                    0, 0);
                        } else {
                            throw new IllegalArgumentException("Must have to pass the attributes");
                        }
                
                        try {
                            mDrawText = a.getBoolean(R.styleable.MyProgress_showProgressText, false);
                
                            mBackgroundColor = a.getColor(R.styleable.MyProgress_backgroundColor, android.R.color.darker_gray);
                            mPrimaryProgressColor = a.getColor(R.styleable.MyProgress_progressColor, android.R.color.darker_gray);
                            mSecondaryProgressColor = a.getColor(R.styleable.MyProgress_secondaryProgressColor, android.R.color.black);
                
                            mProgress = a.getInt(R.styleable.MyProgress_progress, 0);
                            mSecodaryProgress = a.getInt(R.styleable.MyProgress_secondaryProgress, 0);
                
                            mStrokeWidth = a.getDimensionPixelSize(R.styleable.MyProgress_strokeWidth, 20);
                            mTextColor = a.getColor(R.styleable.MyProgress_textColor, android.R.color.black);
                
                            mPrimaryCapSize = a.getInt(R.styleable.MyProgress_primaryCapSize, 20);
                            mSecondaryCapSize = a.getInt(R.styleable.MyProgress_secodaryCapSize, 20);
                
                            mIsPrimaryCapVisible = a.getBoolean(R.styleable.MyProgress_primaryCapVisibility, true);
                            mIsSecondaryCapVisible = a.getBoolean(R.styleable.MyProgress_secodaryCapVisibility, true);
                        } finally {
                            a.recycle();
                        }
                
                        mBackgroundPaint = new Paint();
                        mBackgroundPaint.setAntiAlias(true);
                        mBackgroundPaint.setStyle(Paint.Style.STROKE);
                        mBackgroundPaint.setStrokeWidth(mStrokeWidth);
                        mBackgroundPaint.setColor(mBackgroundColor);
                
                        mPrimaryPaint = new Paint();
                        mPrimaryPaint.setAntiAlias(true);
                        mPrimaryPaint.setStyle(Paint.Style.STROKE);
                        mPrimaryPaint.setStrokeWidth(mStrokeWidth);
                        mPrimaryPaint.setColor(mPrimaryProgressColor);
                
                        mSecondaryPaint = new Paint();
                        mSecondaryPaint.setAntiAlias(true);
                        mSecondaryPaint.setStyle(Paint.Style.STROKE);
                        mSecondaryPaint.setStrokeWidth(mStrokeWidth - 2);
                        mSecondaryPaint.setColor(mSecondaryProgressColor);
                
                        mTextPaint = new TextPaint();
                        mTextPaint.setColor(mTextColor);
                
                        mRectF = new RectF();
                    }
                
                    @Override
                    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
                        super.onSizeChanged(w, h, oldw, oldh);
                        mRectF.set(getPaddingLeft(), getPaddingTop(), w - getPaddingRight(), h - getPaddingBottom());
                        mTextPaint.setTextSize(w / 5);
                        x = (w / 2) - ((int) (mTextPaint.measureText(mProgress + "%") / 2));
                        y = (int) ((h / 2) - ((mTextPaint.descent() + mTextPaint.ascent()) / 2));
                        mWidth = w;
                        mHeight = h;
                        invalidate();
                    }
                
                    @Override
                    protected void onDraw(Canvas canvas) {
                        super.onDraw(canvas);
                
                        mPrimaryPaint.setStyle(Paint.Style.STROKE);
                        mSecondaryPaint.setStyle(Paint.Style.STROKE);
                
                        // for drawing a full progress .. The background circle
                        canvas.drawArc(mRectF, 0, 360, false, mBackgroundPaint);
                
                        // for drawing a secondary progress circle
                        int secondarySwipeangle = (mSecodaryProgress * 360) / 100;
                        canvas.drawArc(mRectF, 270, secondarySwipeangle, false, mSecondaryPaint);
                
                        // for drawing a main progress circle
                        int primarySwipeangle = (mProgress * 360) / 100;
                        canvas.drawArc(mRectF, 270, primarySwipeangle, false, mPrimaryPaint);
                
                        // for cap of secondary progress
                        int r = (getHeight() - getPaddingLeft() * 2) / 2;      // Calculated from canvas width
                        double trad = (secondarySwipeangle - 90) * (Math.PI / 180d); // = 5.1051
                        int x = (int) (r * Math.cos(trad));
                        int y = (int) (r * Math.sin(trad));
                        mSecondaryPaint.setStyle(Paint.Style.FILL);
                        if (mIsSecondaryCapVisible)
                            canvas.drawCircle(x + (mWidth / 2), y + (mHeight / 2), mSecondaryCapSize, mSecondaryPaint);
                
                        // for cap of primary progress
                        trad = (primarySwipeangle - 90) * (Math.PI / 180d); // = 5.1051
                        x = (int) (r * Math.cos(trad));
                        y = (int) (r * Math.sin(trad));
                        mPrimaryPaint.setStyle(Paint.Style.FILL);
                        if (mIsPrimaryCapVisible)
                            canvas.drawCircle(x + (mWidth / 2), y + (mHeight / 2), mPrimaryCapSize, mPrimaryPaint);
                
                
                        if (mDrawText)
                            canvas.drawText(mProgress + "%", x, y, mTextPaint);
                    }
                
                    public void setDrawText(boolean mDrawText) {
                        this.mDrawText = mDrawText;
                        invalidate();
                    }
                
                    public void setBackgroundColor(int mBackgroundColor) {
                        this.mBackgroundColor = mBackgroundColor;
                        invalidate();
                    }
                
                    public void setSecondaryProgressColor(int mSecondaryProgressColor) {
                        this.mSecondaryProgressColor = mSecondaryProgressColor;
                        invalidate();
                    }
                
                    public void setPrimaryProgressColor(int mPrimaryProgressColor) {
                        this.mPrimaryProgressColor = mPrimaryProgressColor;
                        invalidate();
                    }
                
                    public void setStrokeWidth(int mStrokeWidth) {
                        this.mStrokeWidth = mStrokeWidth;
                        invalidate();
                    }
                
                    public void setProgress(int mProgress) {
                        this.mProgress = mProgress;
                        invalidate();
                    }
                
                    public void setSecondaryProgress(int mSecondaryProgress) {
                        this.mSecodaryProgress = mSecondaryProgress;
                        invalidate();
                    }
                
                    public void setTextColor(int mTextColor) {
                        this.mTextColor = mTextColor;
                        invalidate();
                    }
                
                    public void setPrimaryCapSize(int mPrimaryCapSize) {
                        this.mPrimaryCapSize = mPrimaryCapSize;
                        invalidate();
                    }
                
                    public void setSecondaryCapSize(int mSecondaryCapSize) {
                        this.mSecondaryCapSize = mSecondaryCapSize;
                        invalidate();
                    }
                
                    public boolean isPrimaryCapVisible() {
                        return mIsPrimaryCapVisible;
                    }
                
                    public void setIsPrimaryCapVisible(boolean mIsPrimaryCapVisible) {
                        this.mIsPrimaryCapVisible = mIsPrimaryCapVisible;
                    }
                
                    public boolean isSecondaryCapVisible() {
                        return mIsSecondaryCapVisible;
                    }
                
                    public void setIsSecondaryCapVisible(boolean mIsSecondaryCapVisible) {
                        this.mIsSecondaryCapVisible = mIsSecondaryCapVisible;
                    }
                
                
                    public int getSecondaryProgressColor() {
                        return mSecondaryProgressColor;
                    }
                
                    public int getPrimaryProgressColor() {
                        return mPrimaryProgressColor;
                    }
                
                    public int getProgress() {
                        return mProgress;
                    }
                
                    public int getBackgroundColor() {
                        return mBackgroundColor;
                    }
                
                    public int getSecodaryProgress() {
                        return mSecodaryProgress;
                    }
                
                    public int getPrimaryCapSize() {
                        return mPrimaryCapSize;
                    }
                
                    public int getSecondaryCapSize() {
                        return mSecondaryCapSize;
                    }
                }
                

                并在标签下的res->values->attr.xml中添加以下行并构建它

                and add the following line in res->values->attr.xml under a tag and build it

                <declare-styleable name="MyProgress">
                    <attr name="showProgressText" format="boolean" />
                    <attr name="progress" format="integer" />
                    <attr name="secondaryProgress" format="integer" />
                    <attr name="progressColor" format="color" />
                    <attr name="secondaryProgressColor" format="color" />
                    <attr name="backgroundColor" format="color" />
                    <attr name="primaryCapSize" format="integer" />
                    <attr name="secodaryCapSize" format="integer" />
                    <attr name="primaryCapVisibility" format="boolean" />
                    <attr name="secodaryCapVisibility" format="boolean" />
                    <attr name="strokeWidth" format="dimension" />
                    <attr name="textColor" format="color" />
                </declare-styleable>
                

                就是这样......并在您的布局中使用..

                that's it .... and to use in your layout ..

                <Your_Package_Name.MyProgress
                    android:padding="20dp"
                    android:id="@+id/timer1"
                    app:strokeWidth="10dp"
                    app:progress="30"
                    app:secondaryProgress="50"
                    app:backgroundColor="@android:color/black"
                    app:progressColor="@android:color/holo_blue_bright"
                    app:secondaryProgressColor="@android:color/holo_blue_dark"
                    app:primaryCapSize="30"
                    app:secodaryCapSize="40"
                    app:primaryCapVisibility="true"
                    app:secodaryCapVisibility="true"
                    android:layout_width="200dp"
                    android:layout_height="200dp" />
                

                您还可以使用 setMethods() 以编程方式更改所有属性...

                随便问什么..祝你好运

                feel free to ask anything .. best of luck

                [2016 年 1 月 23 日更新]

                最后我在 github 上上传了代码.你可以从这里参考https://github.com/msquare097/MPProgressBar

                finally I uploaded code on github. You can refer it from here https://github.com/msquare097/MProgressBar

                现在您可以通过在您的应用程序 build.gradle 文件中编写以下行来使用此 ProgressBar.您不必复制以上代码.

                Now You can use this ProgressBar by simply writing following line in your app build.gradle file. You don't have to copy above code.

                compile 'com.msquare.widget.mprogressbar:mprogressbar:1.0.0'
                

                这篇关于环形进度条上的 Android 圆形边缘的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

                本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

                相关文档推荐

                How can I use CClistview in COCOS2d Android?(如何在 COCOS2d Android 中使用 CClistview?)
                cocos2d-android: how to display score(cocos2d-android:如何显示分数)
                Sqlite database not copied from asset folder Android(Sqlite 数据库未从资产文件夹 Android 复制)
                SQLite Database Copy Appears Corrupted When Generated by Device and not Emulator(SQLite 数据库副本在由设备而不是模拟器生成时出现损坏)
                Android file copy(安卓文件拷贝)
                Android how to detect Copy event of Edittext in android(Android如何在android中检测Edittext的Copy事件)

                      <tfoot id='xqFY3'></tfoot>

                      <small id='xqFY3'></small><noframes id='xqFY3'>

                      • <bdo id='xqFY3'></bdo><ul id='xqFY3'></ul>
                        <i id='xqFY3'><tr id='xqFY3'><dt id='xqFY3'><q id='xqFY3'><span id='xqFY3'><b id='xqFY3'><form id='xqFY3'><ins id='xqFY3'></ins><ul id='xqFY3'></ul><sub id='xqFY3'></sub></form><legend id='xqFY3'></legend><bdo id='xqFY3'><pre id='xqFY3'><center id='xqFY3'></center></pre></bdo></b><th id='xqFY3'></th></span></q></dt></tr></i><div id='xqFY3'><tfoot id='xqFY3'></tfoot><dl id='xqFY3'><fieldset id='xqFY3'></fieldset></dl></div>

                        <legend id='xqFY3'><style id='xqFY3'><dir id='xqFY3'><q id='xqFY3'></q></dir></style></legend>

                          <tbody id='xqFY3'></tbody>