亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

Android自定義控件實現餅狀圖

2019-10-21 21:31:54
字體:
來源:轉載
供稿:網友

本文實現一個如圖所示的控件,包括兩部分,左邊的餅狀圖和中間的兩個小方塊,及右邊的兩行文字

Android,自定義控件,餅狀圖

實現起來比較簡單,只是一些繪圖API的調用

核心代碼在onDraw函數里邊,對靜態控件進行繪制即可

@Overrideprotected void onDraw(Canvas canvas) { super.onDraw(canvas); /** * 餅狀圖的x坐標 */ float centreX= getWidth()/5; /** * 餅狀圖的y坐標 */ float centreY= getHeight()/2; /** * 文字的大小 */ float textSize=getHeight()/7; float width=(float)getWidth(); float height=(float)getHeight(); /** * 中間小正方形邊長的一半 */ float halfSmallRec =((float)getHeight())*3/70; percent =((float) mBigBallNumber)/(mBigBallNumber + mSmallBallNumber); /** * 求餅狀圖的半徑 */ radius= Math.min(getWidth() * 1 / 8, getHeight() * 10 / 35); /** * 構建一個正方形,餅狀圖是這個正方形的內切圓 */ rectf=new RectF((int)(centreX-radius),(int)(centreY-radius),(int)(centreX+radius),(int)(centreY+radius)); /** * 設置餅狀圖畫筆的顏色,先繪制大球占的比例 */ piePaint.setColor(mBigBallColor); /* The arc is drawn clockwise. An angle of 0 degrees correspond to the * geometric angle of 0 degrees (3 o'clock on a watch.)*/ /* drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter,Paint paint)*/ /** * 繪制大球的扇形圖,float startAngle起始角度的0度的位置在3點鐘方向 * 因此大球的扇形圖要從12點鐘開始繪制,所以起始角度為270度 */ canvas.drawArc(rectf, 270, 360 * percent, true, piePaint); /** * 換種顏色,開始繪制小球占的餅狀圖 */ piePaint.setColor(mSmallBallColor); /** * 起始角度就是12點鐘加上360度乘以大球占的比例,12點鐘轉換為起始角度為270度 */ canvas.drawArc(rectf, 270 + 360 * percent, 360 - 360 * percent, true, piePaint); 顏色更改為大球的顏色*/ piePaint.setColor(mBigBallColor); /** * 繪制上邊的小方塊,也就是大球的方塊 */ canvas.drawRect(width * 2 / 5 - halfSmallRec, height* 23/ 60 - halfSmallRec, width * 2 / 5 + halfSmallRec, height *23/ 60 + halfSmallRec, piePaint); /** * 更改畫筆顏色為小球顏色 */ piePaint.setColor(mSmallBallColor); /** * 繪制下邊的小方塊即小球的小方塊 */ canvas.drawRect(width * 2 / 5 - halfSmallRec, height * 37 / 60 - halfSmallRec, width * 2 / 5 + halfSmallRec, height * 37 / 60 + halfSmallRec, piePaint); /** * 開始繪制文字,先設置文字顏色 */ textPaint.setColor(getResources().getColor(typedValue.resourceId)); /** * 設置問題大小 */ textPaint.setTextSize(textSize); /** * 大球數量 */ String strBig = strBigBallName + mBigBallNumber; /** * 測量文字寬度 */ float textBigWidth =textPaint.measureText(strBig); Paint.FontMetrics fontMetrics=textPaint.getFontMetrics(); /** * 繪制上邊大球數量 */ canvas.drawText(strBig, width * 9 / 20 + textBigWidth / 2, height *23/ 60 - fontMetrics.top / 3, textPaint); /** * 小球數量 */ String strSmall = strSmallBallName + mSmallBallNumber; /** * 測量文字寬度 */ float textUnderWidth=textPaint.measureText(strSmall); /** * 繪制下邊的小球數量 */ canvas.drawText(strSmall,width*9/20+textUnderWidth/2,height*37/60-fontMetrics.top/3,textPaint); /** * 更改畫筆顏色,開始繪制百分比 */ textPaint.setColor(getResources().getColor(R.color.half_transparent)); String strBigPercent =" ("+ mPercentBigBall +")"; /** * 測量大球百分比文字寬度 */ float bigPercent =textPaint.measureText(strBigPercent); /**drawText(String text, float x, float y, Paint paint) * 繪制文字的API,四個參數分別是文字內容,起始繪制x坐標,起始繪制y坐標,畫筆 * 以為設置了居中繪制,因此穿進去的xy坐標為文字的中心點 */ canvas.drawText(strBigPercent, width * 9 / 20+ textBigWidth + bigPercent /2, height*23 / 60-fontMetrics.top*1/3, textPaint); /** * 同樣的道理繪制小球的百分比 */ String strSmallPercent =" ("+ mPercentSmallBall +")"; float smallPercent =textPaint.measureText(strSmallPercent); canvas.drawText(strSmallPercent,width*9/20+textUnderWidth+ smallPercent /2,height*37/60-fontMetrics.top/3,textPaint);}

Canvas 繪制文本時,使用FontMetrics對象,計算位置的坐標。參考:使用FontMetrics對象計算位置坐標

Android,自定義控件,餅狀圖

設置文字繪制以中心為起點開始繪制

textPaint.setTextAlign(Paint.Align.CENTER);

x的坐標好計算,y坐標需要按需使用FontMetrics幾個屬性即可

完整代碼如下:

public class PieHalfView extends View { /** * 左邊餅狀圖的畫筆 */ private Paint piePaint; /** * 右邊文字的畫筆 */ private Paint textPaint; /** * 餅狀圖的半徑 */ private float radius; private RectF rectf; /** * 餅狀圖中第一個扇形占整個圓的比例 */ private float percent; /** * 深淺兩種顏色 */ private int mBigBallColor, mSmallBallColor; /** * 大小球的數量 */ private int mBigBallNumber; private int mSmallBallNumber; /** * 大小球所占的百分比 */ private String mPercentBigBall; private String mPercentSmallBall; /** * 動態獲取屬性 */ private TypedValue typedValue; /** * 中間的文字信息 */ private String strBigBallName; private String strSmallBallName;  public PieHalfView(Context context) { super(context); init(context); }  public PieHalfView(Context context, AttributeSet attrs) { super(context, attrs); init(context); }  public PieHalfView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context); } private void init(Context context) { /** * 設置餅狀圖畫筆 */ piePaint =new Paint(); piePaint.setAntiAlias(true); piePaint.setStyle(Paint.Style.FILL); /** * 設置文字畫筆 */ textPaint=new Paint(); textPaint.setStyle(Paint.Style.STROKE); textPaint.setAntiAlias(true); textPaint.setTextAlign(Paint.Align.CENTER); /** * 下邊設置一些默認的值,如果調用者沒有傳值進來的話,用這些默認值 */ mBigBallColor = 0xFF9CCA5D; mSmallBallColor =0xFF5F7048; /*TypedValue:Container for a dynamically typed data value. Primarily used with Resources for holding resource values.*/ typedValue=new TypedValue(); context.getTheme().resolveAttribute(R.attr.maintextclor,typedValue,true); mBigBallNumber =1; mSmallBallNumber =3; mPercentBigBall ="40%"; mPercentSmallBall ="60%"; strBigBallName =getResources().getString(R.string.big); strSmallBallName =getResources().getString(R.string.small); }  @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); /** * 餅狀圖的x坐標 */ float centreX= getWidth()/5; /** * 餅狀圖的y坐標 */ float centreY= getHeight()/2; /** * 文字的大小 */ float textSize=getHeight()/7; float width=(float)getWidth(); float height=(float)getHeight(); /** * 中間小正方形邊長的一半 */ float halfSmallRec =((float)getHeight())*3/70; percent =((float) mBigBallNumber)/(mBigBallNumber + mSmallBallNumber); /** * 求餅狀圖的半徑 */ radius= Math.min(getWidth() * 1 / 8, getHeight() * 10 / 35); /** * 構建一個正方形,餅狀圖是這個正方形的內切圓 */ rectf=new RectF((int)(centreX-radius),(int)(centreY-radius),(int)(centreX+radius),(int)(centreY+radius)); /** * 設置餅狀圖畫筆的顏色,先繪制大球占的比例 */ piePaint.setColor(mBigBallColor); /* The arc is drawn clockwise. An angle of 0 degrees correspond to the * geometric angle of 0 degrees (3 o'clock on a watch.)*/ /* drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter,Paint paint)*/ /* 繪制大球的扇形圖,float startAngle起始角度的0度的位置在3點鐘方向 * 因此大球的扇形圖要從12點鐘開始繪制,所以起始角度為270度*/ canvas.drawArc(rectf, 270, 360 * percent, true, piePaint); /** * 換種顏色,開始繪制小球占的餅狀圖 */ piePaint.setColor(mSmallBallColor); /** * 起始角度就是12點鐘加上360度乘以大球占的比例,12點鐘轉換為起始角度為270度 */ canvas.drawArc(rectf, 270 + 360 * percent, 360 - 360 * percent, true, piePaint); /** * 顏色更改為大球的顏色*/  piePaint.setColor(mBigBallColor); /** * 繪制上邊的小方塊,也就是大球的方塊 */ canvas.drawRect(width * 2 / 5 - halfSmallRec, height* 23/ 60 - halfSmallRec, width * 2 / 5 + halfSmallRec, height *23/ 60 + halfSmallRec, piePaint); /** * 更改畫筆顏色為小球顏色 */ piePaint.setColor(mSmallBallColor); /** * 繪制下邊的小方塊即小球的小方塊 */ canvas.drawRect(width * 2 / 5 - halfSmallRec, height * 37 / 60 - halfSmallRec, width * 2 / 5 + halfSmallRec, height * 37 / 60 + halfSmallRec, piePaint); /** * 開始繪制文字,先設置文字顏色 */ textPaint.setColor(getResources().getColor(typedValue.resourceId)); /** * 設置問題大小 */ textPaint.setTextSize(textSize); /** * 大球數量 */ String strBig = strBigBallName + mBigBallNumber; /** * 測量文字寬度 */ float textBigWidth =textPaint.measureText(strBig); Paint.FontMetrics fontMetrics=textPaint.getFontMetrics(); /** * 繪制上邊大球數量 */ canvas.drawText(strBig, width * 9 / 20 + textBigWidth / 2, height *23/ 60 - fontMetrics.top / 3, textPaint); /** * 小球數量 */ String strSmall = strSmallBallName + mSmallBallNumber; /** * 測量文字寬度 */ float textUnderWidth=textPaint.measureText(strSmall); /** * 繪制下邊的小球數量 */ canvas.drawText(strSmall,width*9/20+textUnderWidth/2,height*37/60-fontMetrics.top/3,textPaint); /** * 更改畫筆顏色,開始繪制百分比 */ textPaint.setColor(getResources().getColor(R.color.half_transparent)); String strBigPercent =" ("+ mPercentBigBall +")"; /** * 測量大球百分比文字寬度*/ float bigPercent =textPaint.measureText(strBigPercent); /** drawText(String text, float x, float y, Paint paint) * 繪制文字的API,四個參數分別是文字內容,起始繪制x坐標,起始繪制y坐標,畫筆 * 以為設置了居中繪制,因此穿進去的xy坐標為文字的中心點 */ canvas.drawText(strBigPercent, width * 9 / 20+ textBigWidth + bigPercent /2, height*23 / 60-fontMetrics.top*1/3, textPaint); /* * 同樣的道理繪制小球的百分比 */ String strSmallPercent =" ("+ mPercentSmallBall +")"; float smallPercent =textPaint.measureText(strSmallPercent); canvas.drawText(strSmallPercent,width*9/20+textUnderWidth+ smallPercent /2,height*37/60-fontMetrics.top/3,textPaint); } public void setPercent(float percent1){ this.percent =percent1; invalidate(); } public void setColor(int mBigBallColor,int mSmallBallColor){ this.mBigBallColor =mBigBallColor; this.mSmallBallColor =mSmallBallColor; invalidate(); }  public void setOverRunner(String bigPecent, String smallPercent, int big, int small, int bigColor, int smallColor){ this.mPercentBigBall = bigPecent; this.mPercentSmallBall = smallPercent; this.mBigBallNumber = big; this.mSmallBallNumber = small; this.mBigBallColor = bigColor; this.mSmallBallColor = smallColor; invalidate(); }}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品在线免费观看| 欧美日韩在线另类| 日韩中文字幕在线视频播放| 亚洲色图激情小说| 亚洲第一区中文字幕| 国模私拍一区二区三区| 国产一区二区三区免费视频| 91免费精品国偷自产在线| 亚洲影视九九影院在线观看| 欧美日韩一区二区在线播放| 亚洲男人7777| 在线中文字幕日韩| 中文字幕av一区中文字幕天堂| 国产精品久久久久久久久免费看| 久久久国产一区二区| 欧美日韩亚洲视频| 久久成年人免费电影| 成人在线国产精品| 国产91色在线| 国产丝袜精品第一页| 色婷婷av一区二区三区在线观看| 欧美成人精品一区二区| zzijzzij亚洲日本成熟少妇| 国产精品久久久久久久久久99| 亚洲女性裸体视频| 欧美电影免费播放| 国a精品视频大全| 国内精品免费午夜毛片| 精品久久久久久电影| 久久五月天色综合| 欧美激情高清视频| 欧美性猛交视频| 亚洲欧美国内爽妇网| 国产欧美精品xxxx另类| 欧美日韩中国免费专区在线看| 成人免费福利在线| 日韩av片永久免费网站| 日韩国产欧美精品一区二区三区| 亚洲欧美另类自拍| 国产精品扒开腿做爽爽爽男男| 7m第一福利500精品视频| 91超碰caoporn97人人| 国外日韩电影在线观看| 欧美一级bbbbb性bbbb喷潮片| 久久久www成人免费精品张筱雨| 亚洲综合社区网| 57pao成人永久免费视频| 性色av一区二区三区| 国产精品男人的天堂| 黄色精品在线看| 亚洲电影天堂av| 国产色综合天天综合网| 久久国产精品影片| 日韩美女视频中文字幕| 久久精品国产亚洲一区二区| 中文字幕亚洲国产| 亚州成人av在线| 国产精品久久久亚洲| 欧美理论在线观看| 成人免费观看a| xx视频.9999.com| 亚洲人成77777在线观看网| 久久久久久久久久久人体| 久久久久久久久电影| 日韩黄色高清视频| 欧美极品美女视频网站在线观看免费| 欧美日韩在线观看视频| 日本精品久久久| 亚洲精品中文字幕有码专区| 亚洲第一区在线观看| 日本精品视频在线播放| 国产精品久久久久秋霞鲁丝| 欧美日韩在线影院| 成人妇女淫片aaaa视频| 欧美一级在线亚洲天堂| 97婷婷涩涩精品一区| 国产精品香蕉国产| 国产精品扒开腿做爽爽爽的视频| 美女福利视频一区| 亚洲毛片在线看| 亚洲精品720p| 97国产精品视频| 精品国产成人在线| 青青草成人在线| 亚洲精品久久久久中文字幕二区| 欧美成年人视频网站欧美| 欧美成在线视频| 91av视频在线播放| 一本色道久久综合狠狠躁篇怎么玩| 中文字幕亚洲欧美日韩2019| 久久久中文字幕| 欧美精品日韩三级| 国产精品久在线观看| 成人h视频在线| 色偷偷88888欧美精品久久久| 精品国产一区二区三区四区在线观看| 欧美疯狂做受xxxx高潮| 亚洲黄色成人网| 久久中文久久字幕| 欧美专区在线观看| 欧美午夜xxx| 国产精品第100页| 国产欧美一区二区三区四区| 亚洲国产另类久久精品| 久久精品夜夜夜夜夜久久| 久久九九国产精品怡红院| 欧美成人在线免费视频| 96pao国产成视频永久免费| 乱亲女秽乱长久久久| 97久久久免费福利网址| 蜜臀久久99精品久久久无需会员| 欧美一级大片在线免费观看| 色综合视频网站| 国产精品一区二区久久久久| 国产精品视频最多的网站| 亚洲性生活视频| 91精品在线观看视频| 在线亚洲国产精品网| 日韩三级成人av网| 成人av在线亚洲| 久久精品国产69国产精品亚洲| 91免费国产网站| 日本91av在线播放| 久久久久久久久久久国产| 国产69精品久久久| 精品福利樱桃av导航| 97在线看福利| 国产精品中文字幕久久久| 国产一区二区三区在线免费观看| 粉嫩av一区二区三区免费野| 欧美美女18p| 亚洲理论片在线观看| 日韩欧美a级成人黄色| 国产成人激情小视频| 亚洲人成欧美中文字幕| 国产精品自产拍在线观| 97视频免费在线看| 国产美女久久精品香蕉69| 欧美大尺度在线观看| 97超级碰碰碰久久久| 欧美激情一区二区三区成人| 午夜精品久久久久久久99热| 日韩欧美在线播放| 久久久久久久久久久成人| 中文字幕日韩在线视频| 国产精品视频不卡| 国产日韩精品在线观看| 日韩精品在线电影| 久久夜色精品国产| 亚洲人成伊人成综合网久久久| 成人性生交大片免费观看嘿嘿视频| 国产精品高潮视频| 欧美网站在线观看| 91久久国产精品91久久性色| 日韩欧美极品在线观看| 日韩日本欧美亚洲| 国语自产精品视频在线看一大j8| 91免费人成网站在线观看18| 欧美综合第一页| 日日骚久久av| 中文字幕精品在线视频| 日韩女在线观看| 亚洲一二在线观看| 久久久女女女女999久久|