An An 2 months ago
parent
commit
67eb340f1c

+ 35 - 24
charts/src/main/assets/AAChartView.js

@@ -39,37 +39,48 @@ function configurePlotOptions(aaOptions) {
         var animationEasingType = animation.easing;
         animation.easing = configureTheChartAnimationEasingType(animationEasingType);
     }
-    // 添加鼠标事件
-    if (aaOptions.touchEventEnabled == true && aaPlotOptions.series) {
+
+    if (aaOptions.clickEventEnabled == true) {
+        configureChartClickEvent(aaPlotOptions);
+    }
+
+    if (aaOptions.touchEventEnabled == true) {
         configureChartTouchEvent(aaPlotOptions);
     }
 }
 
-function configureChartTouchEvent(aaPlotOptions) {
-    var mouseOverFunc = function(){
-        var message = {
-            name: this.series.name,
-            y :this.y,
-            x: this.x,
-            category: this.category,
-            offset: {plotX:this.plotX,plotY:this.plotY},
-            index: this.index,
-        };
+function configureEventMessageBody(selectedPoint) {
+    return {
+        name: selectedPoint.series.name,
+        y: selectedPoint.y,
+        x: selectedPoint.x,
+        category: selectedPoint.category,
+        offset: {
+            plotX: selectedPoint.plotX,
+            plotY: selectedPoint.plotY
+        },
+        index: selectedPoint.index,
+    };
+}
 
+function configureChartClickEvent(aaPlotOptions) {
+    var clickEventFunc = function() {
+        var message = configureEventMessageBody(this);
         var messageStr = JSON.stringify(message);
-        window.androidObject.androidMethod(messageStr);
+        window.androidObject.clickEventAndroidMethod(messageStr);
     };
 
-    if (aaPlotOptions.series.point) {// set property directly for series point
-        aaPlotOptions.series.point.events.mouseOver = mouseOverFunc;
-    } else {// create a new series point object instance
-        var seriesPoint = {
-            events:{
-                mouseOver: mouseOverFunc,
-            }
-        };
-        aaPlotOptions.series.point = seriesPoint;
-    }
+    aaPlotOptions.series.point.events.click = clickEventFunc;
+}
+
+function configureChartTouchEvent(aaPlotOptions) {
+    var mouseOverEventFunc = function() {
+        var message = configureEventMessageBody(this);
+        var messageStr = JSON.stringify(message);
+        window.androidObject.moveOverEventAndroidMethod(messageStr);
+    };
+
+    aaPlotOptions.series.point.events.mouseOver = mouseOverEventFunc;
 }
 
 function onlyRefreshTheChartDataWithSeries(receivedSeries, animation) {
@@ -146,4 +157,4 @@ function removeElementFromChartSeriesWithElementIndex(elementIndex) {
 
 function evaluateTheJavaScriptStringFunction(jsStringFunction) {
     eval(jsStringFunction);
-}
+}

+ 6 - 0
charts/src/main/java/com/github/aachartmodel/aainfographics/aachartcreator/AAChartModel.kt

@@ -246,6 +246,7 @@ class AAChartModel(
     var backgroundColor: Any? = "#ffffff",
     var borderRadius: Number? = 0f,
     var series: Array<Any>? = null,
+    var clickEventEnabled: Boolean? = null,
     var touchEventEnabled: Boolean? = null,
     var scrollablePlotArea: AAScrollablePlotArea? = null
 ) {
@@ -460,6 +461,11 @@ class AAChartModel(
         return this
     }
 
+    fun clickEventEnabled(prop: Boolean): AAChartModel {
+        clickEventEnabled = prop
+        return this
+    }
+
     fun touchEventEnabled(prop: Boolean?): AAChartModel {
         touchEventEnabled = prop
         return this

+ 111 - 25
charts/src/main/java/com/github/aachartmodel/aainfographics/aachartcreator/AAChartView.kt

@@ -40,34 +40,58 @@ import android.app.AlertDialog
 import android.content.Context
 import android.os.Build
 import android.util.AttributeSet
-import android.webkit.*
+import android.webkit.JavascriptInterface
+import android.webkit.JsResult
+import android.webkit.WebChromeClient
+import android.webkit.WebView
+import android.webkit.WebViewClient
+import com.github.aachartmodel.aainfographics.aaoptionsmodel.AAPlotOptions
+import com.github.aachartmodel.aainfographics.aaoptionsmodel.AAPoint
+import com.github.aachartmodel.aainfographics.aaoptionsmodel.AAPointEvents
+import com.github.aachartmodel.aainfographics.aaoptionsmodel.AASeries
+import com.github.aachartmodel.aainfographics.aatools.AAColor
 import com.github.aachartmodel.aainfographics.aatools.AAJSStringPurer
 import com.github.aachartmodel.aainfographics.aatools.aa_toJSArray
 import com.google.gson.Gson
 import com.google.gson.internal.LinkedTreeMap
-import java.util.*
-import kotlin.collections.HashMap
+import java.util.Locale
 
 
-class AAMoveOverEventMessageModel {
+open class AAEventMessageModel {
     var name: String? = null
     var x: Double? = null
     var y: Double? = null
     var category: String? = null
-    var offset: LinkedTreeMap<String, Any>? = null
+    var offset: LinkedTreeMap<*, *>? = null
     var index: Int? = null
 }
 
+class AAClickEventMessageModel : AAEventMessageModel()
+
+class AAMoveOverEventMessageModel : AAEventMessageModel()
 
 class AAChartView : WebView {
+
     interface AAChartViewCallBack {
-        fun chartViewDidFinishLoad(aaChartView: AAChartView)
+        fun chartViewDidFinishLoad(
+            aaChartView: AAChartView
+        ) {
+        }
+
+        fun chartViewClickEventMessage(
+            aaChartView: AAChartView,
+            clickEventMessage: AAClickEventMessageModel
+        ) {
+        }
+
         fun chartViewMoveOverEventMessage(
             aaChartView: AAChartView,
-            messageModel: AAMoveOverEventMessageModel
-        )
+            moveOverEventMessage: AAMoveOverEventMessageModel
+        ) {
+        }
     }
 
+
     var contentWidth: Number? = null
         set(value) {
             field = value
@@ -140,12 +164,37 @@ class AAChartView : WebView {
 
     //js调用安卓,必须加@JavascriptInterface注释的方法才可以被js调用
     @JavascriptInterface
-    fun androidMethod(message: String?): String {
-        var messageBody = HashMap<String, Any>()
-        messageBody = Gson().fromJson(message, messageBody.javaClass)
-        val eventMessageModel: AAMoveOverEventMessageModel = getEventMessageModel(messageBody)
-        callBack?.chartViewMoveOverEventMessage(this, eventMessageModel)
-        //Log.i("androidMethod","++++++++++++++++显示总共调用了几次");
+    fun clickEventAndroidMethod(message: String?): String {
+        val gson = Gson()
+        var messageBody: Map<String, Any> = java.util.HashMap()
+        messageBody = gson.fromJson(message, messageBody.javaClass)
+        // 调用泛型方法并传递 MyEventMessage.class 作为 eventType 参数
+        val clickEventMessageModel: AAClickEventMessageModel = this.getEventMessageModel(
+            messageBody,
+            AAClickEventMessageModel::class.java
+        )
+        if (callBack != null) {
+            callBack!!.chartViewClickEventMessage(this, clickEventMessageModel)
+        }
+        //       Log.i("androidMethod","++++++++++++++++显示总共调用了几次");
+        return ""
+    }
+
+    //js调用安卓,必须加@JavascriptInterface注释的方法才可以被js调用
+    @JavascriptInterface
+    fun moveOverEventAndroidMethod(message: String?): String {
+        val gson = Gson()
+        var messageBody: Map<String, Any> = java.util.HashMap()
+        messageBody = gson.fromJson(message, messageBody.javaClass)
+        // 调用泛型方法并传递 MyEventMessage.class 作为 eventType 参数
+        val moveOverEventMessageModel = this.getEventMessageModel(
+            messageBody,
+            AAMoveOverEventMessageModel::class.java
+        )
+        if (callBack != null) {
+            callBack!!.chartViewMoveOverEventMessage(this, moveOverEventMessageModel)
+        }
+        //       Log.i("androidMethod","++++++++++++++++显示总共调用了几次");
         return ""
     }
 
@@ -323,11 +372,37 @@ class AAChartView : WebView {
         }
     }
 
-    private fun configureChartOptionsAndDrawChart(chartOptions: AAOptions) {
+    private fun configurePlotOptionsSeriesPointEvents(aaOptions: AAOptions) {
+        if (aaOptions.plotOptions == null) {
+            aaOptions.plotOptions = AAPlotOptions().series(AASeries().point(AAPoint().events(AAPointEvents())))
+        } else if (aaOptions.plotOptions!!.series == null) {
+            aaOptions.plotOptions!!.series = AASeries().point(AAPoint().events(AAPointEvents()))
+        } else if (aaOptions.plotOptions!!.series!!.point == null) {
+            aaOptions.plotOptions!!.series!!.point = AAPoint().events(AAPointEvents())
+        } else if (aaOptions.plotOptions!!.series!!.point!!.events == null) {
+            aaOptions.plotOptions!!.series!!.point!!.events = AAPointEvents()
+        }
+    }
+
+    private fun configureChartOptionsAndDrawChart(aaOptions: AAOptions) {
         if (isClearBackgroundColor!!) {
-            chartOptions.chart!!.backgroundColor("rgba(0,0,0,0)")
+            aaOptions.chart!!.backgroundColor(AAColor.Clear)
         }
-        val aaOptionsJsonStr = Gson().toJson(chartOptions)
+
+
+        // 提取布尔表达式以提高可读性,并防止 NullPointerException
+        val isClickEventEnabled =
+            (aaOptions.clickEventEnabled != null && aaOptions.clickEventEnabled == true)
+        val isTouchEventEnabled =
+            (aaOptions.touchEventEnabled != null && aaOptions.touchEventEnabled == true)
+
+        val isAnyEventEnabled = isClickEventEnabled || isTouchEventEnabled
+
+        if (isAnyEventEnabled) {
+            configurePlotOptionsSeriesPointEvents(aaOptions)
+        }
+
+        val aaOptionsJsonStr = Gson().toJson(aaOptions)
         optionsJson = aaOptionsJsonStr
         val javaScriptStr = "loadTheHighChartView('$aaOptionsJsonStr','$contentWidth','$contentHeight')"
         safeEvaluateJavaScriptString(javaScriptStr)
@@ -356,15 +431,26 @@ class AAChartView : WebView {
         }
     }
 
-    private fun getEventMessageModel(messageBody: Map<String, Any>): AAMoveOverEventMessageModel {
-        val eventMessageModel = AAMoveOverEventMessageModel()
-        eventMessageModel.name = messageBody["name"].toString()
-        eventMessageModel.x = messageBody["x"] as Double?
-        eventMessageModel.y = messageBody["y"] as Double?
-        eventMessageModel.category = messageBody["category"].toString()
-        eventMessageModel.offset = messageBody["offset"] as LinkedTreeMap<String, Any>?
+    private fun <T : AAEventMessageModel?> getEventMessageModel(
+        messageBody: Map<String, Any>,
+        eventType: Class<T>
+    ): T {
+        val eventMessageModel: T
+        try {
+            // 通过反射实例化泛型类型
+            eventMessageModel = eventType.getDeclaredConstructor().newInstance()
+        } catch (e: Exception) {
+            throw RuntimeException("Failed to create instance of $eventType", e)
+        }
+
+        eventMessageModel!!.name = messageBody["name"].toString()
+        eventMessageModel!!.x = messageBody["x"] as Double?
+        eventMessageModel!!.y = messageBody["y"] as Double?
+        eventMessageModel!!.category = messageBody["category"].toString()
+        eventMessageModel!!.offset = messageBody["offset"] as LinkedTreeMap<*, *>?
         val index = messageBody["index"] as Double?
-        eventMessageModel.index = index?.toInt()
+        eventMessageModel!!.index = index!!.toInt()
+
         return eventMessageModel
     }
 

+ 30 - 2
charts/src/main/java/com/github/aachartmodel/aainfographics/aachartcreator/AAOptions.kt

@@ -27,7 +27,28 @@
  */
 package com.github.aachartmodel.aainfographics.aachartcreator
 
-import com.github.aachartmodel.aainfographics.aaoptionsmodel.*
+import com.github.aachartmodel.aainfographics.aaoptionsmodel.AAAnimation
+import com.github.aachartmodel.aainfographics.aaoptionsmodel.AABar
+import com.github.aachartmodel.aainfographics.aaoptionsmodel.AAChart
+import com.github.aachartmodel.aainfographics.aaoptionsmodel.AAColumn
+import com.github.aachartmodel.aainfographics.aaoptionsmodel.AAColumnrange
+import com.github.aachartmodel.aainfographics.aaoptionsmodel.AACredits
+import com.github.aachartmodel.aainfographics.aaoptionsmodel.AADataLabels
+import com.github.aachartmodel.aainfographics.aaoptionsmodel.AAItemStyle
+import com.github.aachartmodel.aainfographics.aaoptionsmodel.AALabels
+import com.github.aachartmodel.aainfographics.aaoptionsmodel.AALang
+import com.github.aachartmodel.aainfographics.aaoptionsmodel.AALegend
+import com.github.aachartmodel.aainfographics.aaoptionsmodel.AAMarker
+import com.github.aachartmodel.aainfographics.aaoptionsmodel.AAPane
+import com.github.aachartmodel.aainfographics.aaoptionsmodel.AAPie
+import com.github.aachartmodel.aainfographics.aaoptionsmodel.AAPlotOptions
+import com.github.aachartmodel.aainfographics.aaoptionsmodel.AASeries
+import com.github.aachartmodel.aainfographics.aaoptionsmodel.AAStyle
+import com.github.aachartmodel.aainfographics.aaoptionsmodel.AASubtitle
+import com.github.aachartmodel.aainfographics.aaoptionsmodel.AATitle
+import com.github.aachartmodel.aainfographics.aaoptionsmodel.AATooltip
+import com.github.aachartmodel.aainfographics.aaoptionsmodel.AAXAxis
+import com.github.aachartmodel.aainfographics.aaoptionsmodel.AAYAxis
 import com.github.aachartmodel.aainfographics.aatools.AAColor
 
 class AAOptions {
@@ -46,6 +67,7 @@ class AAOptions {
     var colors: Array<Any>? = null
     var credits: AACredits? = null
     var defaultOptions: AALang? = null
+    var clickEventEnabled: Boolean? = null
     var touchEventEnabled: Boolean? = null
 
     fun chart(prop: AAChart): AAOptions {
@@ -123,6 +145,11 @@ class AAOptions {
         return this
     }
 
+    fun clickEventEnabled(prop: Boolean?): AAOptions {
+        clickEventEnabled = prop
+        return this
+    }
+
     fun touchEventEnabled(prop: Boolean?): AAOptions {
         touchEventEnabled = prop
         return this
@@ -195,7 +222,8 @@ object AAOptionsConstructor {
             .legend(aaLegend)
             .series(aaChartModel.series)
             .colors(aaChartModel.colorsTheme) //设置颜色主题
-            .touchEventEnabled(aaChartModel.touchEventEnabled) //是否支持点击事件
+            .clickEventEnabled(aaChartModel.clickEventEnabled) //是否支持点击事件
+            .touchEventEnabled(aaChartModel.touchEventEnabled) //是否支持触摸事件
 
         configureAxisContentAndStyle(aaOptions, aaChartModel)
 

+ 34 - 4
sample/src/main/java/com/github/aachartmodel/aainfographics/demo/additionalcontent/DoubleChartsLinkedWorkActivity.kt

@@ -5,7 +5,6 @@ import android.os.Handler
 import android.os.Looper
 import androidx.appcompat.app.AppCompatActivity
 import com.github.aachartmodel.aainfographics.aachartcreator.*
-import com.github.aachartmodel.aainfographics.aachartcreator.AAOptions
 import com.github.aachartmodel.aainfographics.aaoptionsmodel.AADataLabels
 import com.github.aachartmodel.aainfographics.aaoptionsmodel.AALabels
 import com.github.aachartmodel.aainfographics.aaoptionsmodel.AAStyle
@@ -94,6 +93,7 @@ class DoubleChartsLinkedWorkActivity : AppCompatActivity(),
             .borderRadius(4f)
             .legendEnabled(false)
             .colorsTheme(gradientColorsArr)
+            .clickEventEnabled(true)
             .touchEventEnabled(true)
             .yAxisTitle("Random Number")
             .yAxisMax(210)
@@ -187,10 +187,40 @@ class DoubleChartsLinkedWorkActivity : AppCompatActivity(),
 
     override fun chartViewMoveOverEventMessage(
         aaChartView: AAChartView,
-        messageModel: AAMoveOverEventMessageModel
+        moveOverEventMessage: AAMoveOverEventMessageModel
     ) {
-        selectedGradientColor = gradientColorsArr[messageModel.index!!]
-        selectedColorName = gradientColorNamesArr[messageModel.index!!]
+
+
+        //打印触摸(手指掠过)事件信息
+        println("👋👋👋获取触摸(手指掠过)事件 moveOverEventMessage  $moveOverEventMessage")
+        selectedGradientColor = gradientColorsArr[moveOverEventMessage.index!!]
+        selectedColorName = gradientColorNamesArr[moveOverEventMessage.index!!]
+
+        val mainHandler = Handler(Looper.getMainLooper())
+        mainHandler.post {
+            //已在主线程中,可以更新UI
+            val aaSeriesElementsArr: Array<AASeriesElement> = arrayOf(
+                AASeriesElement()
+                    .data(configureSeriesDataArray() as Array<Any>)
+            )
+            aaChartView2?.aa_updateXAxisCategories(configureXAxisCategoresDataArray(), false)
+
+            aaChartView2?.aa_onlyRefreshTheChartDataWithChartOptionsSeriesArray(
+                aaSeriesElementsArr,
+                false
+            )
+        }
+    }
+
+    override fun chartViewClickEventMessage(
+        aaChartView: AAChartView,
+        clickEventMessage: AAClickEventMessageModel
+    ) {
+        //打印点击事件信息
+        println("🖱🖱🖱获取点击事件 clickMessageModel = $clickEventMessage")
+
+        selectedGradientColor = gradientColorsArr[clickEventMessage.index!!]
+        selectedColorName = gradientColorNamesArr[clickEventMessage.index!!]
 
         val mainHandler = Handler(Looper.getMainLooper())
         mainHandler.post {