第一章 仿支付寶芝麻信用介面製作(需要自定義View的相關知識)
阿新 • • 發佈:2019-01-07
//構造器
//ondraw 方法是專門負責View的繪製方法,用畫筆畫出的圖形 都是在這個方法裡繪畫出來的;
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
//畫筆初始化方法
initPaint();
canvas.translate(viewWIdth/2, viewHeight/2);
outCircleRadius = (viewWIdth>=viewHeight?viewHeight:viewWIdth)/11.0f*5.0f;
INNERCIRCLERADIO=outCircleRadius/5.0f*2.9f;
CIRCLERADIO=outCircleRadius/5.0f*3.5f;
//這是兩個矩形 圓弧就是在矩形的內切
RectF oval1=new RectF(-outCircleRadius,-outCircleRadius,outCircleRadius,outCircleRadius);
RectF oval2=new RectF(-INNERCIRCLERADIO,-INNERCIRCLERADIO,INNERCIRCLERADIO,INNERCIRCLERADIO);
//繪製最外層底部的大圓弧
canvas.drawArc(oval1, STARTPOINT, ENDPOINT, false, outLinePaint);
//繪製最外層上面的圓弧
canvas.drawArc(oval1, STARTPOINT, CURRENTPOINT, false, outLineMovePaint);
//繪製內部的圓弧
canvas.drawArc(oval2, STARTPOINT, CURRENTPOINT, false, innerLinePaint);
//從資原始檔裡獲取指標圖片;
Bitmap icon = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
//獲取圖片高度寬度
int iconWidth= icon.getWidth();
int iconHeight= icon.getHeight();
double radius = (double)(STARTPOINT+CURRENTPOINT+180)/180.00*PI;
Matrix matrix = new Matrix();
// 縮放原圖
matrix.postScale(1f, 1f);
//設定圖片向圓心偏轉的角度;
matrix.postRotate(STARTPOINT+CURRENTPOINT+180);
// matrix.postRotate(STARTPOINT+CURRENTPOINT+180, iconWidth/3, iconHeight/2);
//重新生成圖片
Bitmap dstbmp = Bitmap.createBitmap(icon, 0, 0, iconWidth,iconHeight,matrix, true);
//
//將圖片繪製到出來
float bitmapLocalX = 0;
float bitmapLocalY = 0;
if(CURRENTPOINT>=0){
bitmapLocalX=(float) (-INNERCIRCLERADIO*Math.cos(radius)-iconWidth/4.0*Math.cos(radius)+iconHeight/2.0*Math.sin(radius));
bitmapLocalY=(float) (-INNERCIRCLERADIO*Math.sin(radius)-iconHeight/2.0*Math.cos(radius)+(iconWidth-iconWidth/4.0)*Math.sin(radius));
}
if(CURRENTPOINT>45){
bitmapLocalX=(float) (-INNERCIRCLERADIO*Math.cos(radius)-iconWidth/4.0*Math.cos(radius)-iconHeight/2.0*(float)Math.sin(radius));
bitmapLocalY=(float) (-INNERCIRCLERADIO*Math.sin(radius)-iconHeight/2.0*Math.cos(radius)-iconWidth/4.0*(float)Math.sin(radius));
}
if(CURRENTPOINT>135){
bitmapLocalX=(float) (-INNERCIRCLERADIO*Math.cos(radius)+(iconWidth-iconWidth/4.0)*Math.cos(radius)-iconHeight/2.0*Math.sin(radius));
bitmapLocalY=(float) (-INNERCIRCLERADIO*Math.sin(radius)+iconHeight/2.0*Math.cos(radius)-(iconWidth/4.0)*Math.sin(radius));
}
if(CURRENTPOINT>225){
bitmapLocalX=(float) (-INNERCIRCLERADIO*Math.cos(radius)+(iconWidth-iconWidth/4.0)*Math.cos(radius)+iconHeight/2.0*Math.sin(radius));
bitmapLocalY=(float) (-INNERCIRCLERADIO*Math.sin(radius)+iconHeight/2.0*Math.cos(radius)+(iconWidth-iconWidth/4.0)*Math.sin(radius));
}
canvas.drawBitmap(dstbmp,bitmapLocalX,bitmapLocalY, innerLinePaint);
//開始畫路徑
Path path = new Path();
//設定路徑的初始位置
path.moveTo(-CIRCLERADIO*((float)Math.cos(-PI/4.00)), (float) (-CIRCLERADIO*Math.sin(-PI/4.00)));
//通過迴圈繪出全部的路徑
for(int i = 0 ;i<31 ; i++){
path.lineTo(-CIRCLERADIO*((float)Math.cos(-PI/4.00+PI*0.05*i)), (float) (-CIRCLERADIO*Math.sin(-PI/4.00+PI*0.05*i)));
}
//將繪製好的路徑畫上去
canvas.drawPath(path, pathPaint);
//將信用列表資料迴圈畫到軌跡上方
float itemSpace = (float)((CIRCLERADIO*PI*1.5f-textPaint.measureText("950"))/(styles.length-1));
for(int i = 0;i<styles.length;i++){
//第二個和第三個引數分別為 文字的水平間隔和垂直間隔
canvas.drawTextOnPath(styles[i], path,itemSpace*i, -15.0f, textPaint);
}
if(CURRENTFIANLPOINT>ENDPOINT)CURRENTFIANLPOINT=ENDPOINT;
int showGrade=(int)(CURRENTPOINT*COMMONRADIO+300);
if(grade<550){
}
if(CURRENTPOINT==CURRENTFIANLPOINT){
showGrade=grade;
}
if(showGrade>grade){
showGrade=grade;
}
String innerText= String.valueOf(showGrade);
String creditDesc = getCreditDesc(showGrade);
String assessText1="評估時間";
String assessText2="2015.08.09";
//測量文字的寬度
float textTopWidth=innerTextPaint.measureText(innerText);
float textLowerWidth = innerTextPaint.measureText(creditDesc);
float textUnderWidth1 = underTextPaint.measureText(assessText1);
float textUnderWidth2 = underTextPaint.measureText(assessText2);
//測量畫筆的高度
float textHeight=(innerTextPaint.descent()- innerTextPaint.ascent());
//將文字繪畫上去 第三個 引數為設定上下間隔
canvas.drawText(innerText, (float)(-textTopWidth/2.0), 30, innerTextPaint);
canvas.drawText(creditDesc, (float)(-(textLowerWidth/4.0)), 90, innerLowerTextPaint);
canvas.drawText(assessText1, (float)(-(textUnderWidth1/2.0)), textHeight*2, underTextPaint);
canvas.drawText(assessText2, (float)(-(textUnderWidth2/2.0)), textHeight*2+30, underTextPaint);
if(CURRENTPOINT<CURRENTFIANLPOINT){
CURRENTPOINT+=1;
postInvalidate();
}else if(CURRENTPOINT>CURRENTFIANLPOINT){
CURRENTPOINT=CURRENTFIANLPOINT;
postInvalidate();
}
}
//ondraw 方法是專門負責View的繪製方法,用畫筆畫出的圖形 都是在這個方法裡繪畫出來的;
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
//畫筆初始化方法
initPaint();
canvas.translate(viewWIdth/2, viewHeight/2);
outCircleRadius = (viewWIdth>=viewHeight?viewHeight:viewWIdth)/11.0f*5.0f;
INNERCIRCLERADIO=outCircleRadius/5.0f*2.9f;
CIRCLERADIO=outCircleRadius/5.0f*3.5f;
//這是兩個矩形 圓弧就是在矩形的內切
RectF oval1=new RectF(-outCircleRadius,-outCircleRadius,outCircleRadius,outCircleRadius);
RectF oval2=new RectF(-INNERCIRCLERADIO,-INNERCIRCLERADIO,INNERCIRCLERADIO,INNERCIRCLERADIO);
//繪製最外層底部的大圓弧
canvas.drawArc(oval1, STARTPOINT, ENDPOINT, false, outLinePaint);
//繪製最外層上面的圓弧
canvas.drawArc(oval1, STARTPOINT, CURRENTPOINT, false, outLineMovePaint);
//繪製內部的圓弧
canvas.drawArc(oval2, STARTPOINT, CURRENTPOINT, false, innerLinePaint);
//從資原始檔裡獲取指標圖片;
Bitmap icon = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
//獲取圖片高度寬度
int iconWidth= icon.getWidth();
int iconHeight= icon.getHeight();
double radius = (double)(STARTPOINT+CURRENTPOINT+180)/180.00*PI;
Matrix matrix = new Matrix();
// 縮放原圖
matrix.postScale(1f, 1f);
//設定圖片向圓心偏轉的角度;
matrix.postRotate(STARTPOINT+CURRENTPOINT+180);
// matrix.postRotate(STARTPOINT+CURRENTPOINT+180, iconWidth/3, iconHeight/2);
//重新生成圖片
Bitmap dstbmp = Bitmap.createBitmap(icon, 0, 0, iconWidth,iconHeight,matrix, true);
//
//將圖片繪製到出來
float bitmapLocalX = 0;
float bitmapLocalY = 0;
if(CURRENTPOINT>=0){
bitmapLocalX=(float) (-INNERCIRCLERADIO*Math.cos(radius)-iconWidth/4.0*Math.cos(radius)+iconHeight/2.0*Math.sin(radius));
bitmapLocalY=(float) (-INNERCIRCLERADIO*Math.sin(radius)-iconHeight/2.0*Math.cos(radius)+(iconWidth-iconWidth/4.0)*Math.sin(radius));
}
if(CURRENTPOINT>45){
bitmapLocalX=(float) (-INNERCIRCLERADIO*Math.cos(radius)-iconWidth/4.0*Math.cos(radius)-iconHeight/2.0*(float)Math.sin(radius));
bitmapLocalY=(float) (-INNERCIRCLERADIO*Math.sin(radius)-iconHeight/2.0*Math.cos(radius)-iconWidth/4.0*(float)Math.sin(radius));
}
if(CURRENTPOINT>135){
bitmapLocalX=(float) (-INNERCIRCLERADIO*Math.cos(radius)+(iconWidth-iconWidth/4.0)*Math.cos(radius)-iconHeight/2.0*Math.sin(radius));
bitmapLocalY=(float) (-INNERCIRCLERADIO*Math.sin(radius)+iconHeight/2.0*Math.cos(radius)-(iconWidth/4.0)*Math.sin(radius));
}
if(CURRENTPOINT>225){
bitmapLocalX=(float) (-INNERCIRCLERADIO*Math.cos(radius)+(iconWidth-iconWidth/4.0)*Math.cos(radius)+iconHeight/2.0*Math.sin(radius));
bitmapLocalY=(float) (-INNERCIRCLERADIO*Math.sin(radius)+iconHeight/2.0*Math.cos(radius)+(iconWidth-iconWidth/4.0)*Math.sin(radius));
}
canvas.drawBitmap(dstbmp,bitmapLocalX,bitmapLocalY, innerLinePaint);
//開始畫路徑
Path path = new Path();
//設定路徑的初始位置
path.moveTo(-CIRCLERADIO*((float)Math.cos(-PI/4.00)), (float) (-CIRCLERADIO*Math.sin(-PI/4.00)));
//通過迴圈繪出全部的路徑
for(int i = 0 ;i<31 ; i++){
path.lineTo(-CIRCLERADIO*((float)Math.cos(-PI/4.00+PI*0.05*i)), (float) (-CIRCLERADIO*Math.sin(-PI/4.00+PI*0.05*i)));
}
//將繪製好的路徑畫上去
canvas.drawPath(path, pathPaint);
//將信用列表資料迴圈畫到軌跡上方
float itemSpace = (float)((CIRCLERADIO*PI*1.5f-textPaint.measureText("950"))/(styles.length-1));
for(int i = 0;i<styles.length;i++){
//第二個和第三個引數分別為 文字的水平間隔和垂直間隔
canvas.drawTextOnPath(styles[i], path,itemSpace*i, -15.0f, textPaint);
}
if(CURRENTFIANLPOINT>ENDPOINT)CURRENTFIANLPOINT=ENDPOINT;
int showGrade=(int)(CURRENTPOINT*COMMONRADIO+300);
if(grade<550){
}
if(CURRENTPOINT==CURRENTFIANLPOINT){
showGrade=grade;
}
if(showGrade>grade){
showGrade=grade;
}
String innerText= String.valueOf(showGrade);
String creditDesc = getCreditDesc(showGrade);
String assessText1="評估時間";
String assessText2="2015.08.09";
//測量文字的寬度
float textTopWidth=innerTextPaint.measureText(innerText);
float textLowerWidth = innerTextPaint.measureText(creditDesc);
float textUnderWidth1 = underTextPaint.measureText(assessText1);
float textUnderWidth2 = underTextPaint.measureText(assessText2);
//測量畫筆的高度
float textHeight=(innerTextPaint.descent()- innerTextPaint.ascent());
//將文字繪畫上去 第三個 引數為設定上下間隔
canvas.drawText(innerText, (float)(-textTopWidth/2.0), 30, innerTextPaint);
canvas.drawText(creditDesc, (float)(-(textLowerWidth/4.0)), 90, innerLowerTextPaint);
canvas.drawText(assessText1, (float)(-(textUnderWidth1/2.0)), textHeight*2, underTextPaint);
canvas.drawText(assessText2, (float)(-(textUnderWidth2/2.0)), textHeight*2+30, underTextPaint);
if(CURRENTPOINT<CURRENTFIANLPOINT){
CURRENTPOINT+=1;
postInvalidate();
}else if(CURRENTPOINT>CURRENTFIANLPOINT){
CURRENTPOINT=CURRENTFIANLPOINT;
postInvalidate();
}
}