自定义View,滑动标注线动态显示数据

news/2024/7/8 4:51:26 标签: 自定义View-曲线, 图形

由于项目需要,要实现这种效果的曲线图,以下是为标注的图形题材

这里写图片描述

当滑动标注线的位置的时候动态的显示Y轴的数据。
在这里我们先不介绍使用自定义View绘制曲线图,由于项目的实际需要,使用第三方绘制曲线图的图表库 如:AChartEngine、XCL-Chart、MPAndroidChart、andbase开源框架库都已经不太满足实际项目的需求。
不过在andbase 这个开源框架库中可以实现这种效果:

这里写图片描述

存在一定的缺陷,因为时间的原因没有更多的了解当中的 Librarys 而是直接引用了jar (亲!尽量还是在了解当中的库之后再引用其jar文件)
所以能否将其实现,还未可知!

还是介绍时候 ChartView extends View 当中的一些简单实现吧!因为“标注线”要随手指的Move 显示曲线连点的的Y轴数据所以我们的拿到移动的X轴的距离或者是移动的Y轴距离。定义一个mPonits[Count] 数组容器将X轴各个点的距离存储到该数组当中!因为当我们移动标注线的位置是,会得到相应的X、Y轴坐标点的位置。

具体的思路实现就是以上的逻辑,在这里就贴出部分的代码:首先我们的监听手势事件重写 OnTouchEvnent(MotionEvent event)

    private boolean isTouched;// 是否触发点击事件
    private long firstClickTime = 0;  
    private long secondClickTime = 0;  
    private float moveDistance = 300; // 设置默认的移动距离


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN:
            isTouched = true;
            if(secondClickTime - firstClickTime < 1000) {  
                firstClickTime = 0;  
                secondClickTime = 0;  
            } 

            Log.i("wangly", "action-down");  
            if(event.getX() >=(moveDistance-30) && event.getX() <= (moveDistance+30)) {  
                isTouched = true;  
                invalidate();  
            } 

            break;
        case MotionEvent.ACTION_MOVE:
            Log.i("wangly", "action-move");
            if(isTouched){
                /**
                 * 在这里我记录的是 X轴坐标,同理你也可以定义Y轴坐标 event.getY(); 
                 * */
                moveDistance = event.getX();//将此时手势x坐标记录下来, 根据此x重绘中间线、  

                for (int i = 0; i < mPonits.length; i++) {
                    if(mPonits[i] == moveDistance){
                        Toast.makeText(mContext,"日期"+xRawDatas.get(i)+"--为"+yRawData.get(i), 0).show();
                    }

                }
                isTouched = true;
                invalidate();  
            }

            break;
        case MotionEvent.ACTION_UP:
            if(isTouched) {  
                moveDistance = event.getX();//记录当下移动位置坐标  
                isTouched = false;  
                invalidate();  
            }  
            break;

            return true;
        }
        return true;
    }

在OnDraw(Canvas canvas) 方法中将X轴各个点的坐标存储到mPonits[Count] 数组当中,

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        width = getWidth();
        width = width - 2 * mInnerCicleRadius - leftoffset;
        // 计算出x轴的单位距离
        mDistance = (width - mYTitleWitdh) / (mYLineCount - 1);
        int height = getHeight();
        int scrollX = getScrollX();
        float orgStroke = mPaint.getStrokeWidth();
        float orgStrokeCicle = mOuterCiclePaint.getStrokeWidth();
        // y轴的真实距离
        yDistance = height - mXAnixValueHight - mContentMarginTop;
        float yLen = yDistance / totalnum;
        if (mYanixValues != null && mYanixValues.size() != 0) {
            // 将yDistance变成y轴上的单位距离
            yDistance = yDistance / (mYanixValues.size() - 1);
        }

        // 绘制节点圆
        mOuterCiclePaint.setColor(mOuterCicleColor);
        mOuterCiclePaint.setStyle(Style.FILL);
        mOuterCiclePaint.setStrokeWidth(mTrendLineSize);
        mInnerCiclePaint.setStrokeWidth(mTrendLineSize);
        for (int i = startPosition; i < endPosition; i++) {
            int startX = mDistance * i + leftoffset - offset;
            int startY = (int) (height - (yLen * mDate.get(i) + mXAnixValueHight));

            canvas.drawCircle(startX, startY, mInnerCicleRadius,
                    mInnerCiclePaint);
            // 超过10000万的画空心圆
            if (mDate.get(i) >= standardnum) {
                canvas.drawCircle(startX, startY, mOuerCicleRadius,
                        mOuterCiclePaint);
            }

            mPoints[i] = startX;

        }

当中还是存在部分瑕疵,那就是,在手指移动的范围需要控制一下,在这里就不过多的赘述了!简单的贴了一下代码,如有更好的实现方式还请不吝赐教啊,共同进步吗!哈哈哈


http://www.niftyadmin.cn/n/1096545.html

相关文章

.NET AOP的实现

一、AOP实现初步 AOP将软件系统分为两个部分&#xff1a;核心关注点和横切关注点。核心关注点更多的是Domain Logic&#xff0c;关注的是系统核心的业务&#xff1b;而横切关注点虽与核心的业务实现无关&#xff0c;但它却是一种更Common的业务&#xff0c;各个关注点离散地分布…

html5新建css样式,Css基础 css语法 Css样式表的创建 样式表的优先级

ooB胜于蓝|优秀个人博客一、Css概念及特点ooB胜于蓝|优秀个人博客css——层叠样式表ooB胜于蓝|优秀个人博客特点&#xff1a;实现了结构与表现相分离ooB胜于蓝|优秀个人博客ooB胜于蓝|优秀个人博客ooB胜于蓝|优秀个人博客二、css语法ooB胜于蓝|优秀个人博客css由选择符和声明两…

图片缓存ImageLoader的使用

转载请注明&#xff1a;http://blog.csdn.net/wlytctw/article/details/51226728 在开发当中对ListView &#xff0c;GridView和Viewpager加载图片&#xff0c;通常都涉及缓存&#xff01;为此在这里列出ImageLoader 开源框架的使用&#xff01;如需下载源码可以在Github上下载…

html鼠标跟随特效代码简短,JS实现的简单鼠标跟随DiV层效果完整实例

本文实例讲述了JS实现的简单鼠标跟随DiV层效果。分享给大家供大家参考&#xff0c;具体如下&#xff1a;这段代码呈现一串跟随鼠标的Div效果&#xff0c;并有拖影特效&#xff0c;随着鼠标快速的晃动&#xff0c;Div层效果会不断的增加&#xff0c;后面的Div会自动消失&#xf…

JAVA 循环在一个数字前面填充0.小例子

输入结果 00000000000567String bala"567";固定长度是14位&#xff0c;怎么循环在bala前面填充00000000000 System.out.println("---www.yq1012.com--------"); String bala "567";StringBuffer sb new StringBuffer(17);sb.append(bala);whil…

【ES实战】_forcemerge API 使用说明

_forcemerge API 使用说明 文章目录_forcemerge API 使用说明强制合并segment文件API 语法可选参数多索引操作使用案例查找存在删除文档的索引查看线程池情况查看segment情况查看任务1 只进行已删除的合并2 没有限制最大segment数的合并3 限制最大segment数的合并注意点源码分析…

FastJson 使用与介绍

在这里介绍下fastJson 的使用&#xff0c;当然在实际开发当中我会结合Server定制的JsonString 进行相关解析工具类的使用(GSON、FastJson)&#xff0c;这两种方式&#xff0c;个人还是比较青睐于Google 的gson 解析器&#xff01;不过我们还是的需要了解和掌握相关的一些解析技…

github上的回复上单词缩写含义

在看 github 上的 PR 回复的时候&#xff0c;往往会出现类似于 LGTM、WIP等一类缩写&#xff0c;那么这些字母分别代表什么意思呢&#xff1f; 通常&#xff0c;我们在 github 上最为常见的是以下这些词&#xff1a; PR&#xff1a;Pull Request&#xff0c;如果给其它项目提交…