2012-01-24 39 views
6

में पाई चार्ट पर ईवेंट पर क्लिक करें मैंने कैनवास का उपयोग करके पाई चार्ट खींचने के लिए उपयोग किया है .. पाई चार्ट में लगभग 10 आर्क हैं .. मैं प्रत्येक चाप पर क्लिक ईवेंट करना चाहता हूं। क्या ऐसा करने का कोई तरीका है? या किसी अन्य तरीके से?एंड्रॉइड

यह मेरा पाई चार्ट दृश्य ..

MyView.java

package android.piechart; 
import java.util.ArrayList; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.RectF; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.View; 

public class MyView extends View { 

private Paint p; 
private int startX; 
private int startY; 
private int radius; 
private ArrayList<Integer> colors; 
private ArrayList<Integer> values; 

public MyView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    p = new Paint(); 
    p.setColor(Color.BLUE); 
    p.setAntiAlias(true); 

    colors = new ArrayList<Integer>(); 
    values = new ArrayList<Integer>(); 

    startX = 320/4; 
    startY = 480/8; 
    radius = 320/2; 

    colors.add(Color.GREEN); 
    colors.add(Color.CYAN); 
    colors.add(Color.MAGENTA); 
    colors.add(Color.BLUE); 
    colors.add(Color.RED); 

    values.add(0); 
    values.add(1); 
    values.add(3); 
    values.add(0); 
    values.add(2); 

} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 

    Log.e("", "onDraw() is called..."); 

    float offset = 0; 
    float sum = 0; 
    for (int a = 0; a < values.size(); a++) { 
     sum += values.get(a); 
    } 

    float angle = (float) (360/sum); 

    Log.e("angle", "" + angle); 

    RectF rectF = new RectF(); 
    rectF.set(getStartX(), getStartY(), getStartX() + getRadius(), 
      getStartY() + getRadius()); 

    for (int i = 0; i < values.size(); i++) { 

     p.setColor(colors.get(i)); 

     if (i == 0) { 
      canvas.drawArc(rectF, 0, values.get(i) * angle, true, p); 
     } else { 
      canvas.drawArc(rectF, offset, values.get(i) * angle, true, p); 
     } 

     offset += (values.get(i) * angle); 
    } 

    canvas.save(); 
} 

public int getStartX() { 
    return startX; 
} 

public void setStartX(int startX) { 
    this.startX = startX; 
} 

public int getStartY() { 
    return startY; 
} 

public void setStartY(int startY) { 
    this.startY = startY; 
} 

public int getRadius() { 
    return radius; 
} 

public void setRadius(int radius) { 
    this.radius = radius; 
} 

public ArrayList<Integer> getColors() { 
    return colors; 
} 

public void setColors(ArrayList<Integer> colors) { 
    this.colors = colors; 
} 

public ArrayList<Integer> getValues() { 
    return values; 
} 

public void setValues(ArrayList<Integer> values) { 
    this.values = values; 
} 
} 

अग्रिम धन्यवाद ..

+0

हाय धूप, मैं भी सामना करना पड़ रहा हूँ एक ही समस्या है। व्यक्तिगत आर्क के लिए क्लिक इवेंट कैसे कार्यान्वित किया गया? – Ratan

उत्तर

13

मैं अपने आप को मेरे सवाल का हल ...

MyView.java

public class MyView extends View { 

private Paint p; 
private int startX; 
private int startY; 
private int radius; 
private ArrayList<Integer> colors; 
private ArrayList<Float> values; 
Bitmap bitmap; 
Context mContext; 

public MyView(Context context, AttributeSet attrs) { 
    super(context, attrs); 

    mContext = context; 

    p = new Paint(); 
    p.setAntiAlias(true); 

    colors = new ArrayList<Integer>(); 
    values = new ArrayList<Float>(); 

    startX = 320/4; 
    startY = 480/8; 
    radius = 320/2; 

    colors.add(Color.GREEN); 
    colors.add(Color.CYAN); 
    colors.add(Color.MAGENTA); 
    colors.add(Color.BLUE); 
    colors.add(Color.RED); 

    values.add(5f); 
    values.add(1f); 
    values.add(3f); 
    values.add(5f); 
    values.add(2f); 

} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    bitmap = Bitmap.createBitmap(canvas.getWidth(), canvas.getHeight(), 
      Bitmap.Config.ARGB_8888); 

    Canvas c = new Canvas(bitmap); 

    Log.e("", "onDraw() is called..."); 

    float offset = 0; 
    float sum = 0; 
    for (int a = 0; a < values.size(); a++) { 
     sum += values.get(a); 
    } 

    float angle = (float) (360/sum); 

    Log.e("angle", "" + angle); 

    RectF rectF = new RectF(); 
    rectF.set(getStartX(), getStartY(), getStartX() + getRadius(), 
      getStartY() + getRadius()); 

    for (int i = 0; i < values.size(); i++) { 

     p.setColor(colors.get(i)); 

     if (i == 0) { 
      canvas.drawArc(rectF, 0, values.get(i) * angle, true, p); 
      c.drawArc(rectF, 0, values.get(i) * angle, true, p); 
     } else { 
      canvas.drawArc(rectF, offset, values.get(i) * angle, true, p); 
      c.drawArc(rectF, offset, values.get(i) * angle, true, p); 
     } 

     offset += (values.get(i) * angle); 
    } 

    canvas.save(); 

} 

@Override 
public boolean onTouchEvent(MotionEvent event) { 

    int color = bitmap.getPixel((int) event.getX(), (int) event.getY()); 

    Log.e("", "" + color); 

    if (colors.contains(color)) { 
     Log.e("", "is matching"); 
     if (color == Color.RED) { 
      Toast.makeText(mContext, "Is Red", Toast.LENGTH_SHORT).show(); 
     } 

     if (color == Color.CYAN) { 
      Toast.makeText(mContext, "Is Cyan", Toast.LENGTH_SHORT).show(); 
     } 

     if (color == Color.MAGENTA) { 
      Toast.makeText(mContext, "Is MAGENTA", Toast.LENGTH_SHORT) 
        .show(); 
     } 
     if (color == Color.BLUE) { 
      Toast.makeText(mContext, "Is BLUE", Toast.LENGTH_SHORT).show(); 
     } 
     if (color == Color.GREEN) { 
      Toast.makeText(mContext, "Is GREEN", Toast.LENGTH_SHORT).show(); 
     } 
    } 

    return super.onTouchEvent(event); 
} 

public int getStartX() { 
    return startX; 
} 

public void setStartX(int startX) { 
    this.startX = startX; 
} 

public int getStartY() { 
    return startY; 
} 

public void setStartY(int startY) { 
    this.startY = startY; 
} 

public int getRadius() { 
    return radius; 
} 

public void setRadius(int radius) { 
    this.radius = radius; 
} 

public ArrayList<Integer> getColors() { 
    return colors; 
} 

public void setColors(ArrayList<Integer> colors) { 
    this.colors = colors; 
} 

public ArrayList<Float> getValues() { 
    return values; 
} 

public void setValues(ArrayList<Float> values) { 
    this.values = values; 
} 

} 

मुझे आशा है कि यह दूसरों के लिए उपयोगी है ...

+0

मुझे नहीं पता कि यह सही है या नहीं ... लेकिन यह सही हो सकता है .. अगर मुझे बहुत अच्छा लगेगा तो मैं पोस्ट करूंगा .. –

+0

क्लिक क्षेत्र या रंग के अनुसार हो सकता है..मैंने रंग से कोशिश की .. –

+0

अच्छा विचार के लिए +1, यार ... – Renjith

3

आप एक Canvas का उपयोग किया है, तो आप शायद के लिए एक संदर्भ है इसके अंतर्निहित Bitmap। आप Bitmap.getPixel(int x, int y) का उपयोग कर सकते हैं और यह तय करने के लिए रंग का परीक्षण कर सकते हैं कि क्लिक किस अनुभाग में था।

अन्यथा, आपको यह समझने के लिए मैन्युअल रूप से गणना करना है कि कौन से वेज में आपके क्लिक के एक्स, वाई निर्देशांक शामिल हैं।

+0

मुझे लगता है कि आप सही हैं .. लेकिन मुझे बिटमैप के संदर्भ के बारे में भ्रम हो रहा है ???? ... मैं बस कैनवास ड्राइंग खींचता हूं। और हाँ, रंग मेरे लिए उपयोगी हो सकता है। –