From 53345242234c23d5cdd030a4f725464cee9173d0 Mon Sep 17 00:00:00 2001 From: wangyiqian Date: Thu, 23 Dec 2021 17:04:16 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=80=E5=8C=96=E6=95=B0=E6=8D=AE=E7=82=B9?= =?UTF-8?q?=E5=AE=9E=E4=BD=93=E7=B1=BB=E7=9A=84=E7=94=A8=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wangyiqian/stockchart/StockChart.kt | 8 ++--- .../stockchart/childchart/kchart/KChart.kt | 35 ++++++++++--------- .../stockchart/childchart/timebar/TimeBar.kt | 29 +++++++-------- .../childchart/volumechart/VolumeChart.kt | 8 ++--- .../stockchart/entities/EmptyKEntity.kt | 3 +- .../stockchart/entities/IKEntity.kt | 10 ++++++ .../stockchart/entities/KEntitiyFlags.kt | 33 +++++++++++++++++ .../wangyiqian/stockchart/entities/KEntity.kt | 15 +++++++- .../entities/KEntityOfLineStarter.kt | 7 ++++ .../stockchart/index/BollCalculator.kt | 7 ++-- .../stockchart/index/EMACalculator.kt | 7 ++-- .../stockchart/index/KDJCalculator.kt | 5 +-- .../stockchart/index/MACDCalculator.kt | 7 ++-- .../stockchart/index/MACalculator.kt | 7 ++-- samples/build.gradle | 4 +-- .../wangyiqian/stockchart/sample/DataMock.kt | 9 +++-- .../sample/sample2/Sample2Activity.kt | 6 ++-- .../sample/sample2/custom/CustomChart.kt | 9 ++--- .../sample/sample3/Sample3Activity.kt | 4 +-- .../sample/sample3/activechart/ActiveChart.kt | 14 ++++---- .../sample/sample3/data/ActiveChartKEntity.kt | 10 +++++- 21 files changed, 155 insertions(+), 82 deletions(-) create mode 100644 lib/src/main/java/com/github/wangyiqian/stockchart/entities/KEntitiyFlags.kt diff --git a/lib/src/main/java/com/github/wangyiqian/stockchart/StockChart.kt b/lib/src/main/java/com/github/wangyiqian/stockchart/StockChart.kt index 96b2ecf..049bd0c 100644 --- a/lib/src/main/java/com/github/wangyiqian/stockchart/StockChart.kt +++ b/lib/src/main/java/com/github/wangyiqian/stockchart/StockChart.kt @@ -22,9 +22,7 @@ import android.view.View import android.view.ViewGroup import androidx.annotation.UiThread import com.github.wangyiqian.stockchart.childchart.base.IChildChart -import com.github.wangyiqian.stockchart.entities.EmptyKEntity -import com.github.wangyiqian.stockchart.entities.GestureEvent -import com.github.wangyiqian.stockchart.entities.Highlight +import com.github.wangyiqian.stockchart.entities.* import com.github.wangyiqian.stockchart.listener.OnKEntitiesChangedListener import com.github.wangyiqian.stockchart.util.checkMainThread import kotlin.math.max @@ -149,7 +147,7 @@ class StockChart @JvmOverloads constructor(context: Context, attrs: AttributeSet val rightIdx = (tmp4FloatArray[2] + 0.5f).toInt() - 1 var result: Int? = null for (i in rightIdx downTo leftIdx) { - if (i in config.kEntities.indices && config.kEntities[i] !is EmptyKEntity) { + if (i in config.kEntities.indices && !config.kEntities[i].containFlag(FLAG_EMPTY)) { result = i break } @@ -169,7 +167,7 @@ class StockChart @JvmOverloads constructor(context: Context, attrs: AttributeSet val rightIdx = (tmp4FloatArray[2] + 0.5f).toInt() - 1 var result: Int? = null for (i in leftIdx..rightIdx) { - if (i in config.kEntities.indices && config.kEntities[i] !is EmptyKEntity) { + if (i in config.kEntities.indices && !config.kEntities[i].containFlag(FLAG_EMPTY)) { result = i break } diff --git a/lib/src/main/java/com/github/wangyiqian/stockchart/childchart/kchart/KChart.kt b/lib/src/main/java/com/github/wangyiqian/stockchart/childchart/kchart/KChart.kt index 1761b9c..3e4c6c4 100644 --- a/lib/src/main/java/com/github/wangyiqian/stockchart/childchart/kchart/KChart.kt +++ b/lib/src/main/java/com/github/wangyiqian/stockchart/childchart/kchart/KChart.kt @@ -16,8 +16,9 @@ package com.github.wangyiqian.stockchart.childchart.kchart import android.graphics.* import com.github.wangyiqian.stockchart.IStockChart import com.github.wangyiqian.stockchart.childchart.base.BaseChildChart -import com.github.wangyiqian.stockchart.entities.EmptyKEntity -import com.github.wangyiqian.stockchart.entities.KEntityOfLineStarter +import com.github.wangyiqian.stockchart.entities.FLAG_EMPTY +import com.github.wangyiqian.stockchart.entities.FLAG_LINE_STARTER +import com.github.wangyiqian.stockchart.entities.containFlag import com.github.wangyiqian.stockchart.index.Index import kotlin.math.abs import kotlin.math.max @@ -117,7 +118,7 @@ open class KChart( var yMin = 0f var yMax = 0f - getKEntities().filterIndexed { index, kEntity -> index in startIndex..endIndex && kEntity !is EmptyKEntity } + getKEntities().filterIndexed { index, kEntity -> index in startIndex..endIndex && !kEntity.containFlag(FLAG_EMPTY) } .apply { when (chartConfig.kChartType) { is KChartConfig.KChartType.CANDLE, is KChartConfig.KChartType.HOLLOW, is KChartConfig.KChartType.BAR -> { @@ -450,7 +451,7 @@ open class KChart( mapPointsReal2Value(tmp4FloatArray) val leftIdx = (tmp4FloatArray[0] + 0.5f).toInt() val rightIdx = (tmp4FloatArray[2] + 0.5f).toInt() - 1 - getKEntities().filterIndexed { kEntityIdx, kEntity -> kEntityIdx in leftIdx..rightIdx && kEntity !is EmptyKEntity } + getKEntities().filterIndexed { kEntityIdx, kEntity -> kEntityIdx in leftIdx..rightIdx && !kEntity.containFlag(FLAG_EMPTY) } .map { it.getHighPrice() }.max() var maxIdx: Int? = null @@ -459,7 +460,7 @@ open class KChart( var minPrice = 0f val kEntities = getKEntities() for (i in leftIdx..rightIdx) { - if (i in kEntities.indices && kEntities[i] !is EmptyKEntity) { + if (i in kEntities.indices && !kEntities[i].containFlag(FLAG_EMPTY)) { if (minIdx == null || maxIdx == null) { maxIdx = i minIdx = i @@ -610,7 +611,7 @@ open class KChart( var preIdx = -1 for (idx in getKEntities().indices) { - if (getKEntities()[idx] is EmptyKEntity || getKEntities()[idx] is KEntityOfLineStarter) { + if (getKEntities()[idx].containFlag(FLAG_EMPTY) || getKEntities()[idx].containFlag(FLAG_LINE_STARTER)) { if (preIdx != -1) { tmpPath.lineTo(preIdx + 1f, getKEntities()[preIdx].getClosePrice()) tmpPath.lineTo(preIdx + 1f, yMinValue) @@ -619,7 +620,7 @@ open class KChart( tmpPath.reset() } preIdx = -1 - if (getKEntities()[idx] is EmptyKEntity) { + if (getKEntities()[idx].containFlag(FLAG_EMPTY)) { continue } } @@ -648,12 +649,12 @@ open class KChart( preIdx = -1 for (idx in getKEntities().indices) { - if (getKEntities()[idx] is EmptyKEntity) { + if (getKEntities()[idx].containFlag(FLAG_EMPTY)) { preIdx = -1 continue } - if (preIdx == -1 || getKEntities()[idx] is KEntityOfLineStarter) { + if (preIdx == -1 || getKEntities()[idx].containFlag(FLAG_LINE_STARTER)) { preIdx = idx continue } @@ -685,12 +686,12 @@ open class KChart( var preAvgIdx = -1 for (idx in getKEntities().indices) { - if (getKEntities()[idx] is EmptyKEntity || getKEntities()[idx].getAvgPrice() == null) { + if (getKEntities()[idx].containFlag(FLAG_EMPTY) || getKEntities()[idx].getAvgPrice() == null) { preAvgIdx = -1 continue } - if (preAvgIdx == -1 || getKEntities()[idx] is KEntityOfLineStarter) { + if (preAvgIdx == -1 || getKEntities()[idx].containFlag(FLAG_LINE_STARTER)) { preAvgIdx = idx continue } @@ -718,7 +719,7 @@ open class KChart( val spaceWidth = 1 * chartConfig.barSpaceRatio var left = spaceWidth / 2f getKEntities().forEachIndexed { idx, kEntity -> - if (kEntity !is EmptyKEntity) { + if (!kEntity.containFlag(FLAG_EMPTY)) { barKChartPaint.color = if (isRise(idx)) stockChart.getConfig().riseColor else stockChart.getConfig().downColor @@ -751,7 +752,7 @@ open class KChart( val spaceWidth = 1 * chartConfig.barSpaceRatio var left = spaceWidth / 2f getKEntities().forEachIndexed { idx, kEntity -> - if (kEntity !is EmptyKEntity) { + if (!kEntity.containFlag(FLAG_EMPTY)) { hollowKChartPaint.color = if (isRise(idx)) stockChart.getConfig().riseColor else stockChart.getConfig().downColor @@ -793,7 +794,7 @@ open class KChart( val spaceWidth = 1 * chartConfig.barSpaceRatio var left = spaceWidth / 2f getKEntities().forEachIndexed { idx, kEntity -> - if (kEntity !is EmptyKEntity) { + if (!kEntity.containFlag(FLAG_EMPTY)) { candleKChartPaint.color = if (isRise(idx)) stockChart.getConfig().riseColor else stockChart.getConfig().downColor candleKChartPaint.color = candleKChartPaint.color @@ -820,7 +821,7 @@ open class KChart( if (getKEntities()[idx].getClosePrice() == getKEntities()[idx].getOpenPrice()) { if (idx - 1 in getKEntities().indices) { val preKEntity = getKEntities()[idx - 1] - if (preKEntity !is EmptyKEntity) { + if (!preKEntity.containFlag(FLAG_EMPTY)) { getKEntities()[idx].getClosePrice() >= preKEntity.getClosePrice() } else { true @@ -837,12 +838,12 @@ open class KChart( lineKChartLinePaint.color = chartConfig.lineChartColor var preIdx = -1 for (idx in getKEntities().indices) { - if (getKEntities()[idx] is EmptyKEntity) { + if (getKEntities()[idx].containFlag(FLAG_EMPTY)) { preIdx = -1 continue } - if (preIdx == -1 || getKEntities()[idx] is KEntityOfLineStarter) { + if (preIdx == -1 || getKEntities()[idx].containFlag(FLAG_LINE_STARTER)) { preIdx = idx continue } diff --git a/lib/src/main/java/com/github/wangyiqian/stockchart/childchart/timebar/TimeBar.kt b/lib/src/main/java/com/github/wangyiqian/stockchart/childchart/timebar/TimeBar.kt index f31e998..66abe64 100644 --- a/lib/src/main/java/com/github/wangyiqian/stockchart/childchart/timebar/TimeBar.kt +++ b/lib/src/main/java/com/github/wangyiqian/stockchart/childchart/timebar/TimeBar.kt @@ -17,7 +17,8 @@ import android.graphics.Canvas import android.graphics.Paint import com.github.wangyiqian.stockchart.IStockChart import com.github.wangyiqian.stockchart.childchart.base.BaseChildChart -import com.github.wangyiqian.stockchart.entities.EmptyKEntity +import com.github.wangyiqian.stockchart.entities.FLAG_EMPTY +import com.github.wangyiqian.stockchart.entities.containFlag import com.github.wangyiqian.stockchart.util.DimensionUtil import java.util.* @@ -96,7 +97,7 @@ class TimeBar(stockChart: IStockChart, chartConfig: TimeBarConfig) : getKEntities().forEachIndexed { idx, kEntity -> - if (kEntity is EmptyKEntity) return@forEachIndexed + if (kEntity.containFlag(FLAG_EMPTY)) return@forEachIndexed val time = kEntity.getTime() tmpDate.time = time @@ -156,7 +157,7 @@ class TimeBar(stockChart: IStockChart, chartConfig: TimeBarConfig) : var tmpLabel = "" getKEntities().forEachIndexed { idx, kEntity -> - if (kEntity is EmptyKEntity) return@forEachIndexed + if (kEntity.containFlag(FLAG_EMPTY)) return@forEachIndexed val time = kEntity.getTime() tmpDate.time = time @@ -191,7 +192,7 @@ class TimeBar(stockChart: IStockChart, chartConfig: TimeBarConfig) : val labelMinSpace = DimensionUtil.dp2px(context, 70f) getKEntities().forEachIndexed { idx, kEntity -> - if (kEntity is EmptyKEntity) return@forEachIndexed + if (kEntity.containFlag(FLAG_EMPTY)) return@forEachIndexed val time = kEntity.getTime() tmpDate.time = time @@ -230,7 +231,7 @@ class TimeBar(stockChart: IStockChart, chartConfig: TimeBarConfig) : getKEntities().forEachIndexed { idx, kEntity -> - if (kEntity is EmptyKEntity) return@forEachIndexed + if (kEntity.containFlag(FLAG_EMPTY)) return@forEachIndexed val time = kEntity.getTime() tmpDate.time = time @@ -267,7 +268,7 @@ class TimeBar(stockChart: IStockChart, chartConfig: TimeBarConfig) : getKEntities().forEachIndexed { idx, kEntity -> - if (kEntity is EmptyKEntity) return@forEachIndexed + if (kEntity.containFlag(FLAG_EMPTY)) return@forEachIndexed val time = kEntity.getTime() tmpDate.time = time @@ -305,7 +306,7 @@ class TimeBar(stockChart: IStockChart, chartConfig: TimeBarConfig) : getKEntities().forEachIndexed { idx, kEntity -> - if (kEntity is EmptyKEntity) return@forEachIndexed + if (kEntity.containFlag(FLAG_EMPTY)) return@forEachIndexed val time = kEntity.getTime() tmpDate.time = time @@ -343,7 +344,7 @@ class TimeBar(stockChart: IStockChart, chartConfig: TimeBarConfig) : getKEntities().forEachIndexed { idx, kEntity -> - if (kEntity is EmptyKEntity) return@forEachIndexed + if (kEntity.containFlag(FLAG_EMPTY)) return@forEachIndexed val time = kEntity.getTime() tmpDate.time = time @@ -381,7 +382,7 @@ class TimeBar(stockChart: IStockChart, chartConfig: TimeBarConfig) : getKEntities().forEachIndexed { idx, kEntity -> - if (kEntity is EmptyKEntity) return@forEachIndexed + if (kEntity.containFlag(FLAG_EMPTY)) return@forEachIndexed val time = kEntity.getTime() tmpDate.time = time @@ -424,7 +425,7 @@ class TimeBar(stockChart: IStockChart, chartConfig: TimeBarConfig) : getKEntities().forEachIndexed { idx, kEntity -> - if (kEntity is EmptyKEntity) return@forEachIndexed + if (kEntity.containFlag(FLAG_EMPTY)) return@forEachIndexed val time = kEntity.getTime() tmpDate.time = time @@ -462,7 +463,7 @@ class TimeBar(stockChart: IStockChart, chartConfig: TimeBarConfig) : getKEntities().forEachIndexed { idx, kEntity -> - if (kEntity is EmptyKEntity) return@forEachIndexed + if (kEntity.containFlag(FLAG_EMPTY)) return@forEachIndexed val time = kEntity.getTime() tmpDate.time = time @@ -499,7 +500,7 @@ class TimeBar(stockChart: IStockChart, chartConfig: TimeBarConfig) : getKEntities().forEachIndexed { idx, kEntity -> - if (kEntity is EmptyKEntity) return@forEachIndexed + if (kEntity.containFlag(FLAG_EMPTY)) return@forEachIndexed val time = kEntity.getTime() tmpDate.time = time @@ -536,7 +537,7 @@ class TimeBar(stockChart: IStockChart, chartConfig: TimeBarConfig) : getKEntities().forEachIndexed { idx, kEntity -> - if (kEntity is EmptyKEntity) return@forEachIndexed + if (kEntity.containFlag(FLAG_EMPTY)) return@forEachIndexed val time = kEntity.getTime() tmpDate.time = time @@ -613,7 +614,7 @@ class TimeBar(stockChart: IStockChart, chartConfig: TimeBarConfig) : val kEntity = getKEntities()[idx] - if (kEntity is EmptyKEntity) return + if (kEntity.containFlag(FLAG_EMPTY)) return val time = kEntity.getTime() tmpDate.time = time diff --git a/lib/src/main/java/com/github/wangyiqian/stockchart/childchart/volumechart/VolumeChart.kt b/lib/src/main/java/com/github/wangyiqian/stockchart/childchart/volumechart/VolumeChart.kt index 4e5384c..8f3b3c3 100644 --- a/lib/src/main/java/com/github/wangyiqian/stockchart/childchart/volumechart/VolumeChart.kt +++ b/lib/src/main/java/com/github/wangyiqian/stockchart/childchart/volumechart/VolumeChart.kt @@ -17,9 +17,9 @@ import android.graphics.Canvas import android.graphics.Paint import com.github.wangyiqian.stockchart.IStockChart import com.github.wangyiqian.stockchart.childchart.base.BaseChildChart -import com.github.wangyiqian.stockchart.entities.EmptyKEntity +import com.github.wangyiqian.stockchart.entities.FLAG_EMPTY +import com.github.wangyiqian.stockchart.entities.containFlag import kotlin.math.max -import kotlin.math.round /** * 成交量图 @@ -76,7 +76,7 @@ class VolumeChart( getKEntities().forEachIndexed { idx, kEntity -> - if (kEntity !is EmptyKEntity) { + if (!kEntity.containFlag(FLAG_EMPTY)) { val isRise = isRise(idx) volumePaint.color = if (isRise) stockChart.getConfig().riseColor else stockChart.getConfig().downColor @@ -104,7 +104,7 @@ class VolumeChart( if (getKEntities()[idx].getClosePrice() == getKEntities()[idx].getOpenPrice()) { if (idx - 1 in getKEntities().indices) { val preKEntity = getKEntities()[idx - 1] - if (preKEntity !is EmptyKEntity) { + if (!preKEntity.containFlag(FLAG_EMPTY)) { getKEntities()[idx].getClosePrice() >= preKEntity.getClosePrice() } else { true diff --git a/lib/src/main/java/com/github/wangyiqian/stockchart/entities/EmptyKEntity.kt b/lib/src/main/java/com/github/wangyiqian/stockchart/entities/EmptyKEntity.kt index 2ccf0e1..df387aa 100644 --- a/lib/src/main/java/com/github/wangyiqian/stockchart/entities/EmptyKEntity.kt +++ b/lib/src/main/java/com/github/wangyiqian/stockchart/entities/EmptyKEntity.kt @@ -19,4 +19,5 @@ package com.github.wangyiqian.stockchart.entities * @author wangyiqian E-mail: wangyiqian9891@gmail.com * @version 创建时间: 2021/1/29 */ -open class EmptyKEntity : KEntity(0f, 0f, 0f, 0f, 0, 0) \ No newline at end of file +@Deprecated("") +open class EmptyKEntity : KEntity(0f, 0f, 0f, 0f, 0, 0, null, FLAG_EMPTY) \ No newline at end of file diff --git a/lib/src/main/java/com/github/wangyiqian/stockchart/entities/IKEntity.kt b/lib/src/main/java/com/github/wangyiqian/stockchart/entities/IKEntity.kt index a2d2435..e2b4a22 100644 --- a/lib/src/main/java/com/github/wangyiqian/stockchart/entities/IKEntity.kt +++ b/lib/src/main/java/com/github/wangyiqian/stockchart/entities/IKEntity.kt @@ -36,4 +36,14 @@ interface IKEntity { */ fun getAvgPrice(): Float? fun setAvgPrice(price: Float?) + + /** + * 用于设置标记位 如[FLAG_EMPTY]、[FLAG_LINE_STARTER] + */ + fun setFlag(flag: Int) + + /** + * 标记位 + */ + fun getFlag(): Int } \ No newline at end of file diff --git a/lib/src/main/java/com/github/wangyiqian/stockchart/entities/KEntitiyFlags.kt b/lib/src/main/java/com/github/wangyiqian/stockchart/entities/KEntitiyFlags.kt new file mode 100644 index 0000000..b12818b --- /dev/null +++ b/lib/src/main/java/com/github/wangyiqian/stockchart/entities/KEntitiyFlags.kt @@ -0,0 +1,33 @@ +/* + * Copyright 2021 WangYiqian + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + * + */ + +package com.github.wangyiqian.stockchart.entities + +/** + * @author wangyiqian E-mail: wangyiqian9891@gmail.com + * @version 创建时间: 2021/12/23 + */ + +const val FLAG_DEFAULT = 0 + +/** + * 空点 + */ +const val FLAG_EMPTY = 1 shl 0 + +/** + * 折线起始点,目的是为了实现五日线这种不同日的折线不需要相连,每日起始第一个点使用此标记位即可 + */ +const val FLAG_LINE_STARTER = 1 shl 1 + +fun IKEntity.containFlag(flag: Int) = getFlag() and flag == flag \ No newline at end of file diff --git a/lib/src/main/java/com/github/wangyiqian/stockchart/entities/KEntity.kt b/lib/src/main/java/com/github/wangyiqian/stockchart/entities/KEntity.kt index c057ac7..c6eed1f 100644 --- a/lib/src/main/java/com/github/wangyiqian/stockchart/entities/KEntity.kt +++ b/lib/src/main/java/com/github/wangyiqian/stockchart/entities/KEntity.kt @@ -26,7 +26,8 @@ open class KEntity( private var closePrice: Float, private var volume: Long, private var time: Long, - private var avgPrice: Float? = null + private var avgPrice: Float? = null, + private var flag: Int = FLAG_DEFAULT ) : IKEntity { override fun getHighPrice() = highPrice @@ -70,4 +71,16 @@ open class KEntity( override fun setAvgPrice(price: Float?) { this.avgPrice = price } + + override fun setFlag(flag: Int) { + this.flag = flag + } + + override fun getFlag(): Int { + return flag + } + + companion object { + fun obtainEmptyKEntity() = KEntity(0f, 0f, 0f, 0f, 0, 0, null, FLAG_EMPTY) + } } \ No newline at end of file diff --git a/lib/src/main/java/com/github/wangyiqian/stockchart/entities/KEntityOfLineStarter.kt b/lib/src/main/java/com/github/wangyiqian/stockchart/entities/KEntityOfLineStarter.kt index 45cddbc..de0f131 100644 --- a/lib/src/main/java/com/github/wangyiqian/stockchart/entities/KEntityOfLineStarter.kt +++ b/lib/src/main/java/com/github/wangyiqian/stockchart/entities/KEntityOfLineStarter.kt @@ -19,6 +19,7 @@ package com.github.wangyiqian.stockchart.entities * @author wangyiqian E-mail: wangyiqian9891@gmail.com * @version 创建时间: 2021/2/22 */ +@Deprecated("") open class KEntityOfLineStarter(private val kEntity: IKEntity) : IKEntity { override fun getHighPrice() = kEntity.getHighPrice() @@ -62,4 +63,10 @@ open class KEntityOfLineStarter(private val kEntity: IKEntity) : IKEntity { override fun setAvgPrice(price: Float?) { kEntity.setAvgPrice(price) } + + override fun setFlag(flag: Int) { + kEntity.setFlag(flag) + } + + override fun getFlag() = FLAG_LINE_STARTER } \ No newline at end of file diff --git a/lib/src/main/java/com/github/wangyiqian/stockchart/index/BollCalculator.kt b/lib/src/main/java/com/github/wangyiqian/stockchart/index/BollCalculator.kt index caae781..56e7b67 100644 --- a/lib/src/main/java/com/github/wangyiqian/stockchart/index/BollCalculator.kt +++ b/lib/src/main/java/com/github/wangyiqian/stockchart/index/BollCalculator.kt @@ -13,8 +13,9 @@ package com.github.wangyiqian.stockchart.index -import com.github.wangyiqian.stockchart.entities.EmptyKEntity +import com.github.wangyiqian.stockchart.entities.FLAG_EMPTY import com.github.wangyiqian.stockchart.entities.IKEntity +import com.github.wangyiqian.stockchart.entities.containFlag import kotlin.math.pow import kotlin.math.sqrt @@ -40,7 +41,7 @@ object BollCalculator: ICalculator { var pEnd = 0 var sum = 0f input.forEachIndexed { kEntityIdx, kEntity -> - if (kEntity is EmptyKEntity) { + if (kEntity.containFlag(FLAG_EMPTY)) { result[mbIdx][kEntityIdx] = null result[upIdx][kEntityIdx] = null result[dnIdx][kEntityIdx] = null @@ -48,7 +49,7 @@ object BollCalculator: ICalculator { return@forEachIndexed } - if (kEntityIdx == 0 || input[kEntityIdx - 1] is EmptyKEntity) { + if (kEntityIdx == 0 || input[kEntityIdx - 1].containFlag(FLAG_EMPTY)) { pFrom = kEntityIdx } diff --git a/lib/src/main/java/com/github/wangyiqian/stockchart/index/EMACalculator.kt b/lib/src/main/java/com/github/wangyiqian/stockchart/index/EMACalculator.kt index fcce8ec..7f64e8b 100644 --- a/lib/src/main/java/com/github/wangyiqian/stockchart/index/EMACalculator.kt +++ b/lib/src/main/java/com/github/wangyiqian/stockchart/index/EMACalculator.kt @@ -13,8 +13,9 @@ package com.github.wangyiqian.stockchart.index -import com.github.wangyiqian.stockchart.entities.EmptyKEntity +import com.github.wangyiqian.stockchart.entities.FLAG_EMPTY import com.github.wangyiqian.stockchart.entities.IKEntity +import com.github.wangyiqian.stockchart.entities.containFlag /** * 指数移动平均值(Exponential Moving Average) @@ -29,14 +30,14 @@ object EMACalculator : ICalculator { val result = MutableList(emaPeriodList.size) { MutableList(input.size) { 0f } } input.forEachIndexed { kEntityIdx, kEntity -> - if (kEntity is EmptyKEntity) { + if (kEntity.containFlag(FLAG_EMPTY)) { emaPeriodList.forEachIndexed { periodListIdx, _ -> result[periodListIdx][kEntityIdx] = null } return@forEachIndexed } emaPeriodList.forEachIndexed { periodListIdx, n -> - if (kEntityIdx == 0 || input[kEntityIdx - 1] is EmptyKEntity) { + if (kEntityIdx == 0 || input[kEntityIdx - 1].containFlag(FLAG_EMPTY)) { result[periodListIdx][kEntityIdx] = input[kEntityIdx].getClosePrice() } else { result[periodListIdx][kEntityIdx] = diff --git a/lib/src/main/java/com/github/wangyiqian/stockchart/index/KDJCalculator.kt b/lib/src/main/java/com/github/wangyiqian/stockchart/index/KDJCalculator.kt index c207c26..7c8ab20 100644 --- a/lib/src/main/java/com/github/wangyiqian/stockchart/index/KDJCalculator.kt +++ b/lib/src/main/java/com/github/wangyiqian/stockchart/index/KDJCalculator.kt @@ -13,8 +13,9 @@ package com.github.wangyiqian.stockchart.index -import com.github.wangyiqian.stockchart.entities.EmptyKEntity +import com.github.wangyiqian.stockchart.entities.FLAG_EMPTY import com.github.wangyiqian.stockchart.entities.IKEntity +import com.github.wangyiqian.stockchart.entities.containFlag import kotlin.math.max import kotlin.math.min @@ -36,7 +37,7 @@ object KDJCalculator: ICalculator { val dIdx = 1 val jIdx = 2 input.forEachIndexed { kEntityIdx, kEntity -> - if (kEntity is EmptyKEntity) { + if (kEntity.containFlag(FLAG_EMPTY)) { result[kIdx][kEntityIdx] = null result[dIdx][kEntityIdx] = null result[jIdx][kEntityIdx] = null diff --git a/lib/src/main/java/com/github/wangyiqian/stockchart/index/MACDCalculator.kt b/lib/src/main/java/com/github/wangyiqian/stockchart/index/MACDCalculator.kt index a109bc9..4cbc1ec 100644 --- a/lib/src/main/java/com/github/wangyiqian/stockchart/index/MACDCalculator.kt +++ b/lib/src/main/java/com/github/wangyiqian/stockchart/index/MACDCalculator.kt @@ -13,8 +13,9 @@ package com.github.wangyiqian.stockchart.index -import com.github.wangyiqian.stockchart.entities.EmptyKEntity +import com.github.wangyiqian.stockchart.entities.FLAG_EMPTY import com.github.wangyiqian.stockchart.entities.IKEntity +import com.github.wangyiqian.stockchart.entities.containFlag /** * 指数平滑异同移动平均线(Moving Average Convergence and Divergence) @@ -37,14 +38,14 @@ object MACDCalculator : ICalculator { var preEmaShort = 0f var preEmaLong = 0f input.forEachIndexed { kEntityIdx, kEntity -> - if (kEntity is EmptyKEntity) { + if (kEntity.containFlag(FLAG_EMPTY)) { result[difIdx][kEntityIdx] = null result[deaIdx][kEntityIdx] = null result[macdIdx][kEntityIdx] = null return@forEachIndexed } - if (kEntityIdx == 0 || input[kEntityIdx - 1] is EmptyKEntity) { + if (kEntityIdx == 0 || input[kEntityIdx - 1].containFlag(FLAG_EMPTY)) { result[difIdx][kEntityIdx] = 0f result[deaIdx][kEntityIdx] = 0f result[macdIdx][kEntityIdx] = 0f diff --git a/lib/src/main/java/com/github/wangyiqian/stockchart/index/MACalculator.kt b/lib/src/main/java/com/github/wangyiqian/stockchart/index/MACalculator.kt index a9eb30f..df7e205 100644 --- a/lib/src/main/java/com/github/wangyiqian/stockchart/index/MACalculator.kt +++ b/lib/src/main/java/com/github/wangyiqian/stockchart/index/MACalculator.kt @@ -13,8 +13,9 @@ package com.github.wangyiqian.stockchart.index -import com.github.wangyiqian.stockchart.entities.EmptyKEntity +import com.github.wangyiqian.stockchart.entities.FLAG_EMPTY import com.github.wangyiqian.stockchart.entities.IKEntity +import com.github.wangyiqian.stockchart.entities.containFlag /** * 移动平均线(Moving Average) @@ -33,7 +34,7 @@ object MACalculator: ICalculator { val pEndList = MutableList(periodList.size) { 0 } val sumList = MutableList(periodList.size) { 0f } input.forEachIndexed { kEntityIdx, kEntity -> - if (kEntity is EmptyKEntity) { + if (kEntity.containFlag(FLAG_EMPTY)) { periodList.forEachIndexed { periodListIdx, _ -> result[periodListIdx][kEntityIdx] = null sumList[periodListIdx] = 0f @@ -42,7 +43,7 @@ object MACalculator: ICalculator { } periodList.forEachIndexed { periodListIdx, period -> - if (kEntityIdx == 0 || input[kEntityIdx - 1] is EmptyKEntity) { + if (kEntityIdx == 0 || input[kEntityIdx - 1].containFlag(FLAG_EMPTY)) { pFromList[periodListIdx] = kEntityIdx } diff --git a/samples/build.gradle b/samples/build.gradle index a91c986..56065e7 100644 --- a/samples/build.gradle +++ b/samples/build.gradle @@ -70,6 +70,6 @@ dependencies { androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' implementation 'com.google.android:flexbox:2.0.1' -// implementation project(':lib') - implementation 'com.github.wangyiqian:StockChart:1.0.16' + implementation project(':lib') +// implementation 'com.github.wangyiqian:StockChart:1.0.16' } \ No newline at end of file diff --git a/samples/src/main/java/com/github/wangyiqian/stockchart/sample/DataMock.kt b/samples/src/main/java/com/github/wangyiqian/stockchart/sample/DataMock.kt index 41b924c..c67baed 100644 --- a/samples/src/main/java/com/github/wangyiqian/stockchart/sample/DataMock.kt +++ b/samples/src/main/java/com/github/wangyiqian/stockchart/sample/DataMock.kt @@ -14,10 +14,9 @@ package com.github.wangyiqian.stockchart.sample import android.content.Context -import com.github.wangyiqian.stockchart.entities.EmptyKEntity +import com.github.wangyiqian.stockchart.entities.FLAG_LINE_STARTER import com.github.wangyiqian.stockchart.entities.IKEntity import com.github.wangyiqian.stockchart.entities.KEntity -import com.github.wangyiqian.stockchart.entities.KEntityOfLineStarter import com.github.wangyiqian.stockchart.sample.sample3.data.ActiveChartKEntity import com.github.wangyiqian.stockchart.sample.sample3.data.ActiveInfo import com.github.wangyiqian.stockchart.sample.sample3.data.ActiveResponse @@ -61,13 +60,13 @@ object DataMock { val dateFormat = SimpleDateFormat("MM/dd") val date = Date() var dateStr = "" - result.forEachIndexed { idx, kEntity -> + result.forEach { kEntity -> date.time = kEntity.getTime() val formatDate = dateFormat.format(date) if (formatDate != dateStr) { dateStr = formatDate - result[idx] = KEntityOfLineStarter(kEntity) + kEntity.setFlag(FLAG_LINE_STARTER) } } callback.invoke(result) @@ -116,7 +115,7 @@ object DataMock { val maxDaysOfYear = calendar.getActualMaximum(Calendar.DAY_OF_YEAR) val weekCount = (maxDaysOfYear - dayOfYear) / 7 + 1 for (i in 0 until (weekCount - result.size)) { - result.add(EmptyKEntity()) // 一年内还未产生的数据用EmptyKEntity()填充 + result.add(KEntity.obtainEmptyKEntity()) // 一年内还未产生的数据用EmptyKEntity()填充 } } callback.invoke(result) diff --git a/samples/src/main/java/com/github/wangyiqian/stockchart/sample/sample2/Sample2Activity.kt b/samples/src/main/java/com/github/wangyiqian/stockchart/sample/sample2/Sample2Activity.kt index fa9ba96..eedad2a 100644 --- a/samples/src/main/java/com/github/wangyiqian/stockchart/sample/sample2/Sample2Activity.kt +++ b/samples/src/main/java/com/github/wangyiqian/stockchart/sample/sample2/Sample2Activity.kt @@ -30,9 +30,7 @@ import com.github.wangyiqian.stockchart.childchart.timebar.TimeBarConfig import com.github.wangyiqian.stockchart.childchart.timebar.TimeBarFactory import com.github.wangyiqian.stockchart.childchart.volumechart.VolumeChartConfig import com.github.wangyiqian.stockchart.childchart.volumechart.VolumeChartFactory -import com.github.wangyiqian.stockchart.entities.EmptyKEntity -import com.github.wangyiqian.stockchart.entities.Highlight -import com.github.wangyiqian.stockchart.entities.IKEntity +import com.github.wangyiqian.stockchart.entities.* import com.github.wangyiqian.stockchart.index.Index import com.github.wangyiqian.stockchart.listener.OnHighlightListener import com.github.wangyiqian.stockchart.listener.OnLoadMoreListener @@ -209,7 +207,7 @@ class Sample2Activity : AppCompatActivity() { if (idx in kEntities.indices) { val kEntity = kEntities[idx] - if (kEntity is EmptyKEntity) { + if (kEntity.containFlag(FLAG_EMPTY)) { showContent = "" } else if (kChartType is KChartConfig.KChartType.LINE || kChartType is KChartConfig.KChartType.MOUNTAIN) { val firstIdx = stock_chart.findFirstNotEmptyKEntityIdxInDisplayArea() diff --git a/samples/src/main/java/com/github/wangyiqian/stockchart/sample/sample2/custom/CustomChart.kt b/samples/src/main/java/com/github/wangyiqian/stockchart/sample/sample2/custom/CustomChart.kt index 2b685a5..912816e 100644 --- a/samples/src/main/java/com/github/wangyiqian/stockchart/sample/sample2/custom/CustomChart.kt +++ b/samples/src/main/java/com/github/wangyiqian/stockchart/sample/sample2/custom/CustomChart.kt @@ -18,8 +18,9 @@ import android.graphics.Color import android.graphics.Paint import com.github.wangyiqian.stockchart.IStockChart import com.github.wangyiqian.stockchart.childchart.base.BaseChildChart -import com.github.wangyiqian.stockchart.entities.EmptyKEntity +import com.github.wangyiqian.stockchart.entities.FLAG_EMPTY import com.github.wangyiqian.stockchart.entities.IKEntity +import com.github.wangyiqian.stockchart.entities.containFlag import com.github.wangyiqian.stockchart.util.DimensionUtil /** @@ -52,7 +53,7 @@ class CustomChart( var yMax = 0f var yMin = 0f - getKEntities().filterIndexed { index, kEntity -> index in startIndex..endIndex && kEntity !is EmptyKEntity } + getKEntities().filterIndexed { index, kEntity -> index in startIndex..endIndex && !kEntity.containFlag(FLAG_EMPTY) } .map { getAvgPrice(it) }.apply { if (size > 0) { yMax = max()!! @@ -88,7 +89,7 @@ class CustomChart( override fun drawData(canvas: Canvas) { getKEntities().forEachIndexed { index, kEntity -> - if (kEntity !is EmptyKEntity) { + if (!kEntity.containFlag(FLAG_EMPTY)) { tmp2FloatArray[0] = index + 0.5f tmp2FloatArray[1] = getAvgPrice(kEntity) mapPointsValue2Real(tmp2FloatArray) @@ -106,7 +107,7 @@ class CustomChart( val idx = highlight.getIdx() - if (idx >= 0 && idx <= getKEntities().size - 1 && getKEntities()[idx] !is EmptyKEntity) { + if (idx >= 0 && idx <= getKEntities().size - 1 && !getKEntities()[idx].containFlag(FLAG_EMPTY)) { val yValue = getAvgPrice(getKEntities()[idx]) // 计算出要绘制的坐标 diff --git a/samples/src/main/java/com/github/wangyiqian/stockchart/sample/sample3/Sample3Activity.kt b/samples/src/main/java/com/github/wangyiqian/stockchart/sample/sample3/Sample3Activity.kt index b191610..6b04ac0 100644 --- a/samples/src/main/java/com/github/wangyiqian/stockchart/sample/sample3/Sample3Activity.kt +++ b/samples/src/main/java/com/github/wangyiqian/stockchart/sample/sample3/Sample3Activity.kt @@ -19,8 +19,8 @@ import android.os.Bundle import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.github.wangyiqian.stockchart.StockChartConfig -import com.github.wangyiqian.stockchart.entities.EmptyKEntity import com.github.wangyiqian.stockchart.entities.IKEntity +import com.github.wangyiqian.stockchart.entities.KEntity import com.github.wangyiqian.stockchart.sample.DataMock import com.github.wangyiqian.stockchart.sample.R import com.github.wangyiqian.stockchart.sample.sample3.activechart.ActiveChartConfig @@ -138,7 +138,7 @@ class Sample3Activity : AppCompatActivity() { kEntities = kEntities.subList(0, fixDataCount) } else { // 不够的数据补点为空白点EmptyKEntity for (i in 0..(fixDataCount - kEntities.size)) { - kEntities.add(EmptyKEntity()) + kEntities.add(KEntity.obtainEmptyKEntity()) } } } diff --git a/samples/src/main/java/com/github/wangyiqian/stockchart/sample/sample3/activechart/ActiveChart.kt b/samples/src/main/java/com/github/wangyiqian/stockchart/sample/sample3/activechart/ActiveChart.kt index 493bf34..c261116 100644 --- a/samples/src/main/java/com/github/wangyiqian/stockchart/sample/sample3/activechart/ActiveChart.kt +++ b/samples/src/main/java/com/github/wangyiqian/stockchart/sample/sample3/activechart/ActiveChart.kt @@ -16,9 +16,7 @@ package com.github.wangyiqian.stockchart.sample.sample3.activechart import android.graphics.* import com.github.wangyiqian.stockchart.IStockChart import com.github.wangyiqian.stockchart.childchart.base.BaseChildChart -import com.github.wangyiqian.stockchart.entities.EmptyKEntity -import com.github.wangyiqian.stockchart.entities.GestureEvent -import com.github.wangyiqian.stockchart.entities.KEntityOfLineStarter +import com.github.wangyiqian.stockchart.entities.* import com.github.wangyiqian.stockchart.sample.sample3.data.ActiveInfo import com.github.wangyiqian.stockchart.sample.sample3.data.IActiveChartKEntity import java.lang.Float.max @@ -61,7 +59,7 @@ class ActiveChart(stockChart: IStockChart, chartConfig: ActiveChartConfig) : override fun getYValueRange(startIndex: Int, endIndex: Int, result: FloatArray) { var yMin = 0f var yMax = 0f - getKEntities().filterIndexed { index, kEntity -> index in startIndex..endIndex && kEntity !is EmptyKEntity } + getKEntities().filterIndexed { index, kEntity -> index in startIndex..endIndex && !kEntity.containFlag(FLAG_EMPTY) } .apply { forEachIndexed { index, kEntity -> if (index == 0) { @@ -113,7 +111,7 @@ class ActiveChart(stockChart: IStockChart, chartConfig: ActiveChartConfig) : var preIdx = -1 for (idx in getKEntities().indices) { - if (getKEntities()[idx] is EmptyKEntity || getKEntities()[idx] is KEntityOfLineStarter) { + if (getKEntities()[idx].containFlag(FLAG_EMPTY) || getKEntities()[idx].containFlag(FLAG_LINE_STARTER)) { if (preIdx != -1) { tmpPath.lineTo(preIdx + 0.5f, 0f) mapPathValue2Real(tmpPath) @@ -121,7 +119,7 @@ class ActiveChart(stockChart: IStockChart, chartConfig: ActiveChartConfig) : tmpPath.reset() } preIdx = -1 - if (getKEntities()[idx] is EmptyKEntity) { + if (getKEntities()[idx].containFlag(FLAG_EMPTY)) { continue } } @@ -145,12 +143,12 @@ class ActiveChart(stockChart: IStockChart, chartConfig: ActiveChartConfig) : preIdx = -1 for (idx in getKEntities().indices) { - if (getKEntities()[idx] is EmptyKEntity) { + if (getKEntities()[idx].containFlag(FLAG_EMPTY)) { preIdx = -1 continue } - if (preIdx == -1 || getKEntities()[idx] is KEntityOfLineStarter) { + if (preIdx == -1 || getKEntities()[idx].containFlag(FLAG_LINE_STARTER)) { preIdx = idx continue } diff --git a/samples/src/main/java/com/github/wangyiqian/stockchart/sample/sample3/data/ActiveChartKEntity.kt b/samples/src/main/java/com/github/wangyiqian/stockchart/sample/sample3/data/ActiveChartKEntity.kt index d3dee5a..5c1475b 100644 --- a/samples/src/main/java/com/github/wangyiqian/stockchart/sample/sample3/data/ActiveChartKEntity.kt +++ b/samples/src/main/java/com/github/wangyiqian/stockchart/sample/sample3/data/ActiveChartKEntity.kt @@ -13,6 +13,7 @@ package com.github.wangyiqian.stockchart.sample.sample3.data +import com.github.wangyiqian.stockchart.entities.FLAG_DEFAULT import com.github.wangyiqian.stockchart.entities.IKEntity /** @@ -24,7 +25,8 @@ class ActiveChartKEntity( private var avgPrice: Float?, private var time: Long, private var volume: Long, - private var active: ActiveInfo? + private var active: ActiveInfo?, + private var flag: Int = FLAG_DEFAULT ) : IKEntity, IActiveChartKEntity { override fun getAvgPrice() = avgPrice @@ -69,4 +71,10 @@ class ActiveChartKEntity( } override fun getActiveInfo() = active + + override fun setFlag(flag: Int) { + this.flag = flag + } + + override fun getFlag() = flag } \ No newline at end of file