Android CANVAS绘制自定义X和Y数据的折线图
时间: 2024-03-15 10:44:09 浏览: 152
要在 Android 上绘制自定义 X 和 Y 数据的折线图,可以在上一个问题中的基础上进行修改。你需要将数据点的坐标计算方式修改为根据 X 和 Y 值计算,而不是仅仅根据 Y 值计算。
下面是一个示例代码,实现了一个可以接受自定义 X 和 Y 数据的折线图绘制:
```java
public class LineChartView extends View {
private List<Float> mXData = new ArrayList<>();
private List<Float> mYData = new ArrayList<>();
public LineChartView(Context context) {
super(context);
}
public LineChartView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public LineChartView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setData(List<Float> xData, List<Float> yData) {
mXData = xData;
mYData = yData;
invalidate(); // 通知 View 进行重新绘制
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 设置画笔颜色和样式
Paint paint = new Paint();
paint.setColor(Color.BLUE);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(5);
// 计算每个数据点的坐标
int width = getWidth();
int height = getHeight();
float xInterval = width / (mXData.size() - 1);
float yInterval = height / Collections.max(mYData);
Path path = new Path();
for (int i = 0; i < mXData.size(); i++) {
float x = mXData.get(i) * xInterval;
float y = height - mYData.get(i) * yInterval;
if (i == 0) {
path.moveTo(x, y);
} else {
path.lineTo(x, y);
}
}
// 绘制折线图
canvas.drawPath(path, paint);
}
}
```
在 Activity 中,你可以通过调用 setData() 方法来设置折线图的 X 和 Y 数据,并将自定义 View 组件添加到布局中:
```java
List<Float> xData = new ArrayList<>();
xData.add(1f);
xData.add(2f);
xData.add(3f);
xData.add(4f);
xData.add(5f);
List<Float> yData = new ArrayList<>();
yData.add(10f);
yData.add(20f);
yData.add(50f);
yData.add(30f);
yData.add(40f);
LineChartView lineChartView = new LineChartView(this);
lineChartView.setData(xData, yData);
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
linearLayout.addView(lineChartView, layoutParams);
```
上述代码会在 LinearLayout 中添加一个折线图,其中 X 数据为 [1, 2, 3, 4, 5],Y 数据为 [10, 20, 50, 30, 40]。你可以根据自己的需求来修改上述代码,实现更加复杂的折线图绘制。
阅读全文