/*
* Copyright (C) 2012 www.amsoft.cn
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.ab.view.level;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.FontMetrics;
import android.graphics.Path;
import android.graphics.RectF;
import android.graphics.Typeface;
import android.text.TextPaint;
import com.ab.util.AbGraphicUtil;
import com.ab.util.AbViewUtil;
// TODO: Auto-generated Javadoc
/**
* The Class AbLevelChart.
*/
public class AbLevelChart extends AbLevelAbstractChart {
/** The Constant serialVersionUID. */
private static final long serialVersionUID = 1L;
/** The m dataset. */
protected AbLevelSeriesDataset mDataset;
/** The m renderer. */
protected AbLevelSeriesRenderer mRenderer;
/** 等级图形的宽. */
private int measureWidth;
/** 等级图形的高. */
private int measureHeight;
/** 各等级段的颜色. */
private int [] color = null;
/** 假如 每段的百分比 2 3 2 1 1 1. */
private float [] part = null;
/** 各等级段的值. */
private float [] partValue = null;
/** 当前值. */
private String textValue = null;
/** 当前值描述. */
private String textDesc = null;
/** 当前值的等级. */
private int textlevelIndex = 0;
/** 当前值文字大小. */
private int textLevelSize = 30;
/** 当前值文字与顶部的距离. */
private int marginTop = 30;
/** 指示三角形的宽度. */
private int arrowWidth = 20;
/** 指示三角形的高度. */
private int arrowHeight = 10;
/** 等级条的高度. */
private int levelHeight = 20;
/** 指示三角形与其他间距. */
private int arrowMarginTop = 10;
/** 等级坐标文字大小. */
private int partTextSize = 15;
/** 等级说明文字大小. */
private int textDescSize = 22;
/**
* Instantiates a new ab level chart.
*/
protected AbLevelChart() {
}
/**
* Instantiates a new ab level chart.
*
* @param mDataset the m dataset
* @param mRenderer the m renderer
*/
public AbLevelChart(AbLevelSeriesDataset mDataset,AbLevelSeriesRenderer mRenderer) {
super();
this.mDataset = mDataset;
this.mRenderer = mRenderer;
this.measureWidth = mRenderer.getWidth();
this.measureHeight = mRenderer.getHeight();
}
/**
* Sets the dataset renderer.
*
* @param dataset the dataset
* @param renderer the renderer
*/
protected void setDatasetRenderer(AbLevelSeriesDataset dataset,AbLevelSeriesRenderer renderer) {
mDataset = dataset;
mRenderer = renderer;
}
/**
* 描述:绘制.
*
* @param canvas the canvas
* @param x the x
* @param y the y
* @param measureWidth the measure width
* @param measureHeight the measure height
* @param screenWidth the screen width
* @param screenHeight the screen height
* @param paint the paint
* @see com.ab.view.level.AbLevelAbstractChart#draw(android.graphics.Canvas, int, int, int, int, int, int, android.graphics.Paint)
*/
public void draw(Canvas canvas, int x, int y,int measureWidth,int measureHeight,int screenWidth, int screenHeight,
Paint paint) {
//各等级段的颜色
color = mRenderer.getColor();
//假如 每段的百分比 2 3 2 1 1 1
part = mRenderer.getPart();
//各等级段的值
partValue = mRenderer.getPartValue();
//当前值
textValue = mRenderer.getTextValue();
//当前值描述
textDesc = mRenderer.getTextDesc();
//当前值的等级
textlevelIndex = mRenderer.getTextlevelIndex();
//当前值文字大小
textLevelSize = mRenderer.getTextLevelSize();
textLevelSize = AbViewUtil.scale(screenWidth,screenHeight, textLevelSize);
//当前值文字与顶部的距离
marginTop = mRenderer.getMarginTop();
//指示三角形的宽度
arrowWidth = mRenderer.getArrowWidth();
//指示三角形的高度
arrowHeight = mRenderer.getArrowHeight();
//等级条的高度
levelHeight = mRenderer.getLevelHeight();
//指示三角形与其他间距
arrowMarginTop = mRenderer.getArrowMarginTop();
//等级条坐标文字大小
partTextSize = mRenderer.getPartTextSize();
textDescSize = mRenderer.getTextDescSize();
//获取值的文本的高度
TextPaint mTextPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG);
mTextPaint.setTypeface(Typeface.DEFAULT_BOLD);
mTextPaint.setTextSize(textLevelSize);
FontMetrics fm = mTextPaint.getFontMetrics();
//得到行高
int textHeight = (int)Math.ceil(fm.descent - fm.ascent)+2-20;
int textWidth = (int)AbGraphicUtil.getStringWidth(textValue,mTextPaint);
int left = (screenWidth-measureWidth)/2;
//绘制level条
int topLevel = marginTop+textHeight+arrowHeight+arrowMarginTop;
RectF mLevelRect = new RectF(left,topLevel ,left+measureWidth,topLevel+levelHeight);
paint.setStyle(Paint.Style.FILL);
//设置画笔的锯齿效果
paint.setAntiAlias(true);
paint.setStrokeWidth(2);
paint.setColor(Color.rgb(228, 228, 228));
canvas.drawRoundRect(mLevelRect, 1, 1, paint);
int partWidth = measureWidth/10;
RectF mLevelRectPart = null;
float sumLeft = 0;
float sumRight = 0;
for(int i=0;i<color.length;i++){
if(i==0){
sumLeft = left;
sumRight = sumLeft + part[i]*partWidth;
mLevelRectPart = new RectF(sumLeft,topLevel ,sumRight,topLevel+levelHeight);
}else{
sumLeft += part[i-1]*partWidth;
sumRight += part[i]*partWidth;
mLevelRectPart = new RectF(sumLeft+1,topLevel ,sumRight,topLevel+levelHeight);
}
paint.setColor(color[i]);
//当前的值
if(textlevelIndex == i){
paint.setFlags(Paint.ANTI_ALIAS_FLAG);
paint.setTextSize(textLevelSize);
paint.setTypeface(Typeface.DEFAULT_BOLD);
float textLeftOffset = (part[i]*partWidth-textWidth)/2;
canvas.drawText(textValue,sumLeft+textLeftOffset,marginTop, paint);
float arrowLeftOffset = (part[i]*partWidth-arrowWidth)/2;
float center = sumLeft+arrowLeftOffset+arrowWidth/2;
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.rgb(153, 234, 71));
Path path1 = new Path();
path1.moveTo(center,marginTop+textHeight+arrowHeight);
path1.lineTo(sumLeft+arrowLeftOffset,marginTop+textHeight);
path1.lineTo(sumLeft+arrowLeftOffset+arrowWidth,marginTop+textHeight);
path1.close();
canvas.drawPath(path1, paint);
//绘制等级条下方的倒三角
paint.setColor(Color.rgb(227, 227, 227));
paint.setStyle(Paint.Style.FILL);
Path path2 = new Path();
path2.moveTo(center,marginTop+textHeight+arrowHeight+levelHeight+2*arrowMarginTop);
path2.lineTo(sumLeft+arrowLeftOffset,marginTop+textHeight+levelHeight+2*arrowHeight+2*arrowMarginTop);
path2.lineTo(sumLeft+arrowLeftOffset+arrowWidth,marginTop+textHeight+levelHeight+2*arrowHeight+2*arrowMarginTop);
path2.close();
canvas.drawPath(path2, paint);
//绘制等级条下方的文字描述
int topDesc = marginTop+textHeight+2*arrowHeight+2*arrowMarginTop+levelHeight;
RectF mLevelDescRect = new RectF(center-mRenderer.getTextRectWidth()/2,topDesc ,center+mRenderer.getTextRectWidth()/2,topDesc+mRenderer.getTextRectHeight());
canvas.drawRoundRect(mLevelDescRect,5, 5, paint);
paint.setTypeface(Typeface.DEFAULT_BOLD);
paint.setTextSize(textDescSize);
paint.setColor(Color.rgb(157, 157, 157));
mTextPaint.setTypeface(Typeface.DEFAULT_BOLD);
mTextPaint.setTextSize(textDescSize);
FontMetrics textDescFm = mTextPaint.getFontMetrics();
//得到行高
int textDescHeight = (int)Math.ceil(textDescFm.descent - textDescFm.ascent)+2;
int textDescWidth = (int)AbGraphicUtil.getStringWidth(textDesc,mTextPaint);
canvas.drawText(textDesc,center-textDescWidth/2,topDesc+20+((mRenderer.getTextRectHeight()-textDescHeight)/2),paint);
paint.setColor(color[i]);
}
//绘制等级段
canvas.drawRoundRect(mLevelRectPart, 1, 1, paint);
//绘制段坐标
if(partValue!=null && partValue.length == color.length){
paint.setTextSize(partTextSize);
mTextPaint.setTextSize(partTextSize);
int partValueWidth = (int)AbGraphicUtil.getStringWidth(String.valueOf(partValue[i]),mTextPaint);
canvas.drawText(String.valueOf(partValue[i]),mLevelRectPart.left-partValueWidth/2,mLevelRectPart.top+levelHeight+15,paint);
}
}
}
/**
* Gets the width.
*
* @return the width
*/
public int getWidth() {
return measureWidth;
}
/**
* Gets the height.
*
* @return the height
*/
public int getHeight() {
return measureHeight;
}
}