【问题标题】:Android Add View adds only first custom view for arcAndroid Add View 仅添加 arc 的第一个自定义视图
【发布时间】:2017-06-03 14:41:53
【问题描述】:

我正在尝试绘制一个饼图,其中每个弧作为单独的自定义对象。但只显示了弧的第一部分。 LinearLayout 确实具有垂直方向,正如其他帖子中所建议的那样。 任何帮助将不胜感激。

清单 1 自定义视图类 (MySliceView.java):

package com.example.piechartsample;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;
import android.provider.SyncStateContract;
import android.view.View;
import android.widget.Toast;


public class MySliceView extends View implements View.OnClickListener {
    private Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    private float[] value_degree;
    private int[] COLORS = {Color.BLUE, Color.GREEN, Color.GRAY, Color.RED, Color.CYAN};
    RectF rectf = new RectF(10, 10, 500, 500);
    float temp = 0;

    float sliceStartAngle, sliceSweepAngle;
    int sliceColor;
    RectF sliceRectf;

    public MySliceView(Context context, float[] values) {

        super(context);
        value_degree = new float[values.length];
        for (int i = 0; i < values.length; i++) {
            value_degree[i] = values[i];
        }
    }

    public MySliceView(Context context, RectF rectF, float startAngle, float sweepAngle, int color) {
        super(context);
        sliceRectf = rectF;
        sliceStartAngle = startAngle;
        sliceSweepAngle = sweepAngle;
        sliceColor = color;
        setOnClickListener(this);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        paint.setColor(sliceColor);
        canvas.drawArc(rectf, sliceStartAngle, sliceSweepAngle, true, paint);
    }


    @Override
    public void onClick(View view) {
        Toast.makeText(this.getContext(), this.getTag().toString(),
                Toast.LENGTH_SHORT).show();
    }
}

清单 2 布局 (activity_slice_view.xml):

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/sliceViewLayout"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    >


    <TextView
        android:id="@+id/slicePieText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Slice Pie"
        />


</LinearLayout>

清单 3:Activity 类 (SliceViewActivity.java):

package com.example.piechartsample;

import android.app.ActionBar;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.RectF;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.Toast;
import android.widget.LinearLayout.LayoutParams;

public class SliceViewActivity extends AppCompatActivity {
    float dataValues[] = {300, 400, 100, 500, 200};
    float sweepAngle[] = new float[dataValues.length];
    float startAngle[] = new float[dataValues.length];

    private int[] colors = {Color.BLUE, Color.GREEN, Color.GRAY, Color.RED, Color.CYAN};
    RectF rectf = new RectF(10, 10, 500, 500);

    private String TAG = "SliceViewActivity";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_slice_view);
        LinearLayout linear = (LinearLayout) findViewById(R.id.sliceViewLayout);
        linear.setOrientation(LinearLayout.VERTICAL);
        calculateSweepAngle(dataValues);
        calculateStartAngle(sweepAngle);

        MySliceView slice1 = new MySliceView(this, rectf, startAngle[0], sweepAngle[0], colors[0]);
        slice1.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        slice1.setTag("Slice1");
        linear.addView(slice1);

        MySliceView slice2 = new MySliceView(this, rectf, startAngle[1], sweepAngle[1], colors[1]);
        slice2.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        slice2.setTag("Slice2");
        linear.addView(slice2);

    }

    private void calculateSweepAngle(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++) {
            sweepAngle[i] = 360 * (data[i] / total);
            //Log.d(TAG, "calculateSweepAngle Post Calc Data " + i + ":" + sweepAngle[i]);
        }
    }

    private void calculateStartAngle(float[] data) {
        // TODO Auto-generated method stub

        float startDegree = 0;
        for (int i = 0; i < data.length; i++) {
            if (i != 0) {
                startDegree += data[i - 1];
            }
            startAngle [i] = startDegree;
            //Log.d(TAG, "calculateStartAngle Post Calc Data " + i + ":" + startAngle[i]);
        }
    }


}

【问题讨论】:

    标签: android android-layout android-linearlayout android-custom-view


    【解决方案1】:

    借助第三方库很容易做到。试试吧 https://github.com/PhilJay/MPAndroidChart

    【讨论】:

    • 谢谢。但我想在不使用任何库的情况下让它工作。有办法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多