画年利率 画图 自定义 View
使用
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.SlbSyViewandroid: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();}@Overrideprotected 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 - 1canvas.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.LEFTcanvas.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的更多相关文章
- android画虚线的自定义VIew
package com.yesway.ycarplus.view; import android.annotation.SuppressLint; import android.content.Con ...
- Android自定义View 画弧形,文字,并增加动画效果
一个简单的Android自定义View的demo,画弧形,文字,开启一个多线程更新ui界面,在子线程更新ui是不允许的,但是View提供了方法,让我们来了解下吧. 1.封装一个抽象的View类 B ...
- Android -- 自定义View小Demo,动态画圆(一)
1,转载:(http://blog.csdn.NET/lmj623565791/article/details/24500107),现在如下图的效果: 由上面的效果图可以看到其实是一个在一个圆上换不同 ...
- 28 自定义View画坐标和柱状图
自定义View类 RectView.java package com.qf.sxy.day29_customview.widget; import android.content.Context; i ...
- 手把手带你画一个漂亮蜂窝view Android自定义view
上一篇做了一个水波纹view 不知道大家有没有动手试试呢点击打开链接 这个效果做起来好像没什么意义,如果不加监听回调 图片就能直接替代.写这篇博客的目的是锻炼一下思维能力,以更好的面多各种自定义vi ...
- 手把手带你画一个 时尚仪表盘 Android 自定义View
拿到美工效果图,咱们程序员就得画得一模一样. 为了不被老板喷,只能多练啊. 听说你觉得前面几篇都so easy,那今天就带你做个相对比较复杂的. 转载请注明出处:http://blog.csdn.ne ...
- Android之自定义View以及画一个时钟
https://www.2cto.com/kf/201509/443112.html 概述: 当Android自带的View满足不了开发者时,自定义View就发挥了很好的作用.建立一个自定义View, ...
- [原] Android 自定义View步骤
例子如下:Android 自定义View 密码框 例子 1 良好的自定义View 易用,标准,开放. 一个设计良好的自定义view和其他设计良好的类很像.封装了某个具有易用性接口的功能组合,这些功能能 ...
- Android -- 自定义View小Demo,绘制钟表时间(一)
1,昨天刚看了hongyang大神推荐的自定义时钟效果(传动门:http://www.jianshu.com/users/a45d19d680af/),效果还是不错的,自己又在github上找了找,发 ...
随机推荐
- python正则表达式入门
基本概念 使用正则表达式需要import re 表达式前加r避免转义 \d代表数字,\s代表空白字符,\w代表字母+数字. .代表任意单个字符 {m,n}代表前面字符至少出现m次,最多出现n次. (x ...
- 理解javascript之 对象
大纲: 1.介绍attribute property的异同,翻译自http://javascript.info/tutorial/attributes-and-custom-properties#pr ...
- .NET垃圾回收与内存泄漏
相信大家一定听过,看过甚至遇到过内存泄漏.在 .NET 平台也一定知道有垃圾回收器,它可以让开发人员不必担心内存的释放问题,因为它会自定管理内存.但是在 .NET 平台下进行编程,绝对不会发生内存泄漏 ...
- LXPanel自定义添加应用程序到快速启动栏
LXPanel是Linux下LXDE项目的一个桌面面板软件.我一开始接触的时候,对于自己自定义的程序到快速启动栏绕了很多弯路,这里记录下,防止以后自己忘了.还有一点就是很多时候,panel下的应用程序 ...
- window.location.href问题,点击,跳转到首页
onClick="window.location.href='./';" 点击,跳转到首页. location.href=url Js中实现跳转 window.location.h ...
- gchart 插件API
data: 一个二维数组,参数类型如下:[[, , ], [, , ], [, , ]] size: 图片显示的大小 ( width x height ) 300x200 type: 前面已经说过了 ...
- Destoon QQ互联一键登录审核不通过的解决方案
在QQ互联上申请帐号之后提交了审核, 后台填写APPID和KEY之后自己申请的QQ号可以正常登录,但QQ互联审核的时候一直审核不通过说是“您的网站审核未通过,原因是“点击QQ登录按钮提示登录失败或出现 ...
- 欧几里德算法gcd及其拓展终极解释
这个困扰了自己好久,终于找到了解释,还有自己改动了一点点,耐心看完一定能加深理解 扩展欧几里德算法-求解不定方程,线性同余方程. 设过s步后两青蛙相遇,则必满足以下等式: (x+m*s)-(y+n ...
- Retrofit2.0+OkHttp设置统一的请求头(request headers)
有时候要求Retrofit2的接口中每个都要增加上headers,又不想做重复的事情,可以使用这种方法来为每个request请求都设置上相同的请求头header. 修改请求头request heade ...
- Lambert
Dmap -- 贴图信息 LightColor -- 灯光颜色 KL -- 灯光强度值(开放给美术) EnvColor -- 环境颜色 ka -- 环境光强度 (开放给美术) Dmap * (max ...