先上图,避免不是自己想要的还看了半天
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.View;
import org.android.mygdttst.douban.DataEnty;
import java.util.ArrayList;
import java.util.List;
import androidx.annotation.Nullable;
public class ZheXianView extends View {
private int mWindowWidth; //屏幕宽
private List<DataEnty> datas = new ArrayList<>(); //图表数据
//view宽
private int mViewWidth;
//view高
private int mViewHeight;
private Paint paintXY; //X坐标轴画笔
private Paint paintText; //绘制文字的画笔
private int distance = 100; //边距的大小,用于留地方写文字
private int distanceText = 50; //文字距离坐标轴的距离
public ZheXianView(Context context) {
super(context);
}
public ZheXianView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public ZheXianView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
mViewHeight = h;
mViewWidth = w;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
mWindowWidth = DimenUtils.getScreenWidth();
//初始化坐标轴画笔
paintXY = new Paint();
paintXY.setAntiAlias(true);
paintXY.setColor(Color.RED);
paintXY.setStrokeWidth(3);
paintXY.setStyle(Paint.Style.STROKE);
//初始化绘制文字的画笔
paintText = new Paint();
paintText.setAntiAlias(true);
paintText.setColor(Color.BLUE);
paintText.setTextSize(25);
//画X轴
canvas.drawLine(getSize(distance),mViewHeight-getSize(distance),mViewWidth+getSize(distance),mViewHeight-getSize(distance),paintXY);
//画Y轴
canvas.drawLine(getSize(distance),mViewHeight-getSize(distance),getSize(distance),0,paintXY);
int scaleX = mViewWidth/datas.size();
List<Integer> number = new ArrayList<>();
for (int i = 0; i < datas.size(); i++) {
number.add(datas.get(i).getNumber());
}
//取出数组中的最大值计算图的比例,防止因为数字过大或者过小显示不出或者显示不全
int max =600; //图表显示最大值
float scaleY = Float.parseFloat(String.valueOf(mViewHeight-getSize(distance)))/Float.parseFloat(max+"");
Path path = new Path();
for (int i = 0; i < datas.size(); i++) {
if(i==0){
path.moveTo(scaleX*i+getSize(distance),(mViewHeight-getSize(distance))-(datas.get(i).getNumber()*scaleY));
}else{
path.lineTo(scaleX*i+getSize(distance),(mViewHeight-getSize(distance))-(datas.get(i).getNumber()*scaleY));
}
//绘制X轴文字
canvas.drawText(datas.get(i).getDate(),scaleX*i+getSize(distance),mViewHeight-getSize(distance-distanceText),paintText);
//绘制Y轴的文字
canvas.drawText(String.valueOf(i*(max/datas.size())),getSize(distance-distanceText),mViewHeight-getSize(distance)-(((mViewHeight-getSize(distance))/datas.size())*i),paintText);
//绘制文字
float textWidth = paintText.measureText(String.valueOf(datas.get(i).getNumber()));
canvas.drawText(String.valueOf(datas.get(i).getNumber()),scaleX*i+getSize(distance)-textWidth/2,mViewHeight-getSize(distance)-(datas.get(i).getNumber()*scaleY)-getSize(20),paintText);
}
canvas.drawPath(path,paintXY);
}
private int getSize(int size){
//因为用的1080手机做的适配 所以这里除以1080
float a = Float.parseFloat(mWindowWidth+"")/(1080f/ Float.parseFloat(size+""));
return (int) a;
}
public void setData(List<DataEnty> enty) {
datas.clear();
datas.addAll(enty);
invalidate();
}
}
实体类代码
public class DataEnty {
private int number;
private String date;
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
}
用法
List<Integer> list = new ArrayList<>(Arrays.asList(258,300,147,550,401));
for (int j = 0; j < 5; j++) {
DataEnty dataEnty = new DataEnty();
dataEnty.setDate("03-"+(j+6));
dataEnty.setNumber(list.get(j));
dataEntyList.add(dataEnty);
}
zheXianView.setData(dataEntyList);
布局里面就不贴了,自己在布局用一下就行