Android实现折线图

本文介绍了一种在Android中自定义View实现折线图的方法。通过重写onDraw方法,利用Canvas和Paint进行绘图,包括图表外框、文字、数字、虚线及折线的绘制过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android实现折线图

直接上代码

package com.example.tuxing;

import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PathEffect;
import android.graphics.Point;
import android.graphics.Rect;
import android.view.View;

//import com.yangyueyue.demo.luyin.LuYinActivity;

public class DrawChart extends View{

    private int CHARTH = 600;
    //private int CHARTW = 400;
    private int CHARTW = 1000;
    private int OFFSET_LEFT = 50;
    private int OFFSET_TOP = 180;
    private int TEXT_OFFSET = 20;
    private int X_INTERVAL = 20;

    private List<Point> plist;

    public DrawChart(Context context ,double divider2,int[] shuzhu) {
        super(context);
        plist = new ArrayList<Point>();

    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        drawTable(canvas);
        prepareLine();
        drawCurve(canvas);
    }

    private void drawTable(Canvas canvas){

        Paint paint = new Paint();
        paint.setColor(Color.BLUE);

        //画外框
        paint.setStyle(Paint.Style.STROKE);
        Rect chartRec = new Rect(OFFSET_LEFT,OFFSET_TOP,CHARTW+OFFSET_LEFT,CHARTH+OFFSET_TOP);
        canvas.drawRect(chartRec, paint);

        //画左边的文字
        Path textPath = new Path();
        paint.setStyle(Paint.Style.FILL);
        textPath.moveTo(30, 420);
        textPath.lineTo(30, 300); 
        paint.setTextSize(20);
        paint.setAntiAlias(true);
        canvas.drawTextOnPath("电压(mV)", textPath, 0, 0, paint);
        Paint titlepaint = new Paint();
        titlepaint.setTextSize(35);//设置字体大小//设置字体类型
        titlepaint.setStyle(Paint.Style.FILL);
        titlepaint.setColor(Color.BLUE);
        canvas.drawText("肌电电压折线图", OFFSET_LEFT + 14*TEXT_OFFSET, OFFSET_TOP-75, titlepaint);

        //画左侧数字
        canvas.drawText("4000", OFFSET_LEFT - TEXT_OFFSET -5, OFFSET_TOP+5, paint);
        for(int i = 1 ; i<10 ; i++){
            canvas.drawText(""+(4000-400*i), OFFSET_LEFT - TEXT_OFFSET-5, OFFSET_TOP + CHARTH/10*i, paint);
        }
        canvas.drawText("0", OFFSET_LEFT - TEXT_OFFSET , OFFSET_TOP + CHARTH, paint);

        //画表格中的虚线
        Path path = new Path();     
        PathEffect effects = new DashPathEffect(new float[]{2,2,2,2},1);
        paint.setStyle(Paint.Style.STROKE);
        paint.setAntiAlias(false);
        paint.setPathEffect(effects);       
        for(int i = 1 ; i<10 ; i++){
            path.moveTo(OFFSET_LEFT, OFFSET_TOP + CHARTH/10*i);  
            path.lineTo(OFFSET_LEFT+CHARTW,OFFSET_TOP + CHARTH/10*i); 
            canvas.drawPath(path, paint);
        }
    }
    public static int[] prtBuf = new int[1000];
    private final double divider = 6.6;
    private void drawCurve(Canvas canvas){
        //int xtx = LuYinActivity.prtBuf[0];
//      for(int i = 0;i<1000;i++){
//          prtBuf[i]=i*2;
//      }
        int getIndex = 1000;
        Paint paint = new Paint();
        paint.setColor(Color.BLUE);
        paint.setStrokeWidth(3);
        paint.setAntiAlias(true);
        //canvas.drawLines(line, paint);
        for(int i = 0; i <getIndex-1; i++){
            canvas.drawLine(OFFSET_LEFT + i*1,CHARTH+OFFSET_TOP - (int)((prtBuf[i])/divider),OFFSET_LEFT + (i+1)*1,CHARTH+OFFSET_TOP - (int)((prtBuf[i+1])/divider),paint);
        }
    }

    private void prepareLine(){
        int py = OFFSET_TOP + (int)(Math.random()*(CHARTH - OFFSET_TOP));
        Point p = new Point(OFFSET_LEFT + CHARTW , py );
        if(plist.size() > 21){
            plist.remove(0);
            for(int i = 0; i<20; i++){
                if(i == 0) plist.get(i).x -= (X_INTERVAL - 2);
                else plist.get(i).x -= X_INTERVAL;
            }
            plist.add(p);
        }
        else{
            for(int i = 0; i<plist.size()-1; i++){
                plist.get(i).x -= X_INTERVAL;
            }
            plist.add(p);
        }

    }
}

自定义view主要就是重写onDraw()方法。

源码:http://download.youkuaiyun.com/download/qq_34873801/10050870

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值