2011-12-16 57 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。只需嘗試一下,並根據需要進行更改。