日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

自定义控件之-----progressBar

發布時間:2025/3/13 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 自定义控件之-----progressBar 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

寫了那一年多代碼都沒有認認真真寫過自定義控件,最近看到網易新聞里面的加載圖標如圖

感覺很有意思,就準備自己寫個玩玩。在api里面腦補了一些canvas的姿勢,就上了,效果如下。

說實話真心不難,自定義控件比起平時做的應用多了幾分自由和創作的快感,可能我應該去做游戲,代碼如下,注釋已經寫的很白癡了:

?

[java]?view plaincopyprint?
  • package?com.example.circleprogressbar;??
  • ??
  • import?android.content.Context;??
  • import?android.graphics.Canvas;??
  • import?android.graphics.Color;??
  • import?android.graphics.Paint;??
  • import?android.graphics.RectF;??
  • import?android.util.AttributeSet;??
  • import?android.view.View;??
  • ??
  • public?class?CircleProgressBarView?extends?View?{??
  • ????private?int?progress;??
  • ????private?int?max;??
  • ????private?Paint?paint;??
  • ????private?RectF?oval;??
  • ????public?int?getMax()?{??
  • ????????return?max;??
  • ????}??
  • ????public?void?setMax(int?max)?{??
  • ????????this.max?=?max;??
  • ????}??
  • ????public?int?getProgress()?{??
  • ????????return?progress;??
  • ????}??
  • ????public?void?setProgress(int?progress)?{??
  • ????????this.progress?=?progress;??
  • ????????invalidate();??
  • ????}??
  • ??
  • ????public?CircleProgressBarView(Context?context,?AttributeSet?attrs)?{??
  • ????????super(context,?attrs);??
  • ????????paint?=?new?Paint();??
  • ????????oval?=?new?RectF();??
  • ????}??
  • ??
  • ????@Override??
  • ????protected?void?onDraw(Canvas?canvas)?{??
  • ????????super.onDraw(canvas);??
  • ????????paint.setAntiAlias(true);//?設置是否抗鋸齒??
  • ????????paint.setFlags(Paint.ANTI_ALIAS_FLAG);//?幫助消除鋸齒??
  • ????????paint.setColor(Color.GRAY);//?設置畫筆灰色??
  • ????????paint.setStrokeWidth(10);//?設置畫筆寬度??
  • ????????paint.setStyle(Paint.Style.STROKE);//?設置中空的樣式??
  • ????????canvas.drawCircle(100,?100,?55,?paint);//?在中心為(100,100)的地方畫個半徑為55的圓,寬度為setStrokeWidth:10,也就是灰色的底邊??
  • ????????paint.setColor(Color.GREEN);//?設置畫筆為綠色??
  • ????????oval.set(45,?45,?155,?155);//?設置類似于左上角坐標(45,45),右下角坐標(155,155),這樣也就保證了半徑為55??
  • ????????canvas.drawArc(oval,?-90,?((float)?progress?/?max)?*?360,?false,?paint);//?畫圓弧,第二個參數為:起始角度,第三個為跨的角度,第四個為true的時候是實心,false的時候為空心??
  • ????????paint.reset();//?將畫筆重置??
  • ????????paint.setStrokeWidth(3);//?再次設置畫筆的寬度??
  • ????????paint.setTextSize(35);//?設置文字的大小??
  • ????????paint.setColor(Color.BLACK);//?設置畫筆顏色??
  • ????????if?(progress?==?max)?{??
  • ????????????canvas.drawText("完成",?70,?110,?paint);??
  • ????????}?else?{??
  • ????????????canvas.drawText(progress?+?"%",?70,?110,?paint);??
  • ????????}??
  • ????}??
  • }??
  • ?

    [html]?view plaincopyprint?
  • <RelativeLayout?xmlns:android="http://schemas.android.com/apk/res/android"??
  • ????xmlns:tools="http://schemas.android.com/tools"??
  • ????android:layout_width="match_parent"??
  • ????android:layout_height="match_parent"??
  • ????android:paddingBottom="@dimen/activity_vertical_margin"??
  • ????android:paddingLeft="@dimen/activity_horizontal_margin"??
  • ????android:paddingRight="@dimen/activity_horizontal_margin"??
  • ????android:paddingTop="@dimen/activity_vertical_margin"??
  • ????tools:context=".CirclePbActivity"?>??
  • ??
  • ????<com.example.circleprogressbar.CircleProgressBarView??
  • ????????android:id="@+id/circleProgressBar"??
  • ????????android:layout_width="wrap_content"??
  • ????????android:layout_height="wrap_content"?/>??
  • </RelativeLayout>??
  • ?

    [java]?view plaincopyprint?
  • package?com.example.circleprogressbar;??
  • ??
  • import?android.os.Bundle;??
  • import?android.os.Handler;??
  • import?android.app.Activity;??
  • import?android.view.Menu;??
  • ??
  • public?class?CirclePbActivity?extends?Activity?{??
  • ????private?CircleProgressBarView?testConvas;??
  • ????private?int?i?=?0;??
  • ????Handler?handler?=?new?Handler()?{??
  • ????????public?void?handleMessage(android.os.Message?msg)?{??
  • ????????????testConvas.setProgress(msg.what);??
  • ????????????if?(i?<=?testConvas.getMax())?{??
  • ????????????????handler.sendEmptyMessageDelayed(i++,?50);??
  • ????????????}??
  • ????????};??
  • ????};??
  • ????@Override??
  • ????protected?void?onCreate(Bundle?savedInstanceState)?{??
  • ????????super.onCreate(savedInstanceState);??
  • ????????setContentView(R.layout.activity_circle_progressbar);??
  • ????????testConvas?=?(CircleProgressBarView)?findViewById(R.id.circleProgressBar);??
  • ????????testConvas.setMax(100);??
  • ????????handler.sendEmptyMessageDelayed(i++,?50);??
  • ????}??
  • }??

  • 做了圓形的,一不做二不休,把horizontalProgressBar也做了一遍,加了一點創意要素,立馬多了幾分藝術氣息(其實好像更俗氣了),各位可以自己發揮想象力。

    ?


    ?

    [java]?view plaincopyprint?
  • package?com.example.circleprogressbar;??
  • ??
  • import?android.annotation.SuppressLint;??
  • import?android.content.Context;??
  • import?android.graphics.Bitmap;??
  • import?android.graphics.BitmapFactory;??
  • import?android.graphics.Canvas;??
  • import?android.graphics.Color;??
  • import?android.graphics.Paint;??
  • import?android.util.AttributeSet;??
  • import?android.view.View;??
  • ??
  • @SuppressLint("DrawAllocation")??
  • public?class?HorizontalProgressBarView?extends?View?{??
  • ????private?int?progress?=?50;??
  • ????private?int?max?=?100;??
  • ????private?int?mwidth?=?450;??
  • ????private?int?mhight?=?40;??
  • ????private?int?startX;??
  • ????private?int?startY;??
  • ????private?Paint?paint;??
  • ??
  • ????public?int?getMwidth()?{??
  • ????????return?mwidth;??
  • ????}??
  • ??
  • ????public?void?setMwidth(int?mwidth)?{??
  • ????????this.mwidth?=?mwidth;??
  • ????}??
  • ??
  • ????public?int?getMhight()?{??
  • ????????return?mhight;??
  • ????}??
  • ??
  • ????public?void?setMhight(int?mhight)?{??
  • ????????this.mhight?=?mhight;??
  • ????}??
  • ??
  • ????public?int?getProgress()?{??
  • ????????return?progress;??
  • ????}??
  • ??
  • ????public?void?setProgress(int?progress)?{??
  • ????????this.progress?=?progress;??
  • ????????invalidate();??
  • ????}??
  • ??
  • ????public?int?getMax()?{??
  • ????????return?max;??
  • ????}??
  • ??
  • ????public?void?setMax(int?max)?{??
  • ????????this.max?=?max;??
  • ????}??
  • ??
  • ????public?HorizontalProgressBarView(Context?context,?AttributeSet?attrs)?{??
  • ????????super(context,?attrs);??
  • ????????paint?=?new?Paint();??
  • ????}??
  • ??
  • ????@Override??
  • ????protected?void?onDraw(Canvas?canvas)?{??
  • ????????super.onDraw(canvas);??
  • ????????paint.setAntiAlias(true);//?設置是否抗鋸齒??
  • ????????paint.setFlags(Paint.ANTI_ALIAS_FLAG);//?幫助消除鋸齒??
  • ????????paint.setColor(Color.parseColor("#EFEFEF"));//?設置畫筆灰色??
  • ????????paint.setStrokeWidth(10);//?設置畫筆寬度??
  • ????????canvas.drawRect(startX,?startY,?mwidth,?mhight,?paint);??
  • ????????paint.setColor(Color.parseColor("#76B034"));??
  • ????????canvas.drawRect(startX,?startY,?((float)?progress?/?max)?*?mwidth,??
  • ????????????????mhight,?paint);??
  • ????????//?繪制內部線條??
  • ????????paint.setStrokeWidth(2);??
  • ????????paint.setColor(Color.YELLOW);??
  • ????????canvas.drawLine(startX,?startY?+?(mhight?-?startY)?/?4?*?1,??
  • ????????????????((float)?progress?/?max)?*?mwidth,?startY?+?(mhight?-?startY)??
  • ????????????????????????/?4?*?1,?paint);??
  • ????????paint.setColor(Color.RED);??
  • ????????canvas.drawLine(startX,?startY?+?(mhight?-?startY)?/?4?*?2,??
  • ????????????????((float)?progress?/?max)?*?mwidth,?startY?+?(mhight?-?startY)??
  • ????????????????????????/?4?*?2,?paint);??
  • ????????paint.setColor(Color.WHITE);??
  • ????????canvas.drawLine(startX,?startY?+?(mhight?-?startY)?/?4?*?3,??
  • ????????????????((float)?progress?/?max)?*?mwidth,?startY?+?(mhight?-?startY)??
  • ????????????????????????/?4?*?3,?paint);??
  • ????????//?繪制下標進度數字??
  • ????????if(progress<(max/3)){??
  • ????????????paint.setColor(Color.BLACK);??
  • ????????}else?if(progress<(max/3)*2&&progress>(max/3)){??
  • ????????????paint.setColor(Color.YELLOW);??
  • ????????}else{??
  • ????????????paint.setColor(Color.RED);??
  • ????????}??
  • ????????paint.setTextSize(30);??
  • ????????canvas.drawText(progress?+?"%",?((float)?progress?/?max)?*?mwidth?-?20,??
  • ????????????????mhight?+?30,?paint);??
  • ????}??
  • }??
  • 最后談一下感想:

    ?

    總感覺學的越多,自己的想象力和創新能力越枯竭,代碼敲多了,腦袋敲不靈活了,以前沒接觸程序的時候有很多的想法,現在感覺自己越來越平庸,沒了那份想象力,和搬磚的有什么區別?天朝的教育讓能很快學會人家的技術,但是永遠跟著別人后面,就看各大布局,各種控件,基本上都是學國外的。哎,不吐槽了,已經這樣了,我希望能保存自己僅有的那份想象力,在敲代碼的時候多想想自己能創造什么,一次從無到有,比重復千萬次人家的都有價值,我是這么認為的。

    ?

    原文:http://blog.csdn.net/mobilexu/article/details/9666461

    轉載于:https://www.cnblogs.com/veins/p/3719424.html

    總結

    以上是生活随笔為你收集整理的自定义控件之-----progressBar的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。