1. <source id="nejs2"></source>
  2. <video id="nejs2"></video>
    <source id="nejs2"></source>
          1. 首頁 > 安卓筆記 > 安卓進度條樣式開發

            安卓進度條樣式開發

            更新:

            一、優化默認進度條外觀

            Android中提供了默認的進度條,但其外觀簡單、單調,不能滿足用戶的個性化需求。因此,我們需要對默認的進度條樣式進行優化。

            首先,我們可以使用

            通過以上代碼的設置,我們可以自定義進度條的顏色與形狀,使其具備更好的可見性與美觀度。

            二、使用動態圖形交互進度條

            除了改變進度條樣式的外觀,我們也可以使用動態圖形交互,來增強用戶的體驗感。例如,可以運用Bezier曲線和屬性動畫技術,來實現一個弧形的進度條。


            以上代碼中,我們使用了一個自定義的View和自定義屬性,實現了一個弧形的進度條。通過屬性動畫,可以實現進度條的平滑過渡,同時可在進度條兩端加上標簽文字,提供更好的交互體驗。

            三、使用氣泡狀進度條

            除了弧形進度條,在用戶體驗過程中,我們也可以設計出一些獨特的進度條樣式,以增強用戶的感官體驗。

            例如下面的氣泡狀進度條,就可以使用戶更直觀地了解到進度條狀態的變化,增強其使用體驗。


            四、總結

            通過本文的介紹,我們可以看到,通過默認進度條優化、動態圖形交互和獨特進度條樣式等方面的探索,可以為用戶提供更好的體驗,使應用更加吸引人。

            public class ArcProgress extends View {
                    private Paint paint;
                    private RectF rectF;
                    private float strokeWidth;
                    private float progress = 0;
                    private int max;
                    private int finishedStrokeColor;
                    private int unfinishedStrokeColor;
                    private int textColor;
                    private float textSize;
                    private String text;
                    private int arc_angle = 270;
                    private int start_angle = 135;
            
                    public ArcProgress(Context context) {
                        this(context, null);
                    }
            
                    public ArcProgress(Context context, AttributeSet attrs) {
                        this(context, attrs, 0);
                    }
            
                    public ArcProgress(Context context, AttributeSet attrs, int defStyleAttr) {
                        super(context, attrs, defStyleAttr);
            
                        paint = new Paint();
                        rectF = new RectF();
            
                        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ArcProgress, defStyleAttr, 0);
                        strokeWidth = typedArray.getDimension(R.styleable.ArcProgress_arcWidth, 10f);
                        progress = typedArray.getFloat(R.styleable.ArcProgress_progress, 0);
                        max = typedArray.getInt(R.styleable.ArcProgress_max, 100);
                        finishedStrokeColor = typedArray.getColor(R.styleable.ArcProgress_finishedStrokeColor, Color.WHITE);
                        unfinishedStrokeColor = typedArray.getColor(R.styleable.ArcProgress_unfinishedStrokeColor, Color.WHITE);
                        textColor = typedArray.getColor(R.styleable.ArcProgress_android_textColor, Color.WHITE);
                        textSize = typedArray.getDimension(R.styleable.ArcProgress_android_textSize, 20f);
            
                        typedArray.recycle();
                    }
            
                    @Override
                    protected void onDraw(Canvas canvas) {
                        super.onDraw(canvas);
            
                        int width = getWidth();
                        int height = getHeight();
            
                        int cx = width / 2;
                        int cy = height / 2;
            
                        int radius = (int) Math.min(cx, cy) - (int) strokeWidth / 2;
            
                        paint.setStrokeWidth(strokeWidth);
                        paint.setAntiAlias(true);
                        paint.setStrokeCap(Paint.Cap.ROUND);
                        paint.setStyle(Paint.Style.STROKE);
            
                        paint.setColor(finishedStrokeColor);
                        rectF.set(cx - radius, cy - radius, cx + radius, cy + radius);
                        canvas.drawArc(rectF, start_angle, progress / (float) max * arc_angle, false, paint);
            
                        paint.setColor(unfinishedStrokeColor);
                        canvas.drawArc(rectF, start_angle + progress / (float) max * arc_angle, arc_angle - progress / (float) max * arc_angle, false, paint);
            
                        paint.setStrokeWidth(0);
                        paint.setColor(textColor);
                        paint.setTextSize(textSize);
                        paint.setTextAlign(Paint.Align.CENTER);
                        canvas.drawText(text, cx, cy + textSize / 4, paint);
                    }
            
                    public void setProgress(float progress) {
                        this.progress = progress;
                        this.text = String.format("%.0f%%", progress / max * 100f);
                        invalidate();
                    }
            
                    public void setMax(int max) {
                        this.max = max;
                        invalidate();
                    }
                }
            
                public class BubbleProgressBar extends View {
                    private Paint paint;
                    private RectF rectF;
                    private float strokeWidth;
            
                    private float progress = 0;
                    private float max = 100;
                    private float bubbleWidth;
                    private float bubbleHeight;
                    private int bubbleColor;
                    private int barColor;
                    private float barWidth;
                    private int textColor;
                    private float textSize;
            
                    public BubbleProgressBar(Context context) {
                        this(context, null);
                    }
            
                    public BubbleProgressBar(Context context, AttributeSet attrs) {
                        this(context, attrs, 0);
                    }
            
                    public BubbleProgressBar(Context context, AttributeSet attrs, int defStyleAttr) {
                        super(context, attrs, defStyleAttr);
            
                        paint = new Paint();
                        paint.setAntiAlias(true);
            
                        rectF = new RectF();
            
                        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.BubbleProgressBar, defStyleAttr, 0);
            
                        bubbleWidth = typedArray.getDimension(R.styleable.BubbleProgressBar_bubbleWidth, 24);
                        bubbleHeight = typedArray.getDimension(R.styleable.BubbleProgressBar_bubbleHeight, 36);
                        bubbleColor = typedArray.getColor(R.styleable.BubbleProgressBar_bubbleColor, Color.parseColor("#1abc9c"));
                        barColor = typedArray.getColor(R.styleable.BubbleProgressBar_barColor, Color.parseColor("#bdc3c7"));
                        barWidth = typedArray.getDimension(R.styleable.BubbleProgressBar_barWidth, 10);
                        textSize = typedArray.getDimension(R.styleable.BubbleProgressBar_android_textSize, 18);
                        textColor = typedArray.getColor(R.styleable.BubbleProgressBar_android_textColor, Color.WHITE);
            
                        typedArray.recycle();
                    }
            
                    @Override
                    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
                        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
                        int widthSize = MeasureSpec.getSize(widthMeasureSpec);
            
                        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
                        int heightSize = MeasureSpec.getSize(heightMeasureSpec);
            
                        int width;
                        int height;
            
                        if (widthMode == MeasureSpec.EXACTLY) {
                            width = widthSize;
                        } else {
                            width = (int) bubbleWidth * 3;
                        }
            
                        if (heightMode == MeasureSpec.EXACTLY) {
                            height = heightSize;
                        } else {
                            height = (int) bubbleHeight;
                        }
            
                        setMeasuredDimension(width, height);
                    }
            
                    @Override
                    protected void onDraw(Canvas canvas) {
                        super.onDraw(canvas);
            
                        int width = getWidth();
                        int height = getHeight();
            
                        paint.setStrokeWidth(0);
                        paint.setStyle(Paint.Style.FILL);
            
                        //畫氣泡
                        paint.setColor(bubbleColor);
                        canvas.drawRoundRect(rectF, bubbleWidth / 2, bubbleWidth / 2, paint);
            
                        //畫進度條背景
                        paint.setColor(barColor);
                        rectF.set(bubbleWidth / 2, height / 2 - barWidth / 2, width - bubbleWidth / 2, height / 2 + barWidth / 2);
                        canvas.drawRoundRect(rectF, barWidth / 2, barWidth / 2, paint);
            
                        //畫進度條
                        paint.setColor(bubbleColor);
                        rectF.set(bubbleWidth / 2, height / 2 - barWidth / 2, progress / max * (width - bubbleWidth) + bubbleWidth / 2, height / 2 + barWidth / 2);
                        canvas.drawRoundRect(rectF, barWidth / 2, barWidth / 2, paint);
            
                        //畫進度百分比
                        paint.setColor(textColor);
                        paint.setTextSize(textSize);
                        paint.setTextAlign(Paint.Align.CENTER);
            
                        String text = (int)(progress / max * 100) + "%";
                        float textWidth = paint.measureText(text);
                        float x = progress / max * (width - bubbleWidth) + bubbleWidth / 2;
                        float y = height / 2 + textSize / 2;
                        canvas.drawText(text, x, y, paint);
                    }
            
                    public float getProgress() {
                        return progress;
                    }
            
                    public void setProgress(float progress) {
                        this.progress = progress;
                        if (this.progress > max) {
                            this.progress = max;
                        }
                        invalidate();
                    }
            
                    public float getMax() {
                        return max;
                    }
            
                    public void setMax(float max
            文章目錄
            頂部 久久久久99精品成人片毛片_黃色A片三級三級三級无码_日本不卡高清视频v中文字幕_高清欧美视频一区二区
            1. <source id="nejs2"></source>
            2. <video id="nejs2"></video>
              <source id="nejs2"></source>