2011-12-16 94 views
-1

我需要一个饼图来为我的应用程序显示不同部分的一些数据。 饼图准备就绪,它也可以正常工作,但当我在饼图中的特定部分上触摸时,需要点击事件。请让我知道代码 在此先感谢。 这是我的Android代码Android:可点击的饼图

public class PieActivity extends Activity 
{ 
/** Called when the activity is first created. */ 
float values[]={300,700,100,500}; 

@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]; 
    // System.out.println("values"+value_degree); 
     for(int i=0;i<values.length;i++) 
     { 
      value_degree[i]=values[i]; 
      System.out.println("degree"+value_degree[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); 
      } 
     } 
    } 

} 
} 
+0

您使用 – 2011-12-16 10:45:22

+0

什么库没有图书馆使用.. – 2011-12-16 10:51:27

回答

5

你可以试试这个:在MyGraphView

  • 覆盖的onTouchEvent和检查行动。通常对于ACTION_DOWN,您应该返回true,并在ACTION_UP上处理点击。

  • 当你处理一下,提取从图表中心的相关事件的坐标,像

    float relX = event.getX() - (rectf.right - rectf.left) * 0.5f; 
    float relY = event.getY() - (rectf.bottom - rectf.top) * 0.5f; 
    
  • 然后,你需要找到角度:

    float angleInRad = (float)Math.atan2(relY, relX); 
    
  • 现在你有角度,但是以弧度和范围-PI..PI。所以:

    int degree = (int)((angleInRad + Math.PI) * 180/Math.PI); 
    
  • 现在只需找到哪个区间(来自value_degree)包含此值。

另请注意,由于坐标系颠倒,您可能需要使用-relY而不是relY。只需尝试一下,并根据需要进行更改。