使用


SlbSyView slbView;
slbView = (SlbSyView) findViewById(R.id.slbView);
slbView.setHeights(new float[]{2.1112f, 2.2311f, 2.3001f, 2.1234f, 2.3421f, 2.0015f, 2.3256f});
slbView.setVisibility(View.VISIBLE);

<com.bcb.presentation.view.custom.SlbSyView
android:id="@+id/slbView"
android:layout_width="wrap_content"
android:layout_height="125dp"
android:layout_below="@+id/title"
android:visibility="invisible"/>

自定义View

package com.bcb.presentation.view.custom;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.WindowManager;
/**
 * 描述:生利宝收益
 * 作者:baicaibang
 * 时间:2016/8/15 09:34
 */
public class SlbSyView extends View {
    Context context;
    Paint paint;
    Path path;//用于绘制复杂的图形轮廓,比如折线,圆弧以及各种复杂图案
    int width, height;//表格的宽高
    int widthBlank, heightBlank;//表格距离左侧、顶部的空白距离
    static final int WIDTH_MAX = 6;//View的相对宽高(7个);WIDTH_MAX是不会变的
    float heightMax = 7.0f;//heightMax是根据需要随便改变;
    float[] heights = new float[WIDTH_MAX + 1];//高度值
    float heightOffset = 0.1f;//偏差,根据需要设置
    float y6Value;//最后一个坐标的值
    public SlbSyView(Context context) {
        this(context, null);
    }
    public SlbSyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.context = context;
        init();
    }
    private void init() {
        paint = new Paint();
        path = new Path();
        paint.setAntiAlias(true);
        paint.setDither(true);
        heightBlank = dp2px(20);
        widthBlank = dp2px(35);
        width = getScreenWidth(context) - widthBlank*2;
        height = dp2px(100);
    }
    public void setHeights(float[] heights) {
        if (heights.length != 7) throw new RuntimeException("长度不对");
        y6Value = heights[6];
        heightMax = getMaxValue(heights) - getMinValue(heights) + heightOffset * 2;//根据需要设置
        for (int i = 0; i < heights.length; i++) {
            this.heights[i] = getMaxValue(heights) + heightOffset - heights[i];//根据需要设置
        }
        invalidate();
    }
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawColor(Color.WHITE);
        //1、画背景
        paint.setColor(0x1adb3838);//10%透明度
        paint.setStyle(Paint.Style.FILL);
        path.moveTo(widthBlank, height + heightBlank);//指定初始轮廓点,若没指定默认从(0,0)点开始
        for (int i = 0; i < heights.length; i++) {
            path.lineTo(widthBlank + width * i / WIDTH_MAX, //中间的点
                    heightBlank + height * heights[i] / heightMax);
        }
        path.lineTo(widthBlank + width, heightBlank + height);//最后的一个点
        path.close(); // 回到初始点形成封闭的曲线
        canvas.drawPath(path, paint);
        //2、画基准线条。每条线都需要两个坐标(注意,是每两个值组成一个坐标)
        paint.setStrokeWidth(dp2px(0.5f));//设置画笔粗细,单位为像素
        paint.setColor(0xff999999);
        float[] points = new float[7 * 4];//坐标
        //画7条竖线
        for (int i = 0; i < points.length; i += 4) {
            points[i] = widthBlank + width * i / (4 * WIDTH_MAX);
            points[i + 1] = heightBlank;
            points[i + 2] = points[i];
            points[i + 3] = heightBlank + height;
        }
        canvas.drawLines(points, paint);
        //画2条横线
        canvas.drawLine(widthBlank, heightBlank, //
                widthBlank + width, heightBlank, paint);
        canvas.drawLine(widthBlank, heightBlank + height,//
                widthBlank + width, heightBlank + height, paint);
        //3、画利率线
        paint.setColor(0xffdb3838);
        paint.setStrokeWidth(dp2px(2));
        for (int i = 0; i < heights.length - 1; i++) {//注意遍历条件 heights.length - 1
            canvas.drawLine(widthBlank + width * i / WIDTH_MAX, //
                    heightBlank + height * heights[i] / heightMax, //
                    widthBlank + width * (i + 1) / WIDTH_MAX, //
                    heightBlank + height * heights[i + 1] / heightMax, paint);
        }
        //4、画圆形
        float x6Point = widthBlank + width * 6 / WIDTH_MAX;
        float y6Point = heightBlank + height * heights[6] / heightMax;
        //画白色的实心圆圆
        paint.setStyle(Paint.Style.FILL);
        paint.setColor(Color.WHITE);
        canvas.drawCircle(x6Point, y6Point, dp2px(4), paint);
        //画空心圆
        paint.setStyle(Paint.Style.STROKE);
        paint.setColor(0xffdb3838);
        canvas.drawCircle(x6Point, y6Point, dp2px(4), paint);//圆心坐标,半径
        //5、画文本(今天的年利率)
        //画圆角矩形
        paint.setStyle(Paint.Style.FILL);
        RectF rect = new RectF(x6Point - dp2px(25), y6Point - dp2px(30), //左上角坐标
                x6Point + dp2px(25), y6Point - dp2px(10));//右下角坐标
        canvas.drawRoundRect(rect, dp2px(3), dp2px(3), paint);//两侧圆角弧度的大小
        //画文字
        paint.setColor(Color.WHITE);
        paint.setTextSize(dp2px(13));//单位是px,只在绘制文字时有效
        paint.setTextAlign(Paint.Align.CENTER);//绘制的文字以drawText时指定的 float x 水平居中,默认值是Align.LEFT
        canvas.drawText(y6Value + "", rect.centerX(),//
                rect.centerY() + dp2px(4.5f), paint);//注意 float y 代表的是 baseline 的值,也即e和f的下边界,而非g的下边界
    }
    private int dp2px(float dpValue) {
        float scale = context.getResources().getDisplayMetrics().density;
        return (int) (dpValue * scale + 0.5f);
    }
    /**
     * 获取屏幕宽
     */
    public static int getScreenWidth(Context context) {
        DisplayMetrics metric = new DisplayMetrics();
        ((WindowManager) context.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(metric);
        return metric.widthPixels;
    }
    /**
     * 取最大值
     */
    public static float getMaxValue(float[] a) {
        float temp = a[0];
        for (int i = 0; i < a.length; i++) {
            if (a[i] > temp) temp = a[i];
        }
        return temp;
    }
    /**
     * 取最小值
     */
    public static float getMinValue(float[] a) {
        float temp = a[0];
        for (int i = 0; i < a.length; i++) {
            if (a[i] < temp) temp = a[i];
        }
        return temp;
    }
}

画年利率 画图 自定义 View的更多相关文章

  1. android画虚线的自定义VIew

    package com.yesway.ycarplus.view; import android.annotation.SuppressLint; import android.content.Con ...

  2. Android自定义View 画弧形,文字,并增加动画效果

    一个简单的Android自定义View的demo,画弧形,文字,开启一个多线程更新ui界面,在子线程更新ui是不允许的,但是View提供了方法,让我们来了解下吧. 1.封装一个抽象的View类   B ...

  3. Android -- 自定义View小Demo,动态画圆(一)

    1,转载:(http://blog.csdn.NET/lmj623565791/article/details/24500107),现在如下图的效果: 由上面的效果图可以看到其实是一个在一个圆上换不同 ...

  4. 28 自定义View画坐标和柱状图

    自定义View类 RectView.java package com.qf.sxy.day29_customview.widget; import android.content.Context; i ...

  5. 手把手带你画一个漂亮蜂窝view Android自定义view

    上一篇做了一个水波纹view  不知道大家有没有动手试试呢点击打开链接 这个效果做起来好像没什么意义,如果不加监听回调 图片就能直接替代.写这篇博客的目的是锻炼一下思维能力,以更好的面多各种自定义vi ...

  6. 手把手带你画一个 时尚仪表盘 Android 自定义View

    拿到美工效果图,咱们程序员就得画得一模一样. 为了不被老板喷,只能多练啊. 听说你觉得前面几篇都so easy,那今天就带你做个相对比较复杂的. 转载请注明出处:http://blog.csdn.ne ...

  7. Android之自定义View以及画一个时钟

    https://www.2cto.com/kf/201509/443112.html 概述: 当Android自带的View满足不了开发者时,自定义View就发挥了很好的作用.建立一个自定义View, ...

  8. [原] Android 自定义View步骤

    例子如下:Android 自定义View 密码框 例子 1 良好的自定义View 易用,标准,开放. 一个设计良好的自定义view和其他设计良好的类很像.封装了某个具有易用性接口的功能组合,这些功能能 ...

  9. Android -- 自定义View小Demo,绘制钟表时间(一)

    1,昨天刚看了hongyang大神推荐的自定义时钟效果(传动门:http://www.jianshu.com/users/a45d19d680af/),效果还是不错的,自己又在github上找了找,发 ...

随机推荐

  1. css行级块级区别总结摘录

    一.块级元素:block element 每个块级元素默认占一行高度,一行内添加一个块级元素后无法一般无法添加其他元素(float浮动后除外).两个块级元素连续编辑时,会在页面自动换行显示.块级元素一 ...

  2. webBrowser(网络转载)

    C#WebBrowser控件使用教程与技巧收集--苏飞收集 先来看看常用的方法 [C#] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 ...

  3. Js仿弹框

    收藏一个简单实用的JS弹框,通过隐藏和显示div来实现,代码来自脚本之家! <html> <head> <title> LIGHTBOX EXAMPLE </ ...

  4. Python自动化运维之18、Python操作 MySQL、pymysql、SQLAchemy

    一.MySQL 1.概述 什么是数据库 ? 答:数据的仓库,和Excel表中的行和列是差不多的,只是有各种约束和不同数据类型的表格 什么是 MySQL.Oracle.SQLite.Access.MS ...

  5. Python 网路编程读书笔记x UDP

    UDP 协议基础 在IP网络层,所有的数据包会向一个指定的主机传输 Source IP  -> Destination IP 但是两台机器之间可能有许多独立的应用需要进行通信,因此为了区分不同的 ...

  6. storm supervisor启动报错java.lang.RuntimeException: java.io.EOFException

    storm因机器断电或其他异常导致的supervisor意外终止,再次启动时报错: 1. 2013-09-24 09:15:44,361 INFO [main] daemon.supervisor ( ...

  7. [Struts2学习笔记] -- 环境配置

    在创建好WebProject后,就可以开始进行Struts2的环境配置,可以到Struts2官网下载,本环境使用struts-2.3.24.1版本. 首先导入必要的jar包到WebProject的/W ...

  8. c# 重新认识 Double 浮点型

    double test1 = 0; for (int i = 0; i < 100000000; i++) { test1 += 0.0001; } 请问 test1 的值是几? 答案是:999 ...

  9. 在Xcode中如何屏蔽某个源文件的编译警告信息

    某些时候如果我们的源码在编译过程中出现大量的编译警告时,看起来是挺不爽的:但又确实没办法解决警告问题的时候,我们可以使用下面的方法来屏蔽指定的某个文件的所有警告信息. 1.在Xcode中选中工程文件. ...

  10. VM虚拟机上 实现CentOS 6.X下部署LVS(DR)+keepalived实现高性能高可用负载均衡

    一.简介 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统.本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一. ...