android 趋势图

效果图

思路:

自定义视图继承View,在onDraw()函数中绘制点和线

获取视图的高度,将视图区分为指定的趋势值,

例如,我们的销售业绩从0-10,分为10个阶段,那么就用视图的高度/10,然后根据指定的状态数组来绘制点的位置,然后线连接点

趋势视图代码:

public class LineView extends View {

  //点之间的距离
    private int xUnit = 50;

  //视图的高度
    private int height;

//默认的趋势单位
    private int yUnit = 10;

  //默认的趋势数组
    private int arr[] = { 5, 6, 3, 6, 3, 7, 6, 7, 7, 8, 8, 2, 6, 4, 3 };

private int lineColor, radius, referLineColor, maxLevel;

private float lineWidth, referLineWidth;

public LineView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }

public LineView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }

private Paint paint;
    private Paint paintReferLine;

private void init(Context context, AttributeSet attrs) {
        lineColor = Color.GREEN;
        lineWidth = 3;
        referLineColor = Color.GRAY;
        referLineWidth = 1;
        maxLevel = 10;

TypedArray typeArray = context.obtainStyledAttributes(attrs,
                R.styleable.lineView);
        for (int i = 0; i < typeArray.length(); i++) {
            switch (typeArray.getIndex(i)) {

    //趋势线的颜色
            case R.styleable.lineView_lineColor:
                lineColor = typeArray.getColor(i, Color.GREEN);
                break;

    //趋势线的宽度
            case R.styleable.lineView_lineWidth:
                lineWidth = typeArray.getDimension(i, 3);
                break;

//圆点的半径
            case R.styleable.lineView_pointRadius:
                radius = typeArray.getDimensionPixelSize(i, 5);
                break;

    //参考线颜色
            case R.styleable.lineView_referLineColor:
                referLineColor = typeArray.getColor(i, Color.GRAY);
                break;

    //参考线宽度
            case R.styleable.lineView_referLineWidth:
                referLineWidth = typeArray.getDimension(i, 1);
                break;

    //阶段值
            case R.styleable.lineView_maxLevel:
                maxLevel = typeArray.getInt(i, 10);
                break;
            }
        }

paint = new Paint();
        paint.setColor(lineColor);
        paint.setStrokeWidth(lineWidth);
        paint.setAntiAlias(true);

paintReferLine = new Paint();
        paintReferLine.setColor(referLineColor);
        paintReferLine.setStrokeWidth(referLineWidth);
        paintReferLine.setAntiAlias(true);
    }

public void setLevelArray(int[] array) {
        this.arr = array;
        invalidate();
    }

public void setMaxLevel(int maxLevel) {
        this.maxLevel = maxLevel;
    }

public void setLineColor(int lineColor) {
        this.lineColor = lineColor;
        paint.setColor(lineColor);
    }

public void setLineWidth(float lineWidth) {
        this.lineWidth = lineWidth;
        paint.setStrokeWidth(lineWidth);
    }

public void setRadius(int radius) {
        this.radius = radius;
    }

public void setReferLineColor(int referLineColor) {
        this.referLineColor = referLineColor;
        paintReferLine.setColor(referLineColor);
    }

public void setReferLineWidth(int referLineWidth) {
        this.referLineWidth = referLineWidth;
        paintReferLine.setStrokeWidth(referLineWidth);
    }

@Override
    protected void onLayout(boolean changed, int left, int top, int right,
            int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        height = getHeight();
        yUnit = height / maxLevel;
        if (arr.length > 0) {
            xUnit = getWidth() / arr.length;
        }
    }

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (arr.length == 0) {
            canvas.drawText("set Point Array First", 50, 50, paint);
            return;
        }
        for (int i = 0; i < arr.length - 1; i++) {
            int sX = i * xUnit + radius;
            int sY = arr[i] * yUnit;
            int eX = (i + 1) * xUnit + radius;
            int code = arr[i + 1];
            int eY = code * yUnit;

if (sY == 0) {
                sY = radius;
            }
            if (eY == 0) {
                eY = radius;
            }
            if (sY >= height - radius) {
                sY = height - radius;
            }
            if (eY >= height - radius) {
                eY = height - radius;
            }

if (i == 0) {
                canvas.drawLine(sX, 0, sX, height, paintReferLine);
                canvas.drawCircle(sX, sY, radius, paint);
            }
            canvas.drawLine(eX, 0, eX, height, paintReferLine);
            canvas.drawLine(sX, sY, eX, eY, paint);
            canvas.drawCircle(eX, eY, radius, paint);
        }
    }
}

xml布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:lineView="http://schemas.android.com/apk/res/com.example.lineview"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

<demo.LineView
        android:id="@+id/lineView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        lineView:lineColor="#000000"
        lineView:lineWidth="2dp"
        lineView:maxLevel="10"
        lineView:pointRadius="5dp"
        lineView:referLineColor="#DCDCDC"
        lineView:referLineWidth="1dp" />

</LinearLayout>

源代码下载

android 趋势图

时间: 2024-08-29 04:14:25

android 趋势图的相关文章

android趋势图创建与使用

之前项目需求里有一个需求是要根据每周的天气温度去绘制一个趋势图,这个图不基于XY坐标,就是一个单纯的趋势图,百度后看了一些博客,大体上有了一些思路,下面是整个趋势图的效果图: 最下面的点线图就是要做的效果. 下面贴出趋势图示例代码: package com.example.testxyjar; import utils.XYViewDrawBitmap; import utils.XYViewDrawLine; import utils.XYViewDrawPointer; import uti

Android 常用效果(各种进度条,酷炫loading动画,火箭升空,撒花以及趋势图)

最近时间比较充裕一些,总结了下几个项目用到的ui效果,在这边共享给大家,也给自己做个记录(后面会有demo贴出). 主要是以下几种ui效果: 进度条多种展示 开源loading动画 火箭升空 撒花效果(仿微信) 气温趋势图 一.进度条 这边主要是有四种进度条展示,具体效果请往下看: 二.开源loading动画 这边有两种动画,来自于网上的开源demo,第一种是市场上app的比较常见动画,第二种是新版58的加载动画,具体效果请往下看: 三.火箭升空 这是在公司的一键清理项目中用到的一个动画,主要是

Android实现天气预报温度/气温折线趋势图

 Android实现天气预报温度/气温折线趋势图 天气预报的APP应用中,难免会遇到绘制天气温度/气温,等关于数据趋势的折线或者曲线图,这类关于气温/温度的折线图,一般会有两条线,一条是高温线,一条是低温线. 我之前介绍了一个Android平台上第三方开源框架的统计图表库MPAndroidChart(文章链接地址:http://blog.csdn.net/zhangphil/article/details/47656521 ),具体使用方法详情请看这篇文章. 现在基于Android平台上的M

【开源】专业K线绘制[K线主副图、趋势图、成交量、滚动、放大缩小、MACD、KDJ等)

这是最近一个iOS项目需要使用的K线的绘制,在网上大量查阅资料无果,只好自行绘制. 实时数据使用来源API: https://www.btc123.com/kline/klineapi 返回数据说明: 1.时间戳 2.开盘价 3.最高价 4.最低价 5.收盘价 6.成交量 实现功能包括K线主副图.趋势图.成交量.滚动.放大缩小.MACD.KDJ,长按显示辅助线等功能 预览图 最后的最后,这是项目的开源地址:https://github.com/yate1996/Y_KLine,如果帮到了你,麻烦

android中图型的阴影效果(shadow-effect-with-custom-shapes)

思路: 在自定义shape中增加一层或多层,并错开,即可显示阴影效果.为增加立体感,按钮按下的时候,只设置一层.我们可以通过top, bottom, right 和 left 四个参数来控制阴影的方向和大小. 关系图 以下自定义两种阴影效果: res/drawable-hdpi/shadow1.xml <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http:

Android九宫图(draw9patch)

左边和上边的线决定重复的区域: 右边和下边的线决定显示内容的区域: Android九宫图(draw9patch),布布扣,bubuko.com

专业K线绘制之K线主副图、趋势图、成交量、滚动、放大缩小、MACD、KDJ等【开源】

这是最近一个iOS项目需要使用的K线的绘制,在网上大量查阅资料无果,只好自行绘制. 返回数据说明: 1.时间戳 2.开盘价 3.最高价 4.最低价 5.收盘价 6.成交量 实现功能包括K线主副图.趋势图.成交量.滚动.放大缩小.MACD.KDJ,长按显示辅助线等功能 预览图 最后的最后,这是项目的开源地址:https://github.com/yate1996/Y_KLine,如果帮到了你,麻烦点赞鼓励鼓励呗~(*^__^*) ~

python爬虫--百度风云榜--pandas画趋势图

好久没有更新博客,最近做了一个小项目,利用python爬虫功能,每天记录爬取百度风云榜的数据,然后画出趋势图,从而预测旅游城市热度. 原本准备用pandas直接读取table,后来发现pandas不能打包成exe,就只能放弃,尝试了petl也失败了. 在画图的过程中出现了中文无法显示的问题,查询得出是因为matplotlib的问题,没有引入中文字体. 先上分析代码 import os import pandas as pd rootdir='C:/files' #先删除一下result.csv#

Excel应该这么玩——7、我是预言家:绘制趋势图

让我们先看一个场景:你是公司销售部的员工,你手里有公司最近几年的销售额相关的数据,经理希望你预测下个月的销售额.盯着一堆数据,你或许会想到画一张XY坐标图,然后将每个月份的销售额标定为一个坐标.但是下个月的趋势是上升还是下降,值是多少,估计你只能凭感觉在坐标图上打一个点. 读完本文,你就有了很严谨的预测未来趋势的能力,不只是凭感觉哦. 假设存在下面一系列数据,第一行是区间值(例如第几个月),第二行的随着区间变化的值(例如销售额). 选中数据,菜单:插入->图表->散点图->带平滑线和数据