Android新手之旅(9) 自定义的折线图

  希望实现一个折线图,但没有找到合适的控件或者代码,只有一个基本样子的,在它的基础上,进行了一些改进,改得比较灵活,可以传递参数,可以设置位置,坐标轴长度,刻度长度等。

  自定义的ChartView.java

package jetz.common;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.View;

public class ChartView extends View{
    public int XPoint=40;    //原点的X坐标
    public int YPoint=260;     //原点的Y坐标
    public int XScale=55;     //X的刻度长度
    public int YScale=40;     //Y的刻度长度
    public int XLength=380;        //X轴的长度
    public int YLength=240;        //Y轴的长度
    public String[] XLabel;    //X的刻度
    public String[] YLabel;    //Y的刻度
    public String[] Data;      //数据
    public String Title;    //显示的标题
    public ChartView(Context context)
    {
        super(context);
    }
    public void SetInfo(String[] XLabels,String[] YLabels,String[] AllData,String strTitle)
    {
        XLabel=XLabels;
        YLabel=YLabels;
        Data=AllData;
        Title=strTitle;
    }
    @Override
    protected void onDraw(Canvas canvas){
        super.onDraw(canvas);//重写onDraw方法

        //canvas.drawColor(Color.WHITE);//设置背景颜色
        Paint paint= new Paint();
        paint.setStyle(Paint.Style.STROKE);
        paint.setAntiAlias(true);//去锯齿
        paint.setColor(Color.BLUE);//颜色
        Paint paint1=new Paint();
        paint1.setStyle(Paint.Style.STROKE);
        paint1.setAntiAlias(true);//去锯齿
        paint1.setColor(Color.DKGRAY);
        paint.setTextSize(12);  //设置轴文字大小
        //设置Y轴
        canvas.drawLine(XPoint, YPoint-YLength, XPoint, YPoint, paint);   //轴线
        for(int i=0;i*YScale<YLength ;i++)               
        {
            canvas.drawLine(XPoint,YPoint-i*YScale, XPoint+5, YPoint-i*YScale, paint);  //刻度
            try
            {
                canvas.drawText(YLabel[i] , XPoint-22, YPoint-i*YScale+5, paint);  //文字
            }
            catch(Exception e)
            {
            }
        }
        canvas.drawLine(XPoint,YPoint-YLength,XPoint-3,YPoint-YLength+6,paint);  //箭头
        canvas.drawLine(XPoint,YPoint-YLength,XPoint+3,YPoint-YLength+6,paint);           
        //设置X轴
        canvas.drawLine(XPoint,YPoint,XPoint+XLength,YPoint,paint);   //轴线
        for(int i=0;i*XScale<XLength;i++)   
        {
            canvas.drawLine(XPoint+i*XScale, YPoint, XPoint+i*XScale, YPoint-5, paint);  //刻度
            try
            {
                canvas.drawText(XLabel[i] , XPoint+i*XScale-10, YPoint+20, paint);  //文字
                //数据值
                    if(i>0&&YCoord(Data[i-1])!=-999&&YCoord(Data[i])!=-999)  //保证有效数据
                        canvas.drawLine(XPoint+(i-1)*XScale, YCoord(Data[i-1]), XPoint+i*XScale, YCoord(Data[i]), paint);
                    canvas.drawCircle(XPoint+i*XScale,YCoord(Data[i]), 2, paint);
           }
            catch(Exception e)
            {
            }
        }
        canvas.drawLine(XPoint+XLength,YPoint,XPoint+XLength-6,YPoint-3,paint);    //箭头
        canvas.drawLine(XPoint+XLength,YPoint,XPoint+XLength-6,YPoint+3,paint); 
        paint.setTextSize(16);
        canvas.drawText(Title, 150, 50, paint);
    }
    private int YCoord(String y0)  //计算绘制时的Y坐标,无数据时返回-999
    {
        int y;
        try
        {
            y=Integer.parseInt(y0);
        }
        catch(Exception e)
        {
            return -999;    //出错则返回-999
        }
        try
        {
            return YPoint-y*YScale/Integer.parseInt(YLabel[1]);
        }
        catch(Exception e)
        {
        }
        return y;
    }
}

--------------------------------------------------------------------------------------------

调用方法:

ChartView myView=new ChartView(this);
myView.SetInfo(
        new String[]{"7-11","7-12","7-13","7-14","7-15","7-16","7-17"},   //X轴刻度
        new String[]{"","50","100","150","200","250"},   //Y轴刻度
        new int[]{15,23,10,36,45,40,12},  //数据
        "图标的标题"
);

效果:

image

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Android 中创建平滑的折线图,可以通过以下步骤实现: 1. 创建一个继承自 View 的自定义,并在其中实现绘制折线图的逻辑。 2. 在自定义的 onDraw 方法中,使用 Path 对象绘制折线图的路径。 3. 在绘制路径之前,可以使用贝塞尔曲线算法将路径进行平滑处理,以确保折线图的线条更加平滑。 4. 在绘制路径之后,使用 Paint 对象设置线条的颜色、宽度等样式属性。 5. 最后,将自定义添加到布局中并显示出来。 以下是一个简单的示例代码,用于绘制平滑的折线图: ```java public class SmoothLineChartView extends View { private Path mPath; private Paint mPaint; public SmoothLineChartView(Context context) { super(context); init(); } public SmoothLineChartView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public SmoothLineChartView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { mPath = new Path(); mPaint = new Paint(); mPaint.setColor(Color.BLUE); mPaint.setStrokeWidth(5); mPaint.setStyle(Paint.Style.STROKE); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 绘制平滑的折线图 drawSmoothLineChart(canvas); } private void drawSmoothLineChart(Canvas canvas) { // TODO: 获取折线图数据,计算平滑曲线 // 绘制平滑曲线 canvas.drawPath(mPath, mPaint); } } ``` 在以上代码中,我们创建了一个继承自 View 的自定义 SmoothLineChartView,并在其中实现了绘制平滑的折线图的逻辑。具体实现中,我们使用了 Path 对象来绘制折线图的路径,并使用 Paint 对象设置线条的颜色、宽度等样式属性。在绘制路径之前,我们可以使用贝塞尔曲线算法将路径进行平滑处理,以确保折线图的线条更加平滑。最后,我们将自定义添加到布局中并显示出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值