Android原生股票图-分时图讲解(一)

Android原生股票图-分时图讲解(二)

在 分时图讲解(一)中我们主要实现分时图的绘制和CJL图、MACD图的绘制,以及各个线段的含义和X轴、Y轴各坐标值的含义等等。在这篇片文章中将进一步讲解分时图的绘制过程。

一、BaseMinuteView基类的讲解首先BaseMinuteView要继承View,实现OnGestureListener和OnScaleGestureListener接口。

1、在onMeasure()和onSizeChanged()我们主要获取MainView和ChildView的Width和Height。在两个方法的具体用法在里就不多说了网上一搜一大推。。。。。。。@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec); setMeasuredDimension(widthMeasureSpec, heightMeasureSpec); int height = heightSpecSize - mTopPadding - mBottomPadding - mVolumeTextHeight; if (isDrawChildView) { this.mMainHeight = (int) (height * 0.75f); this.mVolumeHeight = (int) (height * 0.25f); } else { this.mMainHeight = (int) (height * 1f); this.mVolumeHeight = (int) (height * 0f); } this.mWidth = getMeasuredWidth(); notifyChanged(); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); int height = h - mTopPadding - mBottomPadding - mVolumeTextHeight; if (isDrawChildView) { this.mMainHeight = (int) (height * 0.75f); this.mVolumeHeight = (int) (height * 0.25f); } else { this.mMainHeight = (int) (height * 1f); this.mVolumeHeight = (int) (height * 0f); } this.mWidth = w; notifyChanged(); }

2、点击手势// 单击, 触摸屏按下时立刻触发 @Override public boolean onDown(MotionEvent e) { Log.i("--->", "onDown"); return false; } //短按, 触摸屏按下后片刻后抬起,会触发这个手势,假如迅速抬起则不会 @Override public void onShowPress(MotionEvent e) { } //抬起, 手指离开触摸屏时触发(长按、滚动、滑动时,不会触发这个手势) @Override public boolean onSingleTapUp(MotionEvent e) { switch (e.getAction()) { case MotionEvent.ACTION_DOWN: Log.i("--->", "ACTION_DOWN"); break; case MotionEvent.ACTION_UP: //双指点击时不会触发 Log.i("--->", "ACTION_UP"); if (isClosePress) { if (isDrawChildView) { //当点击时间小于2000ms时,为交互时间 if (System.currentTimeMillis() - mClickTime < 500) { float downX = e.getX(); float downY = e.getY(); jumpToCJLAndMACL(downX, downY); } } } else { isClosePress = true; } break; case MotionEvent.ACTION_MOVE: Log.i("--->", "ACTION_MOVE"); break; } return false; } //滚动, 触摸屏按下后移动 @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return false; } //长按, 触摸屏按下后既不抬起也不移动,过一段时间后触发 @Override public void onLongPress(MotionEvent e) { isLongPress = true; isClosePress = false; calculateSelectedX(e.getX()); invalidate(); } //滑动, 触摸屏按下后快速移动并抬起,会先触发滚动手势,跟着触发一个滑动手势 @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return false; }

在这个接口回调方法中主要在onSingleTapUp()方法中进行单指点击调用jumpToCJLAndMACL(float downX, float downY)来切换CJL图和MACD图。

在onLongPress()长按回调方法触发calculateSelectedX(float x)来显示弹框。

3、缩放手势

主要在onScale()方法中通过获取detector.getScaleFactor()缩放因子mOldScale ,而后在onScaleEnd()方法中通过和1进行比较来判断放大和缩小。@Override public boolean onScale(ScaleGestureDetector detector) { if (!isScaleEnable()) { return false; } mOldScale = 1.0f; float f = detector.getScaleFactor(); mOldScale *= f; return true; } @Override public boolean onScaleBegin(ScaleGestureDetector detector) { return true; } @Override public void onScaleEnd(ScaleGestureDetector detector) { if (isClosePress) { if (mOldScale > 1.0f) { //放大 mOnScaleGestureListener.setLoseNumber(); } else { //收缩 mOnScaleGestureListener.setAddNumber(); } } }

一、MinuteTimeView分时图实现类的讲解

在这个类中主要实现分时图、CJL图和MACD图的计算和绘制。

1、X轴(时间轴)的绘制"tradeRanges": [ { "start": 1539867600000, "end": 1539882000000 }, { "start": 1539910800000, "end": 1539915300000 }, { "start": 1539916200000, "end": 1539919800000 }, { "start": 1539927000000, "end": 1539932400000 } ],

在时间数组中主要提供一天各时间段的时间,我们首先计算这个时间段的时间总和,而后用Width除以时间总和得到X轴单位变化率。if (mTimes.size() != 0) {//计算时间总数 for (int i = 0; i < mTimes.size(); i++) { mStartTime = mTimes.get(i).getStartDate(); mEndTime = mTimes.get(i).getEndDate(); mTotalTime += mEndTime.getTime() - mStartTime.getTime(); } } else { mTotalTime = mMainEndTime.getTime() - mMainStartTime.getTime(); }

调用getX(int position)方法获取每个点对应X轴的位置。/** * 根据索引获取x的值 */ private float getX(int position) { mCount = 0; if (mPoints.size() == 0 || mPoints == null || position == -1) { return 0; } Long dateTime = mPoints.get(position).getDate().getTime(); for (int i = 0; i < mTimes.size(); i++) { Long startTime = mTimes.get(i).getStartDate().getTime(); Long endTime = mTimes.get(i).getEndDate().getTime(); if (dateTime >= startTime && dateTime <= endTime) { mCount += (dateTime - startTime) / ONE_MINUTE; break; } else { mCount += (endTime - startTime) / ONE_MINUTE; } } float c = mCount * mScaleX; return mCount * mScaleX; }

android 股票二级列表,Android原生股票图-分时图讲解(二)相关推荐

  1. android 分时图x轴宽度,一步一步教你写股票走势图——分时图二(自定义xy轴)...

    目录 一步一步教你写股票走势图--分时图一(概述) 一步一步教你写股票走势图--分时图二(自定义xy轴) 一步一步教你写股票走势图--分时图三(对齐图表.自定义柱状图高亮) 一步一步教你写股票走势图- ...

  2. 一步一步教你写股票走势图——分时图二(自定义xy轴)

    目录 一步一步教你写股票走势图--分时图一(概述) 一步一步教你写股票走势图--分时图二(自定义xy轴) 一步一步教你写股票走势图--分时图三(对齐图表.自定义柱状图高亮) 一步一步教你写股票走势图- ...

  3. android 横向多级列表,Android实现横向二级菜单

    本文实例为大家分享了Android二级横向菜单的实现过程.效果如上图: 这种横向的二级菜单在很多的app都有所应用.效果看起来还是非常的美观的.也算是项目需要,自己也就学了一下这个效果,首先说一下逻辑 ...

  4. android购物车二级列表实现+MVP+Okhttp

    //主界面 package com.example.shop;import android.os.Bundle; import android.os.Handler; import android.o ...

  5. Android ExpandableListView (二级列表)

    ExpandableListView是android中可以实现下滑子菜单效果的一个控件 在布局文件(layout)目录下创建三个新的 .xml 文件(android xml layout file), ...

  6. android开发评论列表,Android类Reddit循环评论列表开发

    最近因为项目需求,需要开发类似Reddit里面无限循环的评论列表,于是就开始研究其实现方式和可用性,reddit评论如下: reddit评论 从最开始的印象看,我们可以看到这是一个树状列表,如果没有限 ...

  7. android 新闻功能列表,android listview实现新闻列表展示效果

    本文实例为大家分享了android listview列表展示效果的具体代码,供大家参考,具体内容如下 1.封装一些新闻数据 2.使用listview展示出来 3.设置条目点击事件,点击后跳转浏览器查看 ...

  8. android+完美的列表,android完美讲义.pdf

    android完美讲义 王骋 QQ Phone Mail • 感谢我的同事,陈操(横拓开源技术副总),在 他提供的资料乊上做了迚一步总结提炼. • 参考资料android sdk开发文档,IBM开发者 ...

  9. android双联动列表,Android Fragment实现列表和内容联动

    在平板上经常能看到这种的情况:左边是一个列表,右边是列表项对应的内容,当点击某一个列表时,右边内容区也会随之改变.下面使用fragment简单的demo: 思路:在mainactivity定义一个回调 ...

最新文章

  1. 李彦宏成为首登《时代周刊》的互联网大佬,百度研究院再添三名大牛
  2. 给Scrum Master的十个建议,你值得拥有((转自scrum中文网))
  3. 《浪潮之巅》读书笔记汇总
  4. STVD下配置Cosmic编译器
  5. window上安装mysql_在window上安装mysql - MySQL5.7.24 版本
  6. php随机数字不重复使等式成立_php随机数不重复生成的五种方式
  7. wpf Combobox 样式的问题
  8. android ffmpeg 优点_在Android中使用FFmpeg(android studio环境)
  9. 518. 零钱兑换 II(JavaScript)
  10. python学习笔记(对象)
  11. mysql win7 zip_win7 下zip版mysql安装
  12. 千人千面是php算法吗,推荐算法可以做到千人千面,但它的流量利用效率一定是优于人工分发吗?...
  13. 路由器的几种工作模式
  14. Android——实现Home键功能
  15. vue3 ts版本深度拷贝功能推荐ts-deepmerge
  16. centos安装LDAP即配置
  17. 2022年1月语音合成(TTS)和语音识别(ASR)论文月报
  18. java版本与javac版本不一致引起终端无法运行java文件问题
  19. 自顶向下学习 RocketMQ(九):回溯消费
  20. 深度学习——图像分类相关模型一览

热门文章

  1. VSCode 团队卖萌,重新把 Logo 改回了蓝色
  2. spring service层配置
  3. 回调对象设计callbacks、异步回调解决方法deferred
  4. 面向对象方法学的四个要点
  5. poi读取excel工具类
  6. 小程序实现公告栏等3D翻转效果
  7. 公司感染勒索病毒怎么办 怎样及时补救?
  8. 37岁ChatGPT创始人吃二甲双胍抗衰!这种药真能让人延寿吗?
  9. 记一次支付宝H5证书方式支付、回调、及退款
  10. 2019 vs 安装odt_2019年12月20日罗马协会直播预告