基于RecyclerChart的KLine的繪制Scale詳解
本章節(jié)繼上次的底部Volume繪制的后續(xù),沒有再繼續(xù)畫底部的其它圖表,這只是一個(gè)舉一反三的過程,本章節(jié)實(shí)現(xiàn)的圖表的縮放,其實(shí)需求很明確,然后實(shí)現(xiàn)方式依照上章節(jié)末尾的方案,所以還算清晰,只是整個(gè)過程得慢慢的調(diào)試,慢慢地優(yōu)化,當(dāng)然目前還有很多待改進(jìn)的地方,但總體縮放的功能已經(jīng)實(shí)現(xiàn)了。
照舊先看gif效果圖,由于Android studio的錄屏沒法把我的手指觸控的小圓點(diǎn)錄上去,所以看不到我的手指,多指操作。
以下是實(shí)現(xiàn)前,以及實(shí)現(xiàn)過程中羅列的功能點(diǎn)。
1. BaseRecyclerViewChart 處理 OnTouch
2. 禁止掉多指拖動(dòng),影響測(cè)試。(這個(gè)暫時(shí)沒處理掉)
3. displayNumber 跟 detector.scaleFactor的關(guān)系計(jì)算,反比。
4. 設(shè)置 min、max limit level, 橫豎屏不一樣,不同的設(shè)置。
5. 修改displayNumber 后,RecyclerView 如何刷新。
6. 縮放時(shí),刷新位置不準(zhǔn)確,通過PointsX 找 Adapter, 找到虛擬手指中心點(diǎn),對(duì)Adapter進(jìn)行縮放。
7. maxDisplayNumber 為400, 180 ~ 400的區(qū)間 KLine Main 繪制 LineChart, 30 ~ 180 繪制目前的圖形。
8. 7的情況下,在LineChart下 drawFill()
1. 擴(kuò)展縮放功能且兼容原有的觸摸體系
首先要保留原來的觸摸功能不變,同時(shí)添加現(xiàn)在的縮放,得修改BaseRecyclerviewChart的 OnTouch 方法, 最終保留BaseRecyclerviewChart不變,然后相關(guān)的功能放在了StockChartRecyclerView里,這樣就一點(diǎn)都不影響之前的圖表繪制了。
優(yōu)先處理 scaleGestureDetector 縮放,同時(shí)又保持了原來的觸摸體系,很好地?cái)U(kuò)展了目前的功能。
val result = scaleGestureDetector.onTouchEvent(event) if (!scaleGestureDetector.isInProgress) { //原來的邏輯 // Log.d(TAG, "scaleGestureDetector is not in Progress") return super.onTouchEvent(event) } else { Log.d(TAG, "scaleGestureDetector is in Progress") return result }
2. 具體的縮放邏輯處理
處理的就是上面羅列功能里的第3點(diǎn),構(gòu)建了一個(gè)簡(jiǎn)單的displayNumber跟detector.scaleFactor的模型,當(dāng)scaleFactor增加的時(shí)候,displayNumber反而變少。
if (detector.scaleFactor >= 1) {//放大 displayNumber -= (displayNumber * (detector.scaleFactor - 1)).toInt() } else { displayNumber += (displayNumber * (1 - detector.scaleFactor)).toInt() }
理論上值返回是 0 ~ 無窮大,相應(yīng)的displayNumber也變成 0 ~ 無窮大, 所以這里引入一個(gè)上下邊界。
var minDisplayNumber = 30 var maxDisplayNumber = 400 ? displayNumber = displayNumber.coerceAtLeast(minDisplayNumber).coerceAtMost(maxDisplayNumber)
3. 數(shù)據(jù)刷新
從以上的邏輯中拿到縮放后的displayNumber,如何給到Recyclerview進(jìn)行刷新?首先在onScale()內(nèi)埋個(gè)鉤子,然后UI頁面在這個(gè)回調(diào)里進(jìn)行數(shù)據(jù)刷新,這里對(duì)mAttrs中的displayNumber也做一個(gè)刷新,容錯(cuò)處理,怕后續(xù)去讀這個(gè)里面的值。
resetDisplayNumber是一個(gè)高階函數(shù)的變量
var resetDisplayNumber: ((displayNumber:Int) -> Unit)? = null
接著就是UI頁面上的刷新處理,
recyclerView.resetDisplayNumber = { displayNumber -> this@KLineDayFragment.displayNumber = displayNumber mXAxis.resetDisplayNumber(this@KLineDayFragment.displayNumber) mBarChartAdapter.updateXAxis(mXAxis) }
真正刷新的邏輯在mBarChartAdapter.updateXAxis(mXAxis),在BaseBarChartAdapter中添加updateXAxis
public void updateXAxis(XAxis xAxis){ this.mXAxis = xAxis; notifyDataSetChanged(); }
上面的notifyDataSetChanged()之后就會(huì)對(duì)RecylcerView進(jìn)行刷新:
這樣子就會(huì)因?yàn)?displayNumber的改變,然后修改XAxis,最終刷新RecyclerView。
4. 縮放過程KLine Main圖表變幻
這個(gè)實(shí)現(xiàn)的上面功能列表里的第7、8點(diǎn),實(shí)現(xiàn)相對(duì)上面的縮放邏輯而言,功能比較簡(jiǎn)單,本來打算借用StockEntry的close字段值去畫線的,這里先直接借用5日均線進(jìn)行一個(gè)繪制,這個(gè)函數(shù)原來就有的,先實(shí)現(xiàn)功能。
直接看StockChartRenderer的繪制主邏輯代碼。
之前只有 if分支,這次添加了else里面的drawLine, 最后一個(gè)參數(shù)表示 是否drawFill, drawLine跟之前的LineChartRenderer里暫時(shí)去掉了邊界處理, drawFill里 bottom是 KLine Main 跟之前的Attache Chart的一個(gè)分割線
drawFill比較簡(jiǎn)單,就是通過PointF1, PointF2, bottom 構(gòu)建一個(gè)path,然后drawPath 就可以了
private fun drawFill(canvas: Canvas,pointF: PointF, pointF1: PointF, bottom: Float) { mLineFillPaint.color = ColorUtil.getResourcesColor(R.color.black_2) val path = ChartComputeUtil.createColorRectPath(pointF, pointF1, bottom) val drawable = LineChartDrawable(mLineFillPaint, path) drawable.draw(canvas) } ? public static Path createColorRectPath(PointF pointF1, PointF pointF2, float bottom) { Path path = new Path(); path.moveTo(pointF1.x, pointF1.y); path.lineTo(pointF2.x, pointF2.y); path.lineTo(pointF2.x, bottom); path.lineTo(pointF1.x, bottom); path.close(); return path; }
Okay, 縮放的邏輯大致就到此,然后還有一些bug, 例如縮放后,底部XAxis label的繪制在縮放過程中相應(yīng)地變動(dòng)。還有縮放模型的優(yōu)化,功能點(diǎn)里的6不知道是否跟目前一些晃動(dòng)有關(guān),后續(xù)再慢慢優(yōu)化吧。
下次應(yīng)該會(huì)添加底部的MACD圖,其實(shí)跟Volume的繪制是類同的工作,創(chuàng)建模擬MACD的Entity構(gòu)建,然后繪制就可以了,然后就是一個(gè)添加一個(gè)底部Attache Chart的一個(gè) 手勢(shì)監(jiān)測(cè),目前的點(diǎn)擊是HighLight,然后需要替換成底部各個(gè)Attache Chart 圖表的一個(gè)替換,涉及到的一個(gè)之前沒處理過的一個(gè)View的上面部分跟底下點(diǎn)擊然后在自定義的情況下,用不同的Callback調(diào)用處理,應(yīng)該還好處理,相比今天的縮放而言。
到此這篇關(guān)于基于RecyclerChart的KLine的繪制Scale詳解的文章就介紹到這了,更多相關(guān)RecyclerChart KLine繪制Scale內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringCloud?Feign集成AOP的常見問題與解決
在使用?Spring?Cloud?Feign?作為微服務(wù)通信的工具時(shí),我們可能會(huì)遇到?AOP?不生效的問題,這篇文章將深入探討這一問題,給出幾種常見的場(chǎng)景,分析可能的原因,并提供解決方案,希望對(duì)大家有所幫助2023-10-10解決java讀取EXCEL數(shù)據(jù)變成科學(xué)計(jì)數(shù)法的問題
這篇文章主要介紹了解決java讀取EXCEL數(shù)據(jù)變成科學(xué)計(jì)數(shù)法的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04SpringBoot啟動(dòng)器Starters使用及原理解析
這篇文章主要介紹了SpringBoot啟動(dòng)器Starters使用及原理解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04SpringBoot使用maven實(shí)現(xiàn)多環(huán)境運(yùn)行和打包的操作步驟
在開發(fā)過程中,需要不斷進(jìn)行環(huán)境的切換和打包部署,maven提供了多環(huán)境配置,可以方便實(shí)現(xiàn)不同環(huán)境的配置切換和打包,本文通過代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-04-04Java實(shí)現(xiàn)的爬蟲抓取圖片并保存操作示例
這篇文章主要介紹了Java實(shí)現(xiàn)的爬蟲抓取圖片并保存操作,涉及Java針對(duì)頁面URL訪問、獲取、字符串匹配、文件下載等相關(guān)操作技巧,需要的朋友可以參考下2018-08-08基于Java實(shí)現(xiàn)經(jīng)典蜘蛛紙牌游戲
《蜘蛛紙牌》(Ancient?Spider)?是由Oberon?Games開發(fā)的一款休閑益智類游戲。本文將利用Java語言實(shí)現(xiàn)這一經(jīng)典游戲,需要的可以參考一下2022-05-05