效果图:

代码实现:

package com.jiahao.me;

import java.util.ArrayList;
import java.util.List; import android.app.Activity;
import android.os.Bundle; public class MainActivity extends Activity {
private ChartView chartView;
ArrayList<Double> yList; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
chartView = (ChartView) findViewById(R.id.chartView); // yList = new ArrayList<Double>();
// yList.add((double) 2.103);
// yList.add(4.05);
// yList.add(6.60);
// yList.add(3.08);
// yList.add(4.32);
// yList.add(2.0);
// yList.add(5.0);
//
// ArrayList<String> xRawDatas = new ArrayList<String>();
// xRawDatas.add("05-19");
// xRawDatas.add("05-20");
// xRawDatas.add("05-21");
// xRawDatas.add("05-22");
// xRawDatas.add("05-23");
// xRawDatas.add("05-24");
// xRawDatas.add("05-25");
// xRawDatas.add("05-26");
//
// xRawDatas.add("05-19");
// xRawDatas.add("05-20");
// xRawDatas.add("05-21");
// xRawDatas.add("05-22");
// xRawDatas.add("05-23");
// xRawDatas.add("05-24");
// xRawDatas.add("05-25");
// xRawDatas.add("05-26");
//
// xRawDatas.add("05-19");
// xRawDatas.add("05-20");
// xRawDatas.add("05-21");
// xRawDatas.add("05-22");
// xRawDatas.add("05-23");
// xRawDatas.add("05-24");
// xRawDatas.add("05-25");
// xRawDatas.add("05-26");
// chartView.setData(yList, xRawDatas, 8, 2); List<Float> values = new ArrayList<Float>();
List<String> xlabel = new ArrayList<String>(); values.add(36.5f);
xlabel.add("02-01"); values.add(35.5f);
xlabel.add("02-02"); values.add(34.3f);
xlabel.add("02-03"); values.add(36.8f);
xlabel.add("02-04"); values.add(36.4f);
xlabel.add("02-05"); values.add(37.1f);
xlabel.add("02-06"); values.add(37.5f);
xlabel.add("02-07"); values.add(36.5f);
xlabel.add("02-08"); values.add(36.2f);
xlabel.add("02-09"); values.add(38.5f);
xlabel.add("02-10"); values.add(36.5f);
xlabel.add("02-11"); values.add(37.1f);
xlabel.add("02-06"); values.add(37.5f);
xlabel.add("02-07"); values.add(36.5f);
xlabel.add("02-08"); values.add(36.2f);
xlabel.add("02-09"); values.add(38.5f);
xlabel.add("02-10"); values.add(36.5f);
xlabel.add("02-11"); values.add(37.1f);
xlabel.add("02-12"); values.add(37.5f);
xlabel.add("02-13"); values.add(36.5f);
xlabel.add("02-14"); /**values.add(36.2f);
xlabel.add("02-15"); values.add(38.5f);
xlabel.add("02-15"); values.add(36.5f);
xlabel.add("02-17"); values.add(37.1f);
xlabel.add("02-08"); values.add(37.5f);
xlabel.add("02-09"); values.add(36.5f);
xlabel.add("02-20"); values.add(36.2f);
xlabel.add("02-21"); values.add(38.5f);
xlabel.add("02-22"); values.add(36.5f);
xlabel.add("02-23");
**/ chartView.setValueData(values, xlabel);
} }
package com.jiahao.me;

import java.util.List;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.DashPathEffect;
import android.graphics.Paint;
import android.graphics.PaintFlagsDrawFilter;
import android.graphics.PathEffect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.renderscript.Element;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.WindowManager; @SuppressLint("NewApi") public class ChartView extends View { private Paint paint;
private int marginTop = 70;
private int yLabelHeihgt = 70;
private int marginBottom = 10;
private int widthScreen;
private DisplayMetrics dm;
private WindowManager windowManager;
private List<Float> values;
private List<String> xlabel;
private float radius = 5f;
private float minValue = 34f;
private float maxValue = 39f;
private float marginLeft = 20; // Y轴文字的宽度
private float labelWidth = 40f;
private float xLabelWidth =70f;
private Paint circlePaint;
private String [] yVal; private Paint xuLinePaint;
private Bitmap water;
private Bitmap heart;
private int lastX;
private int lastY; private int initLeft; private int parentWidth; private int offX;
private int offY;
private int scrollX;
private int scrollY;
private int downLeft;
private int downRight;
private float pointX; public ChartView(Context context, AttributeSet attrs) {
super(context, attrs);
windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
widthScreen = windowManager.getDefaultDisplay().getWidth();
water = BitmapFactory.decodeResource(context.getResources(), R.drawable.water);
heart = BitmapFactory.decodeResource(context.getResources(), R.drawable.heart); } @Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
super.onLayout(changed, left, top, right, bottom);
} @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setAntiAlias(false);
paint.setTextSize(12);
paint.setColor(Color.BLACK);
circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
circlePaint.setAntiAlias(false);
circlePaint.setColor(Color.parseColor("#fc5a9c")); xuLinePaint = new Paint();
xuLinePaint.setAntiAlias(false);
xuLinePaint.setStyle(Paint.Style.STROKE);
xuLinePaint.setColor(Color.parseColor("#fc5a9c"));
PathEffect effects = new DashPathEffect(new float[]{5,5,5,5},1);
xuLinePaint.setPathEffect(effects); canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG)); // 画默认图表
initViews(canvas);
initLeft = getLeft();
Log.e("Test", "initLeft=" + initLeft);
drawValues(canvas); } public void setValueData(List<Float> values,List<String> xlabel) {
this.xlabel = xlabel;
this.values = values; } private void initViews(Canvas canvas) {
yVal = new String []{"39.0","38.5","38.0","37.5","37.0","36.5","36.0","35.5","35.0","34.5","34.0"}; pointX = 0f;
if (values != null && values.size() > 0) {
pointX = (yLabelHeihgt * (values.size() + 1)) + labelWidth * 2;
}
// for (int i = 0;i < values.size();i++) {
// pointX = pointX + (yLabelHeihgt * (i + 1)) + (labelWidth / 2);
// } for (int i = 0; i < yVal.length;i++) {
// canvas.drawText(yVal[i], labelWidth, (yLabelHeihgt * (i + 1)), paint);
if (pointX > widthScreen) {
canvas.drawLine(0, (yLabelHeihgt * (i + 1)), pointX, (yLabelHeihgt * (i + 1)), paint);
} else {
// labelWidth + 40
canvas.drawLine(0, (yLabelHeihgt * (i + 1)), widthScreen, (yLabelHeihgt * (i + 1)), paint);
}
} if (pointX > widthScreen) {
ViewGroup viewGroup = (ViewGroup) getParent();
if (viewGroup != null) {
LayoutParams params = viewGroup.getLayoutParams();
params.width = (int)pointX;
viewGroup.setLayoutParams(params);
parentWidth = (int)pointX;
}
} } private void drawValues(Canvas canvas) {
// 画 点和线
if (values != null && values.size() > 0) {
float initPointX = 0f;
float initPointY = 0f;
float pointX = 0f;
float pointY = 0f;
for (int i = 0;i < values.size();i++) {
float f = values.get(i);
if (f <= minValue) {
pointX = (((i + 1) * xLabelWidth));
pointY = (yLabelHeihgt * (i + 1));
if (initPointX > 0) {
canvas.drawLine(initPointX, initPointY, pointX, pointY, circlePaint);
}
canvas.drawCircle(pointX, pointY, radius, circlePaint);
initPointX = pointX;
initPointY = pointY;
} else if (f >= maxValue) {
pointX = (((i + 1) *xLabelWidth));
pointY = yLabelHeihgt;
if (initPointX > 0) {
canvas.drawLine(initPointX, initPointY, pointX, pointY, circlePaint);
}
canvas.drawCircle(pointX, pointY, radius, circlePaint);
initPointX = (labelWidth * (i + 1));
initPointY = yLabelHeihgt;
} else {
float pxheight = (maxValue - minValue) / (yLabelHeihgt * (i + 1));
// Log.e("Test", "pxheight=" + pxheight); pointY = (float)((((maxValue - f ) / 0.5) + 1) * yLabelHeihgt);
pointX = (yLabelHeihgt * (i + 1)) + (labelWidth / 2);
if (initPointX > 0) {
canvas.drawLine(initPointX, initPointY, pointX, pointY, xuLinePaint);
}
initPointX = pointX;
initPointY = pointY;
canvas.drawCircle(pointX, pointY, radius, circlePaint);
}
// 下面绘制
canvas.drawBitmap(water, (pointX - (water.getWidth() / 2)), (pointY + (water.getHeight() / 2)), circlePaint); // 上面绘制
canvas.drawBitmap(heart, (pointX - (heart.getWidth() / 2)), (pointY - (heart.getHeight() + heart.getHeight() / 2)), circlePaint);
} } // 画 X轴 label
if (xlabel != null && xlabel.size() > 0) {
for (int i = 0;i < xlabel.size();i++) {
float pointY = (yLabelHeihgt * yVal.length) + 15;
float pointX = (yLabelHeihgt * (i + 1));
canvas.drawText(xlabel.get(i) + "", pointX, pointY, paint);
}
} ViewGroup viewGroup = (ViewGroup) getParent();
if (viewGroup != null) {
Log.e("Test", "parent width=" + viewGroup.getLayoutParams().width);
}
} @Override
public boolean onTouchEvent(MotionEvent event) {
int x = (int)event.getX();
int y = (int)event.getY();
boolean flag = true;
if (event.getAction() == MotionEvent.ACTION_DOWN) {
lastX = x;
lastY = y;
downLeft = getLeft();
downRight = getRight(); } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
// 计算移动的距离
offX = x - lastX;
offY = y - lastY;
if (x > lastX) { // 向左滚动
Log.e("Test22", "向右边滚动.........");
// if (getRight() > widthScreen - xLabelWidth) {
// layout(getLeft() + offX, getTop(), getRight() + offX, getBottom());
// } } else { // 向右边滚动 Log.e("Test22", "向左滚动.........");
// if (getLeft() < 0) {
// layout(getLeft() + offX, getTop(), getRight() + offX, getBottom());
// }
} // 调用layout重新绘制
// if (getLeft() >= 0) {
// layout(getLeft() + offX, getTop(), getRight() + offX, getBottom());
// }
// Log.e("Test22", "left:" + getLeft());
// Log.e("Test22", "right:" + getRight());
//
//
//
// Log.e("Test", "getLeft() + parentWidth=" + (getLeft() + parentWidth));
// Log.e("Test", "widthScreen=" + widthScreen);
if (((getLeft() + parentWidth) >= widthScreen && getLeft() <= 0)) {
// Log.e("Test", "执行了onLayout");
layout(getLeft() + offX, getTop(), getRight() + offX, getBottom());
Log.e("Test", "进来了"); } else {
Log.e("Test", "没有进来");
if (x > lastX && getLeft() <=0) {
layout(getLeft() + offX, getTop(), getRight() + offX, getBottom());
}
// else {
// if (getLeft() > 0) {
// layout(getLeft(), getTop(), getRight(), getBottom());
// }
// }
// if (getLeft() > 0) {
// setLeft(0);
// } else if ((getLeft() + parentWidth) < widthScreen){
// setLeft(widthScreen);
// }
// scrollX = getLeft();
// scrollY = getRight();
// Log.e("Test", "未执行......");
//
// layout(getLeft(), getTop(), getRight() + offX, getBottom());
} Log.e("Test", "left:" + getLeft());
Log.e("Test", "right:" + getRight()); } else if (event.getAction() == MotionEvent.ACTION_UP) {
if (getLeft() > 0) {
Log.e("Test", "=====================11============");
setLeft(0);
layout(getLeft(), getTop(), getRight(), getBottom());
} else if (getRight() < widthScreen) {
// layout(parentWidth - getRight(), getTop(), parentWidth - getLeft(), getBottom());
Log.e("Test", "=======================12==========downRight=" + downRight);
Log.e("Test", "=======================12==========parentWidth=" + parentWidth);
Log.e("Test", "=======================12==========downLeft=" + downLeft);
// setRight(widthScreen - 5);
// layout(getRight() - parentWidth, getTop(), getRight(), getBottom());
// setLeft(widthScreen - parentWidth);
// setRight(parentWidth - Math.abs(getLeft()));
// layout(downLeft, getTop(), downRight, getBottom());
// setRight(widthScreen);
// setLeft(Math.abs(downLeft) - parentWidth);
Log.e("Test", "=======================12==========left=" + (Math.abs(downLeft) - parentWidth));
Log.e("Test", "=======================12==========right=" + widthScreen);
// layout(Math.abs(downLeft) - parentWidth, getTop(), widthScreen, getBottom());
}
// else if (((getLeft() + parentWidth) < widthScreen)) {
// setLeft(scrollX);
// setRight(scrollY);
// layout(scrollX- 1, getTop(), scrollY -1, getBottom());
// } // Log.e("Test22", "ACTION_UP===========");
//
// Log.e("Test22", "getLeft:" + getLeft());
// Log.e("Test22", "getRight:" + getRight());
}
return flag;
} @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
Log.e("Test", "widthMeasureSpec=" + widthMeasureSpec);
Log.e("Test", "heightMeasureSpec=" + heightMeasureSpec);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
} }

MPAndroidChart 的实现的更多相关文章

  1. MPAndroidChart 3.0——LineChart(折线图)

    显示效果 MPAndroidChart每一种图表的基本使用方式都基本相同 了解一种图表的实现 参考项目源码其他的图表也就差不多哩 在布局文件中定义 <com.github.mikephil.ch ...

  2. Android MPAndroidChart RadarChart (蜘蛛网图)

    最近项目涉及到这个统计图形,经过实现,记录下,防止忘记了. 1.Github地址:MPAndroidChart 官方使用RadarChart demo:RadarChartActivitry 2.使用 ...

  3. MPAndroidChart 教程

    以前没用过MPAndroidChart,为了方便学习查找,引用下别个大神的笔记. 其余文章索引: MPAndroidChart 教程:概述MPAndroidChart 教程:开始 Getting St ...

  4. 笑谈Android图表-MPAndroidChart

    MPAndroidChart是一款基于Android的开源图表库,MPAndroidChart不仅可以在Android设备上绘制各种统计图表,而且可以对图表进行拖动和缩放操作,应用起来非常灵活.MPA ...

  5. MPAndroidChart饼图属性及相关设置

    公司最近在做统计功能,所以用到了饼图,在网上查了一些资料最终决定使用MPAndroidChart,使用起来非常方便,还有一些问题通过各种查找,终于解决...废话不多说,先看下效果图: 布局文件: &l ...

  6. android MPAndroidChart饼图实现图例后加数字或文本(定制图例)

    转载请注明:http://blog.csdn.net/ly20116/article/details/50905789 MPAndroidChart是一个非常优秀的开源图表库,MPAndroidCha ...

  7. Android统计图表MPAndroidChart.

    Android统计图表MPAndroidChart MPAndroidChart是在Android平台上开源的第三方统计图表库,可以绘制样式复杂.丰富的各种统计图表,如一般常见的折线图.饼状图.柱状图 ...

  8. 统计图表--第三方开源--MPAndroidChart(一)

    效果图1: 效果图2: MPAndroidChart是在Android平台上开源的第三方统计图表库,可以绘制样式复杂.丰富的各种统计图表,如一般常见的折线图.饼状图.柱状图.散点图.金融股票中使用的的 ...

  9. MPAndroidChart绘制图形表

    最近一个项目需要用到表格进行统计显示,本来用的是的achartengine,后来发现一个更加强大的开源框架MPAndroidChart. 下面简单介绍下MPAndroidChart,MPAndroid ...

  10. 在MPAndroidChart库K线图的基础上画均线

    CombinedChart 可以直接使用MPAndroidChart库里面提供的CombinedChart实现组合图形 Demo:CombinedChartDemo ------分割线(如果想在一个图 ...

随机推荐

  1. Java [Leetcode 260]Single Number III

    题目描述: Given an array of numbers nums, in which exactly two elements appear only once and all the oth ...

  2. Swift入门篇-Hello World

    提示:如果您使用手机和平板电脑看到这篇文章,您请在WIFI的环境下阅读,里面有很多图片, 会浪费很多流量. 博主语文一直都不好(如有什么错别字,请您在下评论)望您谅解,没有上过什么学的 最近这2天主要 ...

  3. ECshop 每个数据库表结构说明

    ecs_account_log // 用户账目日志表 ecs_activity // 活动表(代码,名称,开始,结束,描述) ecs_ad // 广告表(位置,类型,名称,链接,图片,开始,结束,广告 ...

  4. Ubuntu 14.04配置FTP服务器

    搭建: 1.sudo apt-get update                                        #更新软件 2.sudo apt-get install vsftpd ...

  5. Win7下硬盘安装Centos5.3

    前提声明:一个硬盘最多只能有四个主分区,也就是hda1,hda2,hda3和hda4,逻辑分区都是从hda5开始 一.软件准备:EasyBCD+分区助手+Centos 5.3 ISO镜像文件: 二.W ...

  6. Cadence原理图与Allegro交互

    1:激活orCAD与Allegro的交互程序 打开原理图,Options->Preference在Miscellaneous里勾选 2:打开用到的工程 原理图,还有Allegro PCB Des ...

  7. ASP.NET单点登录(代码)

    [p=25, null, left]由于某些原因,在我们的应用中会遇到一个用户只能在一个地方登录的情况,也就是我们通常所说的单点登录.在ASP.NET中实现单点登录其实很简单,下面就把主要的方法和全部 ...

  8. g++安装 Gnome/Gtk+开发库 的 环境安装(安装widgets的必要条件)

    sudo yum install gcc-c++ 我在更新软件源后,看了看最新版的GTK开发版是3.0的. 所以,基本可以照搬. sudo yum -t install gtk3 sudo yum - ...

  9. bzoj 3365 [Usaco2004 Feb]Distance Statistics 路程统计(点分治,单调)

    [题意] 求树上长度不超过k的点对数目. [思路] 和 Tree 一样一样的. 就是最后统计的时候别忘把根加上. [代码] #include<set> #include<cmath& ...

  10. Python字典方法copy()和deepcopy()的区别

    from copy import deepcopy # import deepcopy模块 d = {} d['name'] = ['black', 'guts'] # d = {'name': [' ...