android 涨潮动画加载_Android附带涨潮动画效果的曲线报表绘制

写在前面

本文属于部分原创,实现安卓平台正弦曲线类报表绘制功能介绍,基于网络已有的曲线报表绘制类(LineGraphicView)自己添加了涨潮的渐变动画算法

最终效果图

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

废话少说,直接上源码

一、自定义View LineGraphicView,本类注释不算多,能搜到这篇文章的朋友看懂代码应该不会有障碍

import java.util.ArrayList;

import android.content.Context;

import android.content.res.Resources;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.Paint.Style;

import android.graphics.Path;

import android.graphics.Point;

import android.util.AttributeSet;

import android.util.DisplayMetrics;

import android.view.View;

import android.view.WindowManager;

import android.view.animation.Animation;

import android.view.animation.Transformation;

class LineGraphicView extends View {

/**

* 公共部分

*/

private static final int CIRCLE_SIZE = 10;

private static int yPos = 0;

private float aniProgress;// 实现动画的值

private HistogramAnimation ani;

private static enum Linestyle {

Line, Curve

}

private Context mContext;

private Paint mPaint;

private Resources res;

private DisplayMetrics dm;

/**

* data

*/

private Linestyle mStyle = Linestyle.Curve;

private int canvasHeight;

private int canvasWidth;

private int bheight = 0;

private int blwidh;

private boolean isMeasure = true;

/**

* Y轴最大值

*/

private int maxValue;

/**

* Y轴间距值

*/

private int averageValue;

private int marginTop = 10;

private int marginBottom = 40;

/**

* 曲线上总点数

*/

private Point[] mPoints;

/**

* 纵坐标值

*/

private ArrayList yRawData;

/**

* 横坐标值

*/

private ArrayList xRawDatas;

private ArrayList xList = new ArrayList();// 记录每个x的值

private int spacingHeight;

public LineGraphicView(Context context) {

this(context, null);

}

public LineGraphicView(Context context, AttributeSet attrs) {

super(context, attrs);

this.mContext = context;

initView();

}

private void initView() {

this.res = mContext.getResources();

this.mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);

dm = new DisplayMetrics();

WindowManager wm = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);

wm.getDefaultDisplay().getMetrics(dm);

ani = new HistogramAnimation();

ani.setDuration(1000);

startAnimation(ani);

}

@Override

protected void onSizeChanged(int w, int h, int oldw, int oldh) {

if (isMeasure) {

this.canvasHeight = getHeight();

this.canvasWidth = getWidth();

if (bheight == 0)

bheight = (int) (canvasHeight - marginBottom);

blwidh = dip2px(30);

isMeasure = false;

}

}

@Override

protected void onDraw(Canvas canvas) {

mPaint.setColor(Color.GRAY);

drawAllXLine(canvas);

// 画直线(纵向)

drawAllYLine(canvas);

// 点的操作设置

mPoints = getPoints();

mPaint.setColor(Color.RED);

mPaint.setStrokeWidth(dip2px(0.2f));

mPaint.setStyle(Style.STROKE);

if (mStyle == Linestyle.Curve) {

drawScrollLine(canvas);

} else {

drawLine(canvas);

}

mPaint.setStyle(Style.FILL);

for (int i = 0; i < mPoints.length; i++) {

canvas.drawCircle(mPoints[i].x, mPoints[i].y, CIRCLE_SIZE / 2, mPaint);

}

}

/**

* 画所有横向表格,包括X轴

*/

private void drawAllXLine(Canvas canvas) {

for (int i = 0; i < spacingHeight + 1; i++) {

if (i == 0) {

yPos = bheight - (bheight / spacingHeight) * i + marginTop;

}

canvas.drawLine(blwidh, bheight - (bheight / spacingHeight) * i + marginTop, (canvasWidth - blwidh), bheight - (bheight / spacingHeight) * i + marginTop, mPaint);// Y坐标

drawText(String.valueOf(averageValue * i), blwidh / 2, bheight - (bheight / spacingHeight) * i + marginTop, canvas);

}

}

/**

* 画所有纵向表格,包括Y轴

*/

private void drawAllYLine(Canvas canvas) {

for (int i = 0; i < yRawData.size(); i++) {

xList.add(blwidh + (canvasWidth - blwidh) / yRawData.size() * i);

canvas.drawLine(blwidh + (canvasWidth - blwidh) / yRawData.size() * i, marginTop, blwidh + (canvasWidth - blwidh) / yRawData.size() * i, bheight + marginTop, mPaint);

drawText(xRawDatas.get(i), blwidh + (canvasWidth - blwidh) / yRawData.size() * i, bheight + dip2px(18), canvas);// X坐标

}

}

private void drawScrollLine(Canvas canvas) {

// 画曲线

int sh = 0;

int eh = 0;

Point startp = new Point();

Point endp = new Point();

for (int i = 0; i < mPoints.length - 1; i++) {

startp = mPoints[i];

endp = mPoints[i + 1];

if (aniProgress <= 0) {

sh = yPos;

eh = yPos;

} else if (aniProgress >= 1) {

sh = startp.y;

eh = endp.y;

} else {

sh = (int) ((int) startp.y + (yPos - startp.y) * (1 - aniProgress));

eh = (int) ((int) endp.y + (yPos - endp.y) * (1 - aniProgress));

}

startp.y = sh;

endp.y = eh;

int wt = (startp.x + endp.x) / 2;

Point p3 = new Point();

Point p4 = new Point();

p3.x = wt;

p3.y = sh;

p4.x = wt;

p4.y = eh;

Path path = new Path();

path.moveTo(startp.x, startp.y);// (51, 991),(172, 670)

path.cubicTo(p3.x, p3.y, p4.x, p4.y, endp.x, endp.y);

// canvas.drawPath(path, mPaint);

path.lineTo(endp.x, yPos);

path.lineTo(startp.x, yPos);

path.lineTo(startp.x, endp.y);

Paint paint = new Paint();

paint.setColor(Color.CYAN);

paint.setStyle(Paint.Style.FILL);

// 设置抗锯齿。

paint.setAntiAlias(true);

canvas.drawPath(path, paint);

}

}

private void drawLine(Canvas canvas) {

Point startp = new Point();

Point endp = new Point();

for (int i = 0; i < mPoints.length - 1; i++) {

startp = mPoints[i];

endp = mPoints[i + 1];

canvas.drawLine(startp.x, startp.y, endp.x, endp.y, mPaint);

}

}

private void drawText(String text, int x, int y, Canvas canvas) {

Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);

p.setTextSize(dip2px(12));

p.setColor(Color.BLACK);

p.setTextAlign(Paint.Align.LEFT);

canvas.drawText(text, x, y, p);

}

private Point[] getPoints() {

Point[] points = new Point[yRawData.size()];

for (int i = 0; i < yRawData.size(); i++) {

int ph = bheight - (int) (bheight * (yRawData.get(i) / maxValue));

points[i] = new Point(xList.get(i), ph + marginTop);

}

return points;

}

public void setData(ArrayList yRawData, ArrayList xRawData, int maxValue, int averageValue) {

this.maxValue = maxValue;

this.averageValue = averageValue;

this.mPoints = new Point[yRawData.size()];

this.xRawDatas = xRawData;

this.yRawData = yRawData;

this.spacingHeight = maxValue / averageValue;

}

public void setTotalvalue(int maxValue) {

this.maxValue = maxValue;

}

public void setPjvalue(int averageValue) {

this.averageValue = averageValue;

}

public void setMargint(int marginTop) {

this.marginTop = marginTop;

}

public void setMarginb(int marginBottom) {

this.marginBottom = marginBottom;

}

public void setMstyle(Linestyle mStyle) {

this.mStyle = mStyle;

}

public void setBheight(int bheight) {

this.bheight = bheight;

}

/**

* 根据手机的分辨率从 dp 的单位 转成为 px(像素)

*/

private int dip2px(float dpValue) {

return (int) (dpValue * dm.density + 0.5f);

}

private class HistogramAnimation extends Animation {

@Override

protected void applyTransformation(float interpolatedTime, Transformation t) {

super.applyTransformation(interpolatedTime, t);

aniProgress = interpolatedTime;

postInvalidate();

}

}二、入口页面调用这个自定义控件

import java.util.ArrayList;

import java.util.Random;

import android.annotation.SuppressLint;

import android.app.Activity;

import android.os.Bundle;

@SuppressLint("ClickableViewAccessibility")

public class MainActivity extends Activity {

LineGraphicView tu;

ArrayList yList;

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

initViews();

}

private void initViews() {

tu = (LineGraphicView) findViewById(R.id.histogram);

yList = new ArrayList();

Random random = new Random();

for (int i = 0; i < 16; i++) {

yList.add(random.nextDouble() * 10);

}

ArrayList xRawDatas = new ArrayList();

for (int i = 0; i < 16; i++) {

xRawDatas.add(String.valueOf(i));

}

tu.setData(yList, xRawDatas, 10, 1);

}

}三、Mainactivity引用的activity_main.xml如下

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

android:id="@+id/histogram"

android:layout_width="wrap_content"

android:layout_height="match_parent" >

结束语

上述代码亲测有效,但也只是实现了基本功能,封装有待完善,欢迎宝宝们来学习交流~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/392569.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用css3属性transition实现页面滚动

<!DOCTYPE html> <html><head><meta http-equiv"Content-type" content"text/html; charsetutf-8" /><title>慕课七夕主题</title><script src"http://libs.baidu.com/jquery/1.9.1/jquery.min.js">&…

leetcode 321. 拼接最大数(单调栈)

给定长度分别为 m 和 n 的两个数组&#xff0c;其元素由 0-9 构成&#xff0c;表示两个自然数各位上的数字。现在从这两个数组中选出 k (k < m n) 个数字拼接成一个新的数&#xff0c;要求从同一个数组中取出的数字保持其在原数组中的相对顺序。 求满足该条件的最大数。结…

Oracle Study之--Oracle等待事件(5)

Db file single write这个等待事件通常只发生在一种情况下&#xff0c;就是Oracle 更新数据文件头信息时&#xff08;比如发生Checkpoint&#xff09;。当这个等待事件很明显时&#xff0c;需要考虑是不是数据库中的数据文件数量太大&#xff0c;导致Oracle 需要花较长的时间来…

两台centos之间免密传输 scp

两台linux服务器之间免密scp&#xff0c;在A机器上向B远程拷贝文件 操作步骤&#xff1a;1、在A机器上&#xff0c;执行ssh-keygen -t rsa&#xff0c;一路按Enter&#xff0c;不需要输入任何内容。&#xff08;如有提示是否覆盖&#xff0c;可输入y后按回车&#xff09;2、到/…

jsp导出数据时离开页面_您应该在要离开的公司开始使用数据

jsp导出数据时离开页面If you’re new in data science, “doing data science” likely sounds like a big deal to you. You might think that you need meticulously collected data, all the tools for data science and a flawless knowledge before you can claim that y…

分步表单如何实现 html_HTML表格入门的分步指南

分步表单如何实现 htmlby Abhishek Jakhar通过阿比舍克贾卡(Abhishek Jakhar) HTML表格入门的分步指南 (A step-by-step guide to getting started with HTML tables) 总览 (Overview) The web is filled with information like football scores, cricket scores, lists of em…

laravel mysql pdo,更改Laravel中的基本PDO配置

My shared web host have some problems with query prepares and I want to enable PDOs emulated prepares, theres no option for this in the config\database.php.Is there any way I can do that in Laravel?解决方案You can add an "options" array to add o…

Java多线程-工具篇-BlockingQueue

Java多线程-工具篇-BlockingQueue 转载 http://www.cnblogs.com/jackyuj/archive/2010/11/24/1886553.html 这也是我们在多线程环境下&#xff0c;为什么需要BlockingQueue的原因。作为BlockingQueue的使用者&#xff0c;我们再也不需要关心什么时候需要阻塞线程&#xff0c;什…

leetcode 204. 计数质数

统计所有小于非负整数 n 的质数的数量。 示例 1&#xff1a; 输入&#xff1a;n 10 输出&#xff1a;4 解释&#xff1a;小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。 解题思路 大于等于5的质数一定和6的倍数相邻。例如5和7&#xff0c;11和13,17和19等等&#xff1b…

JAVA 网络编程小记

在进行JAVA网络编程时&#xff0c;发现写入的数据对方等200ms左右才会收到。起初认为是JAVA自已进行了 Cache。进行flush也没有效果。查看JDK代码&#xff0c;Write操作直接调用的native方法&#xff0c;说明JAVA层面并没有缓存。再看flush&#xff0c;只是一个空方法. FileOut…

vue生成静态js文件_如何立即使用Vue.js生成静态网站

vue生成静态js文件by Ondřej Polesn通过OndřejPolesn 如何立即使用Vue.js生成静态网站 (How to generate a static website with Vue.js in no time) You have decided to build a static site, but where do you start? How do you select the right tool for the job wit…

查看文件夹大小的4种方法,总有一种是你喜欢的

有必要检查文件夹的大小,以确定它们是否占用了太多的存储空间。此外,如果你通过互联网或其他存储设备传输文件夹,还需要查看文件夹大小。 幸运的是,在Windows设备上查看文件夹大小非常容易。窗口中提供了图形化和基于命令行的应用程序,为你提供了多种方法。 如何在Windo…

Python 获取服务器的CPU个数

在使用gunicorn时&#xff0c;需要设置workers&#xff0c; 例如&#xff1a; gunicorn --workers3 app:app -b 0.0.0.0:9000 其中&#xff0c;worker的数量并不是越多越好&#xff0c;推荐值是CPU的个数x21&#xff0c; CPU个数使用如下的方式获取&#xff1a; python -c impo…

多种数据库连接工具_20多种热门数据工具及其不具备的功能

多种数据库连接工具In the past few months, the data ecosystem has continued to burgeon as some parts of the stack consolidate and as new challenges arise. Our first attempt to help stakeholders navigate this ecosystem highlighted 25 Hot New Data Tools and W…

怎么连接 mysql_怎样连接连接数据库

这个博客是为了说明怎么连接数据库第一步&#xff1a;肯定是要下载数据库&#xff0c;本人用的SqlServer2008&#xff0c;是从别人的U盘中拷来的。第二步&#xff1a;数据库的登录方式设置为混合登录&#xff0c;步骤如下&#xff1a;1.打开数据库这是数据库界面&#xff0c;要…

webstorm环境安装配置(less+autoprefixer)

node安装&#xff1a; 参考地址&#xff1a;http://www.runoob.com/nodejs/nodejs-install-setup.html 1.下载node安装包并完成安装 2.在开始菜单打开node 3.查看是否安装完成&#xff08;npm是node自带安装的&#xff09; 命令&#xff1a;node -v npm -v less安装&#xff1a…

leetcode 659. 分割数组为连续子序列(贪心算法)

给你一个按升序排序的整数数组 num&#xff08;可能包含重复数字&#xff09;&#xff0c;请你将它们分割成一个或多个子序列&#xff0c;其中每个子序列都由连续整数组成且长度至少为 3 。 如果可以完成上述分割&#xff0c;则返回 true &#xff1b;否则&#xff0c;返回 fa…

将JAVA编译为EXE的几种方法

< DOCTYPE html PUBLIC -WCDTD XHTML StrictEN httpwwwworgTRxhtmlDTDxhtml-strictdtd> 将JAVA编译为EXE的几种方法 -------------------------------------------------------------------------------- 将Java应用程序本地编译为EXE的几种方法(建议使用JOVE和JET)  a.…

文本训练集_训练文本中的不稳定性

文本训练集介绍 (Introduction) In text generation, conventionally, maximum likelihood estimation is used to train a model to generate a text one token at a time. Each generated token will be compared against the ground-truth data. If any token is different …

山东省赛 传递闭包

https://vjudge.net/contest/311348#problem/A 思路&#xff1a;用floyd传递闭包处理点与点之间的关系&#xff0c;之后开数组记录每个数字比它大的个数和小的个数&#xff0c;如果这个个数超过n/2那么它不可能作为中位数&#xff0c;其他的都有可能。 #include<bits/stdc.h…