画年利率 画图 自定义 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.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;

    }

}

来自为知笔记(Wiz)

时间: 2024-08-28 11:25:25

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

android画虚线的自定义VIew

package com.yesway.ycarplus.view; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.DashPathEffect; import android.graphics.Paint; import and

自定义View的基本知识和步骤

当初刚入门Android时用的都是原生的控件,刚开始觉得原生的控件其实也可以满足当时的一些学校的小项目开发,也就没怎么深入自定义view.但参加工作后,发现有时美工给的设计图某些功能实现起来还是挺刁钻的,于是便开始了自定义view的学习.或许很多人都觉得自定义view是个很难的东西,其实当你真正用心去弄了几个自定义view之后就会发现其实也并没有那么难.由于个人工作效率还是蛮快的,项目之余闲蛋疼的很,常常自己看到那些好玩的东西就用自定义view画下来. 自定义view的基本步骤无非也就那么几步:

自定义view实现水波纹效果

今天看到一篇自定view 实现水波纹效果 觉得真心不错 学习之后再次写下笔记和心得.但是感觉原作者写得有些晦涩难懂,也许是本人愚笨 所以重写此作者教程.原作者博文大家可以去看下,感觉他在自定义view方面非常厉害,本文是基于此作者原文重新改写,拥有大量像相似部分 先看下效果吧: 1. 效果1: 2. 效果2 我先们来学习效果1: 效果1实现本质:用一张波形图和一个圆形图的图片,然后圆形图在波形图上方,然后使用安卓的图片遮罩模式desIn(不懂?那么先记住有这样一个遮罩模式).(只显示上部图像和下

自定义view画图

在实现自定义View之前,有必要掌握Android中画图的相关类的使用方法,这是自定义各种酷炫界面的基础.主要使用到以下两个类: 画笔:Paint 画布:Canvas 1. Android中的Paint和Canvas的概念和使用方法 Android中的Paint和Canvas的概念是很简单的,就是我们用画笔在画布上进行绘制,没什么难度的,我们只要拿到画笔Paint和画布Canvas对象就可以进行操作了.当然Canvas对象提供了很多绘制图形的方法, 1.1 Paint对象 新建一个Paint画笔

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

上一篇做了一个水波纹view  不知道大家有没有动手试试呢点击打开链接 这个效果做起来好像没什么意义,如果不加监听回调 图片就能直接替代.写这篇博客的目的是锻炼一下思维能力,以更好的面多各种自定义view需求. 转载请注明出处:http://blog.csdn.net/wingichoy/article/details/50554058 本文是和代码同步写的.也就是说在写文章的时候才敲的代码.这样会显得文章有些许混乱.但是我想这样记录下来,一个自定义view的真正的制作过程,是一点一点,一步步跟

自定义View时,用到Paint Canvas的一些温故,只有想不到没有做不到(实例 1,画一个简单的Activity并且实现他能实现的)

转载请注明出处:王亟亟的大牛之路 这两天都在写Paint Canvas 昨天前天都写的比较基础的一些只是和一些简单的Demo演示,那今天就写一个"大气磅礴的"(之前几篇没看的可以看下传送门:http://blog.csdn.net/ddwhan0123/article/details/50426935) 废话不多,先上效果 YE? 为什么贴2个一模一样的试图,你错了!不带toCopy按钮的那整个Activity都是画的,并且还有点击事件哦! 再贴一下2张图片(上面张为原图,下面一张为效

Android 如何 画 柱状图 -------自定义View

实现了 柱状图 根据 SeekBar的滑动 改变的效果: 图示效果: 自定义View的代码: package com.example.coustomviewdemo; import android.R.color; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.g

Android 开发 -------- 自定义View 画 五子棋

自定义View  实现 五子棋 配图: 代码: package com.example.fiveson; import java.util.LinkedList; import java.util.List; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util

Android笔记自定义View之制作表盘界面

前言 最近我跟自定义View杠上了,甚至说有点上瘾到走火入魔了.身为菜鸟的我自然要查阅大量的资料,学习大神们的代码,这不,前两天正好在郭神在微信公众号里推送一片自定义控件的文章--一步步实现精美的钟表界面.正适合我这种菜鸟来学习,闲着没事,我就差不多依葫芦画瓢也写了一个自定义表盘View,现在纯粹最为笔记记录下来.先展示下效果图: 下面进入正题 自定义表盘属性 老规矩,先在attrs文件里添加表盘自定义属性 <declare-styleable name="WatchView"&