自定义简单折线图

先上图,避免不是自己想要的还看了半天

 

 

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

布局里面就不贴了,自己在布局用一下就行

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值