Android 特效View第四弹之折线图 心率图

Android 特效View第四弹之折线图 心率图

<FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <com.example.empty.ChartView
            android:id="@+id/chart"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center" />
    </FrameLayout>
package com.example.empty;

import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Point;
import android.util.AttributeSet;
import android.view.View;

public class ChartView extends View{

    private List mPointList = new ArrayList();
    private int mPointY = 0;
    private Paint mPoint = new Paint();   //画笔

    public ChartView(Context context, AttributeSet attrs) {
        // TODO Auto-generated constructor stub
        this(context, attrs, 0);
    }

    public ChartView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        // TODO Auto-generated constructor stub
        //初始化画笔
        mPoint.setColor(getContext().getResources().getColor(
                R.color.color_tiny_blue));
        mPoint.setStrokeWidth(2.0f);
        mPoint.setAntiAlias(true);
    }

    @Override
    protected void onDraw(Canvas paramCanvas) {
        super.onDraw(paramCanvas);
        //mPointY = (int) (Math.random() * 100);
        if (mPointList.size() >= 2) {
            for (int k = 0; k < -1 + mPointList.size(); k++) {
                paramCanvas.drawLine(((Point) mPointList.get(k)).x,
                        ((Point) mPointList.get(k)).y,
                        ((Point) mPointList.get(k + 1)).x,
                        ((Point) mPointList.get(k + 1)).y, mPoint);
            }
        }
        Point localPoint1 = new Point(getWidth(), mPointY);
        int i = mPointList.size();
        int j = 0;
        if (i > 101) {                    //最多绘制100个点,多余的出栈
            mPointList.remove(0);
            while (j < 100) {
                Point localPoint3 = (Point) mPointList.get(j);
                localPoint3.x = (-7 + localPoint3.x);
                j++;
            }
            mPointList.add(localPoint1);
            return;
        }

        while (j < mPointList.size()) {    //每新产生使前面的每一个点左移7
            Point localPoint2 = (Point) mPointList.get(j);
            localPoint2.x = (-7 + localPoint2.x);
            j++;
        }
        mPointList.add(localPoint1);
    }

    public final void ClearList() {
        mPointList.clear();
    }

    public final void AddPointToList(int paramInt) {
        mPointY = paramInt;
        invalidate();//重绘
    }

    public void stop(){
        mPointList.clear();
        invalidate();
    }
}

启动绘图

mChartView = (ChartView)findViewById(R.id.chart);
        Timer timer = new Timer();
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                Message msg = new Message();
                mHandler.sendMessage(msg);
            }
        };
        timer.schedule(task,1,300);

            private Handler mHandler = new Handler() {
        @Override
        public void dispatchMessage(Message msg) {
            mChartView.AddPointToList((int) (Math.random() * 100));
        }
    };

上面的开启折线绘图只是给大家一个案例,具体效果大家依照自己需要开发。

这里只简单解释一下,折线图原理。

其实这里我们只是利用了画笔画线的原理,每当我们接收到一个新的绘制点时,我们移动之前已经存在的所有点,并把重新他们连接在一起,并把它们重新绘制出来

时间: 2024-08-29 18:59:20

Android 特效View第四弹之折线图 心率图的相关文章

Android 特效View第三弹之闪烁View

Android  特效View第三弹之闪烁View 动态效果图我只做了半天还是失败了,给一个截图,剩下的全靠想象了 <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" > <com.example.empty.FlickerTextView android:id="@+id/flicker" android:l

android自定义View之(四)------一键清除动画

1.前言: 自己也是参考别人的一些自定义view例子,学习了一些基本的自定义view的方法.今天,我参考了一些资料,再结合自已的一些理解,做了一个一键清除的动画.当年,我实现这个是用了几张图片,采用Frame anination的方式来实现,但是这个方法,不灵活,并且占资源,下面,我就采用自定义view的方法来实现这个功能. 2.效果图: 3.具体详细代码 3.1 \res\values\attrs_on_key_clear_circle_view.xml <resources> <de

怎样使android的view动画循环弹动

在res中建立文件夹anim,分别写下cycles.xml,shake1.xml,shake2.xml cycles.xml: 1 <?xml version="1.0" encoding="utf-8"?> 2 <!-- android:cycles代表移动的速度 --> 3 <cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/androi

Android 自定义View 四个构造函数详解

https://blog.csdn.net/zhao123h/article/details/52210732 在开发android开发过程中,很多人都会遇到自定义view,一般都需要继承自View类,而当你打开View类的源码时,发现会有四个构造函数,那么这四个构造函数是如何使用的呢,怎么合理的利用四个构造函数呢,本文将进行一定探究,希望能够抛砖引玉. 一 View类的四个构造函数先从android源码中把四个构造函数拉出来看看.. 1 第一个构造函数/** * Simple construc

Android 自定义View (五)&mdash;&mdash;实践

前言: 前面已经介绍了<Android 自定义 view(四)-- onMeasure 方法理解>,那么这次我们就来小实践下吧 任务: 公司现有两个任务需要我完成 (1)监测液化天然气液压罐的液位 (2)监测液化天然气液压罐的压力 UI设计师给我的设计截图如下:   任务一实践开始 第一步:先来看看整体结构组成 第二步:绘制文字 (1)我们将底部的文字.颜色,大小都是可以灵活自定义的,所以先得申明底部文字相关属性参数,方便根据需求进行设置 (2)整体上来看各个区域的颜色,文字画笔的相关属性都是

自定义特效VIew第一弹之竖直TextView

自定义特效VIew第一弹之竖直TextView 别的不说,先给出效果 再给出代码 <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" > <com.example.empty.VerticalTextView android:layout_width="wrap_content" android:layout_

Android XML中引用自定义内部类view的四个why

今天碰到了在XML中应用以内部类形式定义的自定义view,结果遇到了一些坑.虽然通过看了一些前辈写的文章解决了这个问题,但是我看到的几篇都没有完整说清楚why,于是决定做这个总结. 使用自定义内部类view的规则 本文主要是总结why,所以先把XML布局文件中引用内部类的自定义view的做法摆出来,有四点: 自定义的类必须是静态类: 使用view作为XML文件中的tag,注意,v是小写字母,小写字母v,小写字母v: 添加class属性,注意,没有带android:命名空间的,表明该自定义view

Android自定义view之绘制实用型的柱形图和折线图

概述: 前几天突然需要做两种图表--柱形图.折线图,于是第一反应是先看看网上有没有现成的,结果有是有,但都不是我想要的,而且大多数不是用纯android代码完成,HTML5似乎完成这类工作要容易得多,但是我本人并不会HTML5,只能黯然神伤,掩面流泪,最终只能自己敲代码了. **知识点:**android自定义view.图形图像.Fragment.MVC模式. Demo 界面是模仿红圈营销搭建的 折线图: 代码,注释很详细,直接看代码就行了: public class LineChartView

Android自定义View——实现理财类APP七日年化收益折线图效果

这段时间的自定义View学习,学会了绘制柱状图.绘制折线图.绘制进度控件,那我们今天就来聊聊另外一种自定义的View,这就是我们常见的七日年化收益折线图效果.先看看长什么样. 这就是效果图了,元素相对而言还是比较多的,这里有线.柱状图.文字.折线.点等等.看起来好像很复杂,但是呢,只要一步一步的实现,那还是可以达到这种效果的,之前我们说过的, 自定义View,就像是在photo shop里面画图,想要什么就画什么,我们可以有很多的画笔工具,也可以有很多的图层. 先看看我们这一次用到哪些变量. p