热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

Android开发实现绘制淘宝收益图折线效果示例

这篇文章主要介绍了Android开发实现绘制淘宝收益图折线效果,涉及Androidcanvas图形绘制及布局控制相关操作技巧,需要的朋友可以参考下

本文实例讲述了Android开发实现绘制淘宝收益图折线效果。分享给大家供大家参考,具体如下:

实现的效果我一会贴上,我先说下原理,我们知道要实现在canvas上画线,不就是要搞一个paint嘛,然后首先肯定要设置下paint的属性,那么画文字呢,不就是Textpaint吗,对,就是这么简单,接下来怎么画,折线图主要分为X轴和y轴,x轴表示日期,y表示收益,好,说道这里,大家应该知道怎么去做了,下面直接贴代码

这个方法是,画x,y坐标系的,以及上面的日期和收益了

private void drawCoordinate(Canvas canvas) {
  //坐标系画笔
  Paint coordinatePaint = new Paint();
  coordinatePaint.setAntiAlias(true);
  coordinatePaint.setStrokeWidth(1);
  coordinatePaint.setColor(getResources().getColor(R.color.c5));
  //坐标系文字画笔
  TextPaint coordinateTextPaint = new TextPaint();
  coordinateTextPaint.setAntiAlias(true);
  coordinateTextPaint.setTextSize(scaleTextSize);
  coordinateTextPaint.setAntiAlias(true);
  coordinateTextPaint.setColor(scaleTextColor);
  coordinateTextPaint.setTextAlign(Align.CENTER);
  //水平的刻度线
  float verticalScaleStep = getVerticalScaleStep();
  coordinateTextPaint.setTextAlign(Align.RIGHT);
  float textHeight = getTextHeight(coordinateTextPaint, "8");
  for (int i = 0; i 

但是产品有个需求啊,就是点击当前日期可以查看我的收益,并且在交汇点上展示出来

private void drawCurve(Canvas canvas) {
  Paint curvePaint = new Paint();//曲线画笔
  curvePaint.setColor(curveColor);
  curvePaint.setAntiAlias(true);
  curvePaint.setStrokeWidth(curveStrokeWidth);
  float horizOntalScaleStep= getHorizontalScaleStep();
  float lastXPixels = 0, newYPixels = 0;
  float lastYPixels = 0, newXPixels = 0;
  float useHeight = getHeight() - bottomPadding - topPadding;
  for (int i = 0; i 

点击交汇点,有文字提示说明,

private void drawTipRect(Canvas canvas) {
  if (mTouchIndex == -1) return;
  LinePoint point = line.getPoint(mTouchIndex);
  float x = point.fLineX;
  float y = point.fLineY;
  // 描绘竖线
  Paint paint = new TextPaint();
  PathEffect effects = new DashPathEffect(new float[]{5, 5, 5, 5}, 1);
  paint.setPathEffect(effects);
  paint.setAntiAlias(true);
  paint.setStrokeWidth(verticalLineStrokeWidth);
  paint.setColor(verticalLineColor);
  canvas.drawLine(x, topPadding, x, getHeight() - bottomPadding, paint);
  //描绘交汇圆点
  paint.setPathEffect(null);
  paint.setStyle(Paint.Style.FILL_AND_STROKE);
  paint.setColor(Color.WHITE);
  canvas.drawCircle(x, y, circleRadius, paint);
  paint.setStyle(Paint.Style.STROKE);
  paint.setColor(circleColor);
  paint.setStrokeWidth(circleStrokeWidth);
  canvas.drawCircle(x, y, circleRadius, paint);
  float midY = (topPadding + getHeight() - bottomPadding) / 2;
  float midX = (leftPadding + getWidth() - rightPadding) / 2;
  //描绘圆角矩形
  TextPaint textPaint = new TextPaint();
  textPaint.setTextSize(tipTextSize);
  textPaint.setTextAlign(Align.CENTER);
  textPaint.setColor(tipTextColor);
  textPaint.setAntiAlias(true);
  String label = tipPrefix + point.getY();
  float textWidth = textPaint.measureText(label) + 15;
  float textHeight = getTextHeight(textPaint, label) + 8;
  float hMargin = 10;//水平间距
  float vMargin = 8;//垂直间距
  float w = textWidth + hMargin * 2;//宽
  float h = textHeight + vMargin * 2;//高
  RectF rect = new RectF();
  if (x > midX) {
    rect.right = x - hMargin;
    rect.left = x - w;
  } else {
    rect.left = x + hMargin;
    rect.right = x + w;
  }
  if (y > midY) {
    rect.top = y - h;
    rect.bottom = y - vMargin;
  } else {
    rect.bottom = y + h;
    rect.top = y + vMargin;
  }
  Paint roundRectPaint = new Paint();
  roundRectPaint.setColor(tipRectColor);
  roundRectPaint.setStyle(Paint.Style.FILL);
  roundRectPaint.setAntiAlias(true);
  canvas.drawRoundRect(rect, 3, 3, roundRectPaint);
  // 描绘圆角矩形中间的文字
  float roundTextX = (rect.left + rect.right) / 2;
  float roundTextY = (rect.top + rect.bottom + getTextHeight(textPaint, label)) / 2;
  canvas.drawText(label, roundTextX, roundTextY, textPaint);
}

好了核心的代码就这么多了,由于我们把它当做的是控件再用,那么我们在初始化的时候,肯定会引入一些自定义的样式表,

private void initViews(AttributeSet attrs, int defStyle) {
  TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.LineGraph, defStyle, 0);
  scaleTextSize = typedArray.getDimension(R.styleable.LineGraph_scale_text_size, 20);
  scaleTextColor = typedArray.getColor(R.styleable.LineGraph_scale_text_color, getResources().getColor(R.color.c5));
  tipRectColor = typedArray.getColor(R.styleable.LineGraph_tip_rect_color, getResources().getColor(R.color.c8));
  tipTextSize = typedArray.getDimension(R.styleable.LineGraph_tip_text_size, 22);
  tipTextColor = typedArray.getColor(R.styleable.LineGraph_tip_text_color, getResources().getColor(R.color.c12));
  curveStrokeWidth = typedArray.getDimension(R.styleable.LineGraph_curve_stroke_width, 4);
  curveColor = typedArray.getColor(R.styleable.LineGraph_curve_color, getResources().getColor(R.color.c8));
  verticalLineStrokeWidth = typedArray.getDimension(R.styleable.LineGraph_vertical_line_stroke_width, 2);
  verticalLineColor = typedArray.getColor(R.styleable.LineGraph_vertical_line_color, getResources().getColor(R.color.c8));
  circleStrokeWidth = typedArray.getDimensionPixelSize(R.styleable.LineGraph_circle_stroke_width, 3);
  circleColor = typedArray.getColor(R.styleable.LineGraph_circle_color, getResources().getColor(R.color.c8));
  circleRadius = typedArray.getDimensionPixelSize(R.styleable.LineGraph_circle_radius, 7);
  typedArray.recycle();
  bottomPadding = dip2px(getContext(), 20);
  topPadding = dip2px(getContext(), 10);
  leftPadding = dip2px(getContext(), 20);
  rightPadding = dip2px(getContext(), 10);
}

样式表文件我就不多说了,行如下面的格式,


  
  
  
  
  
  
  
  
  
  
  
  


最后贴上个效果图:

git下载地址:https://github.com/xiangzhihong/lineview

或者点击此处本站下载

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android图形与图像处理技巧总结》、《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android基本组件用法总结》、《Android视图View技巧总结》、《Android布局layout技巧总结》及《Android控件用法总结》

希望本文所述对大家Android程序设计有所帮助。


推荐阅读
  • LCUI 2.1.0 版本现已推出,这是一个用 C 语言编写的图形用户界面开发库,适合创建轻量级的桌面应用程序。此次更新包括多项修复和功能增强,并正式宣布将启动 Android 支持的开发计划。 ... [详细]
  • Barbican 是 OpenStack 社区的核心项目之一,旨在为各种环境下的云服务提供全面的密钥管理解决方案。 ... [详细]
  • 1、字符型常量字符型常量指单个字符,是用一对单引号及其所括起来的字符表示。例如:‘A’、‘a’、‘0’、’$‘等都是字符型常量。C语言的字符使用的就是 ... [详细]
  • Spring Cloud Config 使用 Vault 作为配置存储
    本文探讨了如何在Spring Cloud Config中集成HashiCorp Vault作为配置存储解决方案,基于Spring Cloud Hoxton.RELEASE及Spring Boot 2.2.1.RELEASE版本。文章还提供了详细的配置示例和实践建议。 ... [详细]
  • matlab gamma函数_MATLAB做晶体结构图(固体物理)
    写在前面最近在复习考研复试《固体物理》这一门课,去年学的内容已经忘干净了,所以就翻开前几页。突然看到了面心立方和体心立方结构图,想到了去年 ... [详细]
  • OBS (Open Broadcaster Software) 架构解析
    本文介绍 OBS(Open Broadcaster Software),一款专为直播设计的开源软件。文章将详细探讨其技术架构、核心组件及其开发环境要求。 ... [详细]
  • 本文将指导您如何在Docker环境中高效地搜索、下载Redis镜像,并通过指定或不指定配置文件的方式启动Redis容器。同时,还将介绍如何使用redis-cli工具连接到您的Redis实例。 ... [详细]
  • 利用YAML配置Resilience4J的Circuit Breaker
    本文探讨了Resilience4j作为现代Java应用程序中不可或缺的容错工具,特别介绍了如何通过YAML文件配置Circuit Breaker以提高服务的弹性和稳定性。 ... [详细]
  • 本文详细介绍如何在IntelliJ IDEA 14中打包Android应用APK文件,并提供查询SHA1值的具体步骤。 ... [详细]
  • 本改进旨在提升运行选择器中名称换行的显示效果,以提高用户体验。 ... [详细]
  • 本文详细介绍了如何通过Git Bash在本地仓库与远程仓库之间建立连接并进行同步操作,包括克隆仓库、提交更改和推送更新等步骤。 ... [详细]
  • 本文详细介绍了如何在现有的Android Studio项目中集成JNI(Java Native Interface),包括下载必要的NDK和构建工具,配置CMakeLists.txt文件,以及编写和调用JNI函数的具体步骤。 ... [详细]
  • Windows 环境下安装 Git 并连接 GitHub 的详细步骤
    本文详细介绍了如何在 Windows 系统中安装 Git 工具,并通过配置 SSH 密钥实现与 GitHub 的安全连接。包括下载、安装、环境配置及验证连接等关键步骤。 ... [详细]
  • 本文档提供了如何使用C#代码从客户订单中提取产品信息的方法,适用于需要处理和分析产品数据的应用场景。 ... [详细]
  • 本文详细介绍了如何在Android应用中使用GridView组件以网格形式展示数据(如文本和图像)。通过行列布局,实现类似矩阵的数据展示效果。 ... [详细]
author-avatar
Edison小磊
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有