2012-01-24 19 views
6

Ben tuval kullanarak pasta grafik çizmeye alışkınız .. Pasta grafikte yaklaşık 10 yaylar var .. her yayında tıklama olayı gerçekleştirmek istiyorum. Bunu yapmanın bir yolu var mı? ya da başka bir şekilde?android pasta grafik üzerinde olay tıklayın

Bu benim pasta grafiği görünümü .. Bir Canvas kullandıysanız

MyView.java önceden

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; 
} 
} 

Teşekkür ..

+0

Merhaba güneş, ben de karşı karşıyayım aynı sorun. Bağımsız yayınlar için tıklama etkinliklerini nasıl uyguladınız? – Ratan

cevap

13

...

MyView.java bunu başkalarına yararlı umut

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

Bu doğru ya da değil bilmiyorum ... ama bu doğru olabilir .. Eğer daha sonra çok daha iyi bulacağım o zaman .. –

+0

tıklayın bölge veya renk göre olabilir .. Ben renk ile çalıştım .. Güzel fikir için –

+0

+1, yaar ... – Renjith

3

, muhtemelen bir başvuru var ise onun Altta yatan Bitmap. Bitmap.getPixel(int x, int y)'u kullanabilir ve tıklamanın hangi bölümde olduğuna karar vermek için döndürdüğü rengi test edebilirsiniz.

Aksi takdirde, tıklamanın x, y koordinatlarını içeren kamaya karar vermek için hesaplamayı elle yapmanız gerekir. Kendimi Sorumu çözüldü

+0

Sanırım haklısın ... ama bitmap referansı hakkında kafa karışıklığı alıyorum ???? ... Ben sadece tuval çizimi çiziyorum. Ve yup, renk bana yararlı olabilir. –

İlgili konular