重绘画布,用于更新然后设置文本不起作用

时间:2014-04-24 15:25:02

标签: android canvas

我有画布为我绘制饼图。在我将单选按钮更改为不同意位置后,我的饼图必须显示不同的值。我正在使用Listener(在无线电组中设置)这样做。它正在工作但是为了更新画布(不是添加和透支,我必须首先清除它并重新绘制新值)我使用这个:

canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);

在饼图下我想写出百分比数。没有那条线就是最重要的。但是在我执行该行之后,只重绘了一个饼图(带有新值),但是没有显示带百分比的文本(即使我再次将文本设置为):

if (checkedId == R.id.agreeRadio) {
                values[0] += 1;
                values[1] -= 1;
                                    setupPieChart();
                setupPercentageValueToGraph();

}

计算百分比并编写它的方法:

public void setupPercentageValueToGraph() {
    float[] degrees = calculateData(values);
    // get percentage number from values
    float percentage = (degrees[0] / (degrees[0] + degrees[1])) * 100;
    // setup color of the number shown red/green
    if (percentage >= 50) {
        percentageTV.setTextColor(Color.parseColor("#47B243"));
    } else {
        percentageTV.setTextColor(Color.parseColor("#DB262A"));
    }
    // set the text
    percentageTV.setText((int) percentage + "%");
}

将饼图设置为linearLayout的方法:

public void setupPieChart() {
    float[] degrees = calculateData(values);
    graphLayout.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
   graphLayout.addView(new MyGraphView(this, degrees, size));
}

绘制使用clear的饼图的类:

public class MyGraphView extends View {
public static final int PADDING = 4;
private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
private float[] value_degree;
int strokeWidth;
private int[] COLORS = { Color.parseColor("#47B243"),
        Color.parseColor("#DB262A") };

// size of bigger half circle
RectF rectf = new RectF(2, 2, 62, 62);
// size of smaller half circle
RectF rectf2 = new RectF(9, 9, 55, 55);
// size of the smallest half circle
RectF rectf3 = new RectF(16, 16, 48, 48);

int temp = 0;

public MyGraphView(Context context, float[] values, int size) {

    super(context);
    // setting up size of pie chart dynamically
    int difference = size / 9;

    rectf.set(PADDING, PADDING, size + PADDING, size + PADDING);
    rectf2.set(difference + PADDING, difference + PADDING, size
            - difference + PADDING, size - difference + PADDING);
    rectf3.set(difference * 2 + PADDING, difference * 2 + PADDING, size
            - difference * 2 + PADDING, size - difference * 2 + 
PADDING);
    // setting up brush size
    strokeWidth = size / 15;
    // assign degrees of agree and disagree to array
    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);
    //canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
    for (int i = 0; i < value_degree.length; i++) {
        // set type of "brush"
        paint.setStrokeWidth(strokeWidth);
        paint.setStyle(Paint.Style.STROKE);
        // set shadow
        paint.setShadowLayer(2, 1, 1, Color.BLACK);

        // setLayerType(LAYER_TYPE_SOFTWARE, paint);
        // agree
        if (i == 0) {
            final Path path = new Path();
            paint.setColor(COLORS[i]);
            // draw 3 paths to show 3 curves
            path.addArc(rectf, 180, value_degree[i] - 4);
            path.addArc(rectf2, 180, value_degree[i] - 5);
            path.addArc(rectf3, 180, value_degree[i] - 6);
            // draw the path
            canvas.drawPath(path, paint);

            // disagree
        } else {
            temp += (int) value_degree[i - 1];
            paint.setColor(COLORS[i]);
            final Path path = new Path();
            path.addArc(rectf, temp + 180 + 4, value_degree[i] - 4);
            path.addArc(rectf2, temp + 180 + 5, value_degree[i] - 5);
            path.addArc(rectf3, temp + 180 + 6, value_degree[i] - 6);
            // draw the path
            canvas.drawPath(path, paint);

        }

    }
}
}

知道为什么不写文字?或者在更改radiobutton之后如何更新饼图的任何其他方式?

1 个答案:

答案 0 :(得分:1)

最后我找到了一种方法。在绘制与图形相同的画布上绘制文本:

// draw the number of percent under piechart
        // setup brush
        Paint paint2 = new Paint(Paint.ANTI_ALIAS_FLAG);
        // set shadow
        paint2.setShadowLayer(3, 2, 2, Color.parseColor("#404040"));
        // fill it not stroke
        paint2.setStyle(Style.FILL);
        // set text family + make it bold
        paint2.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.BOLD));
        // convert dp to pixels and setup the size of text
        int MY_DIP_VALUE = 23; // 5dp
        int pixel = (int) TypedValue.applyDimension(
                TypedValue.COMPLEX_UNIT_DIP, MY_DIP_VALUE, 
getResources()
                        .getDisplayMetrics());
        // setup color of the number shown red/green
        if (percent >= 50) {
            paint2.setColor(COLORS[0]);
        } else {
            paint2.setColor(COLORS[1]);
        }
        // draw the text
        paint2.setTextSize(pixel);
        float textWidth = paint2.measureText(percent + "%");
        canvas.drawText(percent + "%", size / 2 - textWidth / 2 + PADDING,
                size, paint2);

我删除了TextView并进行了一些小改动,但关键是绘制它。还是不明白为什么我不能在上面写文字但是必须画,但它正在工作!