├── .gitignore ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── matt │ │ └── demo │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── matt │ │ │ └── demo │ │ │ ├── App.kt │ │ │ └── MainActivity.kt │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ └── activity_main.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ │ └── xml │ │ └── network_security_config.xml │ └── test │ └── java │ └── com │ └── matt │ └── demo │ └── ExampleUnitTest.kt ├── build.gradle ├── doc └── 常用股票指标计算公式及简单应用.pdf ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── lib_common.gradle ├── lib_kt.gradle ├── mpwrapper ├── .gitignore ├── build.gradle ├── consumer-rules.pro ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── matt │ │ └── mpwrapper │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── matt │ │ │ └── mpwrapper │ │ │ ├── bean │ │ │ ├── Boll.kt │ │ │ ├── Config.kt │ │ │ ├── KViewBaseData.kt │ │ │ ├── KViewConstant.java │ │ │ ├── KViewData.kt │ │ │ ├── Kdj.kt │ │ │ ├── Ma.kt │ │ │ ├── Macd.kt │ │ │ ├── MasterData.kt │ │ │ ├── MinorData.kt │ │ │ ├── Price.kt │ │ │ ├── Rsi.kt │ │ │ ├── Vol.kt │ │ │ └── VolData.kt │ │ │ ├── ktx │ │ │ ├── Any.kt │ │ │ └── View.kt │ │ │ ├── utils │ │ │ ├── MathUtil.kt │ │ │ ├── NumberUtils.kt │ │ │ ├── ObjectUtils.java │ │ │ ├── ScreenUtils.java │ │ │ ├── TimeConstants.java │ │ │ ├── TimeUtils.java │ │ │ └── XFormatUtil.kt │ │ │ └── view │ │ │ ├── FinancialAlgorithm.kt │ │ │ ├── FinancialAlgorithmConvert.kt │ │ │ ├── KView.kt │ │ │ ├── MasterView.kt │ │ │ ├── MinorView.kt │ │ │ ├── MpWrapperConfig.kt │ │ │ ├── VolView.kt │ │ │ ├── base │ │ │ ├── BaseInit.kt │ │ │ ├── BaseKView.kt │ │ │ ├── IBaseLoadData.kt │ │ │ ├── IChartLoadData.kt │ │ │ └── IKLoadData.kt │ │ │ ├── charts │ │ │ └── BaseCombinedChart.kt │ │ │ ├── components │ │ │ └── MasterViewMarker.kt │ │ │ ├── data │ │ │ ├── BaseBarDataSet.kt │ │ │ ├── BaseCandleDataSet.kt │ │ │ ├── BaseCombinedData.kt │ │ │ ├── BaseLineDataSet.kt │ │ │ └── CombinedDataControl.kt │ │ │ ├── delegate │ │ │ ├── BaseKViewDelegate.kt │ │ │ ├── DataSetDelegate.kt │ │ │ ├── IChartViewDelegate.kt │ │ │ ├── MasterViewDelegate.kt │ │ │ ├── MinorViewDelegate.kt │ │ │ └── VolViewDelegate.kt │ │ │ ├── listener │ │ │ ├── BaseBarLineChartTouchListener.kt │ │ │ └── LinkChartListener.kt │ │ │ ├── renderer │ │ │ ├── BaseCombinedChartRenderer.kt │ │ │ ├── BaseLegendRenderer.kt │ │ │ ├── BaseLineChartRenderer.kt │ │ │ ├── MasterViewCandleStickChartRenderer.kt │ │ │ └── MasterViewYAxisRenderer.kt │ │ │ └── type │ │ │ ├── BollType.kt │ │ │ ├── KType.java │ │ │ ├── KdjType.kt │ │ │ ├── MaType.kt │ │ │ ├── MacdType.kt │ │ │ ├── MasterIndicatorType.kt │ │ │ ├── MasterViewType.kt │ │ │ ├── MinorIndicatorType.kt │ │ │ ├── RsiType.kt │ │ │ ├── VolIndicatorType.kt │ │ │ └── VolType.kt │ └── res │ │ ├── drawable │ │ ├── shape_gradient_filled.xml │ │ └── shape_markerview_bg.xml │ │ ├── layout │ │ ├── markerview_k_view_shell.xml │ │ └── mp_widget_kview.xml │ │ └── values │ │ ├── colors.xml │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── matt │ └── mpwrapper │ ├── ExampleUnitTest.kt │ ├── utils │ └── MathUtilTest.kt │ └── view │ └── FinancialAlgorithmTest.kt ├── sample_base ├── .gitignore ├── build.gradle ├── consumer-rules.pro ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── matt │ │ └── sample_base │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ └── java │ │ └── com │ │ └── matt │ │ └── sample_base │ │ └── SampleBaseInit.kt │ └── test │ └── java │ └── com │ └── matt │ └── sample_base │ └── ExampleUnitTest.kt ├── sample_binance ├── .gitignore ├── README.md ├── build.gradle ├── consumer-rules.pro ├── proguard-rules.pro ├── screenshots │ ├── bin_竖屏_分时.png │ ├── bin_竖屏_蜡烛图.png │ ├── origin_bin_landscape.png │ ├── origin_bin_portrait.png │ ├── origin_bin_portrait_ktype.png │ └── wrapper_bin_portrait_master_vol_minor.png └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── example │ │ └── sample_binance │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── assets │ │ └── exchangeInfo.json │ ├── java │ │ └── com │ │ │ └── example │ │ │ └── sample_binance │ │ │ ├── SampleBinanceInit.kt │ │ │ ├── model │ │ │ ├── api │ │ │ │ ├── Api24Hr.java │ │ │ │ ├── ApiPriceFilter.java │ │ │ │ ├── ApiSymbol.java │ │ │ │ └── ApiSymbolWrapper.java │ │ │ ├── kview │ │ │ │ └── BinKType.kt │ │ │ └── ws │ │ │ │ ├── WsBase.java │ │ │ │ ├── WsData.java │ │ │ │ ├── WsLatestKLinWrapper.java │ │ │ │ ├── WsLatestKLine.java │ │ │ │ ├── WsReqBase.kt │ │ │ │ └── WsSimpleTicker.java │ │ │ ├── repository │ │ │ ├── memory │ │ │ │ └── GlobalCache.kt │ │ │ ├── net │ │ │ │ ├── BinObserver.kt │ │ │ │ ├── BinanceRetrofitBuilder.kt │ │ │ │ ├── BinanceServiceWrapper.kt │ │ │ │ └── service │ │ │ │ │ └── BinanceService.kt │ │ │ ├── sp │ │ │ │ └── BinSpHelper.kt │ │ │ └── ws │ │ │ │ ├── BinWs.kt │ │ │ │ ├── BinWsApi.kt │ │ │ │ ├── BinWsImpl.kt │ │ │ │ └── BinWsListener.kt │ │ │ └── ui │ │ │ ├── activity │ │ │ ├── BinChartActivity.kt │ │ │ └── BinListActivity.kt │ │ │ ├── fragment │ │ │ ├── BinChartFragment.kt │ │ │ └── BinListFragment.kt │ │ │ ├── pop │ │ │ ├── IndicatorPop.kt │ │ │ └── KViewTypePop.kt │ │ │ └── viewmodel │ │ │ └── BinViewModel.kt │ └── res │ │ ├── drawable-xhdpi │ │ ├── ic_markets_indicator_default.png │ │ ├── ic_markets_indicator_disable.png │ │ ├── ic_markets_reset_active.png │ │ ├── ic_markets_reset_disable.png │ │ ├── ic_triangle_down.png │ │ └── ic_triangle_up.png │ │ ├── drawable-xxhdpi │ │ ├── ic_markets_indicator_default.png │ │ ├── ic_markets_indicator_disable.png │ │ ├── ic_markets_reset_active.png │ │ └── ic_markets_reset_disable.png │ │ ├── layout │ │ ├── bin_activity_bin_chart.xml │ │ ├── bin_activity_bin_list.xml │ │ ├── bin_fragment_bin_list.xml │ │ ├── bin_fragment_chart.xml │ │ ├── bin_item_fragment_bin_list.xml │ │ ├── bin_item_pop_kview_type.xml │ │ ├── bin_pop_indicator.xml │ │ └── bin_pop_kview_type.xml │ │ └── values │ │ ├── colors.xml │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── example │ └── sample_binance │ └── ExampleUnitTest.kt ├── sample_zm ├── .gitignore ├── build.gradle ├── consumer-rules.pro ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── matt │ │ └── sample_zm │ │ └── ExampleInstrumentedTest.kt │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── matt │ │ │ └── sample_zm │ │ │ ├── bean │ │ │ ├── ApiData.java │ │ │ ├── ApiProduct.java │ │ │ └── ApiQuote.java │ │ │ ├── config │ │ │ └── GlobalConfig.kt │ │ │ ├── net │ │ │ ├── MarketRetrofitBuilder.kt │ │ │ ├── MarketService.java │ │ │ ├── ServiceWrapper.kt │ │ │ ├── TradeRetrofitBuilder.kt │ │ │ ├── TradeService.java │ │ │ └── base │ │ │ │ └── SimpleTObserver.kt │ │ │ ├── ui │ │ │ ├── activity │ │ │ │ ├── ChartActivity.kt │ │ │ │ └── SymbolListActivity.kt │ │ │ └── fragment │ │ │ │ ├── ChartContainerFragment.kt │ │ │ │ └── ChartFragment.kt │ │ │ └── vm │ │ │ ├── BaseViewModel.kt │ │ │ └── ChartViewModel.kt │ └── res │ │ ├── layout │ │ ├── zm_activity_chart.xml │ │ ├── zm_activity_symbol_list.xml │ │ ├── zm_fragment_chart.xml │ │ ├── zm_fragment_chart_container.xml │ │ └── zm_item_activity_symbol_list.xml │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── matt │ └── sample_zm │ └── ExampleUnitTest.kt ├── screenshots ├── kview_竖屏_高亮线.png └── kview_竖屏_默认.png └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | ## 系统默认生成 2 | *.iml 3 | .gradle 4 | /local.properties 5 | /.idea/* 6 | .DS_Store 7 | /build 8 | /captures 9 | .externalNativeBuild 10 | 11 | 12 | #### https://github.com/github/gitignore/blob/master/Android.gitignore 13 | # Built application files 14 | *.apk 15 | *.ap_ 16 | *.aab 17 | 18 | # Files for the ART/Dalvik VM 19 | *.dex 20 | 21 | # Java class files 22 | *.class 23 | 24 | # Generated files 25 | bin/ 26 | gen/ 27 | out/ 28 | release/ 29 | 30 | # Gradle files 31 | .gradle/ 32 | build/ 33 | 34 | # Local configuration file (sdk path, etc) 35 | local.properties 36 | 37 | # Proguard folder generated by Eclipse 38 | proguard/ 39 | 40 | # Log Files 41 | *.log 42 | 43 | # Android Studio Navigation editor temp files 44 | .navigation/ 45 | 46 | # Android Studio captures folder 47 | captures/ 48 | 49 | # IntelliJ 50 | .idea/ 51 | 52 | # Keystore files 53 | # Uncomment the following lines if you do not want to check your keystore files in. 54 | #*.jks 55 | #*.keystore 56 | 57 | # Google Services (e.g. APIs or Firebase) 58 | # google-services.json 59 | 60 | # Freeline 61 | freeline.py 62 | freeline/ 63 | freeline_project_description.json 64 | 65 | # fastlane 66 | fastlane/report.xml 67 | fastlane/Preview.html 68 | fastlane/screenshots 69 | fastlane/test_output 70 | fastlane/readme.md 71 | 72 | # Version control 73 | vcs.xml 74 | 75 | # lint 76 | lint/intermediates/ 77 | lint/generated/ 78 | lint/outputs/ 79 | lint/tmp/ 80 | # lint/reports/ 81 | 82 | # note 83 | # .ignore不起作用解决方案 84 | # git rm -r --cached . 85 | # git add . 86 | # git commit -m "update .ignore" 87 | 88 | #### 个性化设置 89 | ## app 90 | app/proguardMapping.txt 91 | app/release 92 | app/bugly 93 | app/debug/* 94 | ## 正式签名不能上传,保证应用安全 95 | app/sign/etrade_key.jks 96 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## MPAndroidChartWrapper 2 | [MPAndroidChartWrapper](https://github.com/scsfwgy/MPAndroidChartWrapper),高度封装[MPAndroidChart](https://github.com/PhilJay/MPAndroidChart),提供开箱即用的MPAndroidChart。两大原则:1.不修改MPAndroidChart源码,只继承封装原有功能实现扩展。2. 开箱即用。 3 | 4 | 5 | ##DEMO 6 | 1. 币安 注意:目前该Demo必须**科学上网**才能看 7 | 8 | ## 已完成 9 | 1. 主图、副图整体功能 10 | 2. 主图:分时图、蜡烛图、ma、boll 11 | 3. 副图:macd、rsi、kdj 12 | 4. 主副图指标长按和非长按对应的处理 13 | 4. 主副图联动、点击切换主图、副图指标 14 | 15 | ## TODO 16 | 1. 校验指标算法是否正确;指标算法支持单独算指定个数,而非全部遍历。 17 | 2. 量图相关绘制【ok】 18 | 3. 数据加载更多、ws接入【todo:加载更多,ws接入ok】 19 | 4. 接入火币或者币安开源数据源【币安 Demo ok】 20 | 5. demo样式按照火币或者币安样式绘制,保证一致性。 21 | 22 | ## 效果图 23 | ![kview_竖屏_高亮线.png](http://ww1.sinaimg.cn/mw690/eaf851b6gy1ggocx3tjfmj20jo0yitdc.jpg) 24 | ![kview_竖屏_默认.png](http://ww1.sinaimg.cn/mw690/eaf851b6gy1ggocx3x24mj20jm0yi0wi.jpg) 25 | ![kview_主图_副图_量图.png](http://ww1.sinaimg.cn/large/eaf851b6gy1gh3lqksav1j20gq0yk78k.jpg) 26 | ![bin_竖屏_分时.png](http://ww1.sinaimg.cn/mw690/eaf851b6gy1ghstwcbkpnj20gq0yc0vw.jpg) 27 | ![bin_竖屏_蜡烛图.png](http://ww1.sinaimg.cn/mw690/eaf851b6gy1ghstwckwu7j20fu0wswi3.jpg) 28 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | apply from: rootProject.file('lib_common.gradle') 3 | 4 | android { 5 | defaultConfig { 6 | applicationId "com.matt.demo" 7 | versionCode 1 8 | versionName "1.0" 9 | } 10 | } 11 | 12 | dependencies { 13 | api project(path: ':sample_binance') 14 | api project(path: ':sample_zm') 15 | } 16 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/matt/demo/ExampleInstrumentedTest.kt: -------------------------------------------------------------------------------- 1 | package com.matt.demo 2 | 3 | import androidx.test.ext.junit.runners.AndroidJUnit4 4 | import androidx.test.platform.app.InstrumentationRegistry 5 | import org.junit.Assert.assertEquals 6 | import org.junit.Test 7 | import org.junit.runner.RunWith 8 | 9 | /** 10 | * Instrumented test, which will execute on an Android device. 11 | * 12 | * See [testing documentation](http://d.android.com/tools/testing). 13 | */ 14 | @RunWith(AndroidJUnit4::class) 15 | class ExampleInstrumentedTest { 16 | @Test 17 | fun useAppContext() { 18 | // Context of the app under test. 19 | val appContext = InstrumentationRegistry.getInstrumentation().targetContext 20 | assertEquals("com.matt.demo", appContext.packageName) 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/matt/demo/App.kt: -------------------------------------------------------------------------------- 1 | package com.matt.demo 2 | 3 | import android.app.Application 4 | import com.blankj.utilcode.util.Utils 5 | import com.example.sample_binance.SampleBinanceInit 6 | 7 | /** 8 | * ============================================================ 9 | * 作 者 : matt 10 | * 更新时间 :2020/03/07 10:34 11 | * 描 述 : 12 | * ============================================================ 13 | */ 14 | class App : Application() { 15 | override fun onCreate() { 16 | super.onCreate() 17 | Utils.init(this) 18 | SampleBinanceInit.init(this) 19 | } 20 | } -------------------------------------------------------------------------------- /app/src/main/java/com/matt/demo/MainActivity.kt: -------------------------------------------------------------------------------- 1 | package com.matt.demo 2 | 3 | import android.os.Bundle 4 | import android.view.View 5 | import com.example.sample_binance.ui.activity.BinListActivity 6 | import com.matt.libwrapper.ui.base.HandleExceptionActivity 7 | import com.matt.libwrapper.ui.base.template.Template 8 | import com.matt.libwrapper.ui.base.template.TemplateBarActivity 9 | import com.matt.sample_zm.ui.activity.SymbolListActivity 10 | import kotlinx.android.synthetic.main.activity_main.* 11 | 12 | class MainActivity : TemplateBarActivity() { 13 | 14 | private fun initListener() { 15 | am_b_kview.setOnClickListener { 16 | SymbolListActivity.goIntent(mContext) 17 | } 18 | am_b_bin.setOnClickListener { 19 | BinListActivity.goIntent(mContext) 20 | } 21 | } 22 | 23 | override fun templateType(): Int { 24 | return Template.TEMPLATETYPE_DEFVIEW 25 | } 26 | 27 | override fun addChildrenView(): Any { 28 | return R.layout.activity_main 29 | } 30 | 31 | override fun renderTitle(): Any { 32 | return "MPAndroidChartWrapper Demo" 33 | } 34 | 35 | override fun onCatchCreate(savedInstanceState: Bundle?) { 36 | super.onCatchCreate(savedInstanceState) 37 | initView() 38 | initListener() 39 | 40 | } 41 | 42 | private fun initView() { 43 | getLeftImageView().visibility = View.INVISIBLE 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 8 | 9 | 15 | 18 | 21 | 22 | 23 | 24 | 30 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 |