自定義進(jìn)度條及仿58數(shù)據(jù)加載效果

在項(xiàng)目開發(fā)中都會(huì)涉及到網(wǎng)絡(luò)加載,文件上傳或者下載升酣,都會(huì)用到顯示當(dāng)前加載進(jìn)度的進(jìn)度條效果幻工,最近剛好學(xué)了下自定義進(jìn)度條,效果如下:

device-2017-06-28-115744.gif

上面效果的實(shí)現(xiàn)還是通過(guò)自定義view效五,通過(guò)onMeasure()方法測(cè)量地消,onDraw()方法繪制實(shí)現(xiàn)的,一共涉及到三個(gè)東西的繪制畏妖,內(nèi)圓(藍(lán)色圓)脉执、外圓(黃色圓)、中間文字的繪制戒劫,繪制完這些就可以實(shí)現(xiàn)大致效果了半夷;不過(guò)還是跟之前幾篇自定view播客一樣婆廊,在繪制之前需要初始化自定義屬性和畫筆;
初始化定義屬性:

       //初始化屬性
        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.ProgressBar);
        mInnerBackground = array.getColor(R.styleable.ProgressBar_innerBackground, mInnerBackground);
        mOutterBackground = array.getColor(R.styleable.ProgressBar_outterBackground, mOutterBackground);
        mProgressTextColor = array.getColor(R.styleable.ProgressBar_progressTextColor, mProgressTextColor);

        mProgressTextSize = array.getDimensionPixelSize(R.styleable.ProgressBar_progressTextSize, sp2px(mProgressTextSize));
        mRoundWidth = (int) array.getDimension(R.styleable.ProgressBar_roundWidth, dip2px(mRoundWidth));
        array.recycle();

初始化畫筆:

    /**
     * 根據(jù)繪制的顏色獲取畫筆
     * @param color
     */
    private Paint getPaint(int color){
        Paint paint=new Paint();
        paint.setAntiAlias(true);
        paint.setColor(color);
        paint.setStrokeWidth(mRoundWidth);
        paint.setStyle(Paint.Style.STROKE);
        return paint;
    }

初始化完成后巫橄,就在onMeasure()方法中進(jìn)行測(cè)量淘邻;

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int width = MeasureSpec.getSize(widthMeasureSpec);
        int height = MeasureSpec.getSize(heightMeasureSpec);
        //寬高不一致時(shí)區(qū)最小值
        width = Math.min(width, height);
        height = Math.min(width, height);
        setMeasuredDimension(width, height);
    }

為了保證寬高一致使用Math.min(width, height)方法取最小值,這里直接用三元運(yùn)算符也可以湘换,其實(shí)Math.min(width, height)方法也是用的是三元運(yùn)算符進(jìn)行計(jì)算的宾舅;
Math.min(width, height)方法源碼:

  * @param   a   an argument.
     * @param   b   another argument.
     * @return  the smaller of {@code a} and {@code b}.
     */
    public static int min(int a, int b) {
        return (a <= b) ? a : b;
    }

接下來(lái)進(jìn)行繪制:

   @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        int center = getWidth() / 2;
        //先繪制內(nèi)圓
        canvas.drawCircle(center, center, center - mRoundWidth / 2, mInnerPaint);

        //繪制外圓 畫圓弧
        if (mMax == 0) {
            return;
        }
        RectF rectf = new RectF(0 + mRoundWidth / 2, 0 + mRoundWidth / 2, getWidth() - mRoundWidth / 2, getHeight() - mRoundWidth / 2);
        float preProgree = (float) mCurrentProgress / mMax;
        canvas.drawArc(rectf, 0, preProgree * 360, false, mOutterPaint);

        //繪制進(jìn)度文字
        String text = ((int)(preProgree * 100)) + "%";
        Rect rect = new Rect();
        textPaint.getTextBounds(text, 0, text.length(), rect);

        int x = getWidth() / 2 - rect.width() / 2;
        Paint.FontMetricsInt metricsInt = textPaint.getFontMetricsInt();
        int dy = (metricsInt.bottom - metricsInt.top) / 2 - metricsInt.bottom;
        int baseLine = getHeight() / 2 + dy;
        canvas.drawText(text, x, baseLine, textPaint);
    }

繪制外圓的時(shí)候需要注意,外圓調(diào)用的不是canvas.drawCircle()方法彩倚,而是調(diào)用canvas.drawArc()繪制圓弧的方法進(jìn)行繪制筹我,這樣效果就繪制完成了;接著又簡(jiǎn)單實(shí)現(xiàn)了下仿58的一個(gè)數(shù)據(jù)加載的效果帆离;

device-2017-06-28-120345.gif

這里就只實(shí)現(xiàn)了圓崎溃,正方形,正三角的一個(gè)切換效果盯质,這個(gè)效果也是采用繪制實(shí)現(xiàn)的袁串;在繪制的時(shí)候要定義一個(gè)變量用來(lái)表明當(dāng)前繪制的是哪個(gè)圖形;

    public enum Shape {
        Circle, Square, Triangle
    }

這里用枚舉來(lái)控制當(dāng)前應(yīng)該繪制哪個(gè)圖形呼巷;同時(shí)在繪制完一個(gè)圖形后還要改變當(dāng)前的這個(gè)狀態(tài)值囱修;比如,繪制完圓王悍,就要將狀態(tài)改成正方形破镰,繪制完正方形,就要將狀態(tài)改成正三角压储,一直這樣循環(huán)的去繪制鲜漩;

     /**
     * 改變當(dāng)前繪制的狀態(tài)
     */
    public void exchange() {
        switch (mCurrentShape) {
            case Circle:
                mCurrentShape = Shape.Square;
                break;
            case Square:
                mCurrentShape = Shape.Triangle;
                break;
            case Triangle:
                mCurrentShape = Shape.Circle;
                break;
        }
        //進(jìn)行繪制
        invalidate();
    }

調(diào)用invalidate();最終就會(huì)去調(diào)用onDraw();方法進(jìn)行繪制;

   @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        switch (mCurrentShape) {
            case Circle:
                //畫圓形
                int center = getWidth() / 2;
                mPaint.setColor(mCircleColor);
                canvas.drawCircle(center, center, center, mPaint);
                break;
            case Square:
                //畫正方形
                mPaint.setColor(mSquareColor);
                canvas.drawRect(0, 0, getWidth(), getHeight(), mPaint);
                break;
            case Triangle:
                //畫三角形  繪制路線
                mPaint.setColor(mTriangleColor);
                if (mPath == null) {
                    mPath = new Path();
                    mPath.moveTo(getWidth() / 2, 0);
                    mPath.lineTo(0, (float) (getWidth() / 2 * Math.sqrt(3)));
                    mPath.lineTo(getWidth(), (float) (getWidth() / 2 * Math.sqrt(3)));
//                    path.lineTo(getWidth()/2,0);
                    //將繪制的路徑閉合
                    mPath.close();
                }
                canvas.drawPath(mPath, mPaint);

                break;
        }
    }

繪制圓或者正方形的時(shí)候調(diào)用相應(yīng)的方法就可以進(jìn)行繪制了集惋,對(duì)于三角形的繪制并沒(méi)有提供相應(yīng)的方法孕似,就要采用繪制路線的方式進(jìn)行繪制,

QQ截圖20170628163950.jpg

從A點(diǎn)繪制到B點(diǎn)刮刑,從B點(diǎn)繪制到C點(diǎn)喉祭,從C點(diǎn)繪制到A點(diǎn)就可以了;從C點(diǎn)繪制到A點(diǎn)的時(shí)候雷绢,不采用這種方式也可以泛烙,從B點(diǎn)繪制到C點(diǎn)后直接調(diào)用mPath.close();方法將繪制路線閉合就可以了;因?yàn)橐L制的是等邊三角形翘紊,在繪制的時(shí)候就要注意高度并不是getHeight();了蔽氨,這里就要用到正弦這些東西來(lái)計(jì)算了,繪制的寬度是知道的,還是getWidth()鹉究,角度也知道中捆,計(jì)算出高度就可以繪制了,繪制完成后坊饶,運(yùn)行下就可以了泄伪。
源碼地址:http://pan.baidu.com/s/1i587fnv

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市匿级,隨后出現(xiàn)的幾起案子蟋滴,更是在濱河造成了極大的恐慌,老刑警劉巖痘绎,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件津函,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡孤页,警方通過(guò)查閱死者的電腦和手機(jī)尔苦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)行施,“玉大人允坚,你說(shuō)我怎么就攤上這事《旰牛” “怎么了稠项?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)鲜结。 經(jīng)常有香客問(wèn)我展运,道長(zhǎng),這世上最難降的妖魔是什么精刷? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任拗胜,我火速辦了婚禮,結(jié)果婚禮上怒允,老公的妹妹穿的比我還像新娘埂软。我一直安慰自己,他們只是感情好误算,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布仰美。 她就那樣靜靜地躺著,像睡著了一般儿礼。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上庆寺,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天蚊夫,我揣著相機(jī)與錄音,去河邊找鬼懦尝。 笑死知纷,一個(gè)胖子當(dāng)著我的面吹牛壤圃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播琅轧,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼伍绳,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了乍桂?” 一聲冷哼從身側(cè)響起冲杀,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎睹酌,沒(méi)想到半個(gè)月后权谁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡憋沿,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年旺芽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辐啄。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡采章,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出壶辜,到底是詐尸還是另有隱情共缕,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布士复,位于F島的核電站图谷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏阱洪。R本人自食惡果不足惜便贵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望冗荸。 院中可真熱鬧承璃,春花似錦、人聲如沸蚌本。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)程癌。三九已至舷嗡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嵌莉,已是汗流浹背进萄。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人中鼠。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓可婶,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親援雇。 傳聞我的和親對(duì)象是個(gè)殘疾皇子矛渴,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容