如何在android中的饼图动态显示文本?

问题描述:

我在Android上工作过饼图。我发现一个优秀的解决方案http://tutorials-android.blogspot.in/2011/05/how-create-pie-chart-in-android.html和工作。我可以用颜色显示饼图,但在我的应用程序中,除了颜色之外,我还需要在该饼图上动态显示文本。 如何在这些饼图切片上动态显示文本?如何在android中的饼图动态显示文本?

请帮我对此...应该心存感激......

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    if (mState != IS_READY_TO_DRAW) { 
    return; 
    } 
    canvas.drawColor(mBgcolor); 
    mBagpaints.setAntiAlias(true); 
    mBagpaints.setStyle(Paint.Style.FILL); 
    mBagpaints.setColor(0x88FF0000); 
    mBagpaints.setStrokeWidth(0.0f); 
    mLinePaints.setAntiAlias(true); 
    mLinePaints.setColor(0xff000000); 
    mLinePaints.setStrokeWidth(3.0f); 
    mLinePaints.setStyle(Paint.Style.STROKE); 
    RectF mOvals = new RectF(mGapleft, mGapTop, mWidth - mGapright, mHeight 
    - mGapBottm); 
    mStart = START_INC; 
    PieDetailsItem item; 
    for (int i = 0; i < mdataArray.size(); i++) { 
    item = (PieDetailsItem) mdataArray.get(i); 
    mBagpaints.setColor(item.color); 
    mSweep = (float) 360* ((float) item.count/(float) mMaxConnection); 
    canvas.drawArc(mOvals, mStart, mSweep, true, mBagpaints); 
    canvas.drawArc(mOvals, mStart, mSweep, true, mLinePaints); 
    mStart = mStart + mSweep; 


    // set your text here 
    canvas.drawText("here is some text", mStart, someYvalue, mLinePaints); 
    } 

    mState = IS_DRAW; 
} 

只是一些的drawText()调用应该正常工作。 你必须做一些数学来决定在哪里你y坐标应该是

+0

嗨,感谢您的回复....你能给我举一些关于如何设置y坐标的例子吗? – RaagaSudha 2012-03-06 11:05:34

要绘制的饼图你不得不用很长的过程.....希望这有助于你..

public class Demo extends Activity { 
    /** Called when the activity is first created. */ 
    float values[]={500,400,300,200,100}; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    LinearLayout linear=(LinearLayout) findViewById(R.id.linear); 
    values=calculateData(values); 
    linear.addView(new MyGraphview(this,values)); 

} 
private float[] calculateData(float[] data) { 
    // TODO Auto-generated method stub 
    float total=0; 
    for(int i=0;i<data.length;i++) 
    { 
     total+=data[i]; 
    } 
    for(int i=0;i<data.length;i++) 
    { 
    data[i]=360*(data[i]/total);    
    } 
    return data; 

} 
public class MyGraphview extends View 
{ 
    private Paint paint=new Paint(Paint.ANTI_ALIAS_FLAG); 
    private float[] value_degree; 
    private int[] COLORS={Color.BLUE,Color.GREEN,Color.GRAY,Color.CYAN,Color.RED}; 
    RectF rectf = new RectF (10, 10, 200, 200); 
    int temp=0; 
    public MyGraphview(Context context, float[] values) { 

     super(context); 
     value_degree=new float[values.length]; 
     for(int i=0;i<values.length;i++) 
     { 
      value_degree[i]=values[i]; 
     } 
    } 
    @Override 
    protected void onDraw(Canvas canvas) { 
     // TODO Auto-generated method stub 
     super.onDraw(canvas); 

     for (int i = 0; i < value_degree.length; i++) {//values2.length; i++) { 
      if (i == 0) { 
       paint.setColor(COLORS[i]); 
       canvas.drawArc(rectf, 0, value_degree[i], true, paint); 
      } 
      else 
      { 
        temp += (int) value_degree[i - 1]; 
        paint.setColor(COLORS[i]); 
        canvas.drawArc(rectf, temp, value_degree[i], true, paint); 
      } 
     } 
    } 

} 

}

哪组根据值的颜色在decending为了... 而对于文本,您可以单独设置动态文本,给色块在文本的前面:)

+0

嗨,感谢您的回应...在上面的例子中,你在哪里设置文本? – RaagaSudha 2012-03-06 11:24:32

+0

在这个例子中,我没有设置任何文本,但可以根据颜色设置文本。例如,具有最高值500的文本在上面的代码中具有蓝色...等。 – 2012-03-06 11:52:09

要在每个中心绘制文本你需要的饼图段来计算每个分段的中心。要在该段上绘制的每个文本项目的中心应该与该中心点对齐 - 通过从中心x坐标减去文本边界宽度的一半(或使用paint.setTextAlign(Align.CENTER);)和文本的一半从*y坐标的高度。

至于找到一个段的中心,它只需要比使用简单几何体更多的考虑。

x = (/* radius of pie chart */ /2)*cos(/*angle in RADIANS */) [angle in radians = Math.toRadians(/*half the sweep angle in degrees*/)

y = (/* radius of pie chart */ /2)*sin(/*angle in RADIANS */)

几乎没有......不要忘记添加饼图中心的X和Y坐标:

段的中心COORDS可以通过发现到上面的x和y值,否则你试图在以你的自定义视图中的(0,0)为中心的圆上绘画!

说出你的饼图在您的视图的实际中心为中心,要待补充说:

x += getWidth()/2; y += getHeight()/2;

最后但并非最不重要的,占文本的长度被涂 - 让你的文字的使用范围,例如:

Paint paint = new Paint(); paint.setColor(Color.WHITE); paint.setTextAlign(Align.CENTER); // This centres the text horizontally

String labelText = "TEST"; Rect textBounds = new Rect(); ​​

y -= textBounds.height()/2;

那么你的文本应正确显示。

您可以使用名为MPAndroidChart的库,它非常简单易用。简单地导入该

compile 'com.github.PhilJay:MPAndroidChart:v3.0.1' 

,并在你的文件的gradle加入这一行

allprojects { 
repositories { 
    maven { url "https://jitpack.io" } 
} 
} 

希望这会帮助你。