1. 程式人生 > >第一章 仿支付寶芝麻信用介面製作(需要自定義View的相關知識)

第一章 仿支付寶芝麻信用介面製作(需要自定義View的相關知識)

//構造器
//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();
    }

}