Horizo​​ntalBarChart moveViewToX不起作用

时间:2019-01-19 18:31:14

标签: mpandroidchart

摘要 使用BarChart时,一切都按预期工作,但moveViewToX在Horizo​​ntalBarChart上不工作。我已经使用相同的代码进行了测试,只是更改了XML,并且该错误仅影响Horizo​​ntalBarChart

我已经搜索了未解决的问题(最相关的问题是#2546,该问题已关闭,建议的解决方案在我的情况下不起作用),并在StackOverflow上进行了搜索,但是我还没有找到解决方案。

设备:     设备:小米Redmi注意事项4     Android 6.0版     图书馆版本3.1.0-alpha

这里是相关的代码,用Kotlin编写。 这是xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.github.mikephil.charting.charts.HorizontalBarChart
        android:id="@+id/priceAlertsChart"
        android:layout_width="match_parent"
        android:layout_height="300dp"/>
</LinearLayout>

和kt文件:

    override fun onCreate(savedInstanceState: Bundle?) {
        val priceAlerts = mutableListOf<PriceChangeInfo>()
        for(i in 0..20) {
            priceAlerts.add(i,PriceChangeInfo(i.toString()
            ,Random.nextDouble(-2.5,2.5)))
        }
        showPercentChangeDialog(priceAlerts.toTypedArray(), Date().time)
    }

    @SuppressLint("InflateParams")
    private fun showPercentChangeDialog(priceChangeInfo:Array<Parcelable>?, lastUpdate:Long)
    {
        val items = priceChangeInfo?.map {
            it as PriceChangeInfo
        }?.reversed() ?: return

        val v = layoutInflater.inflate(R.layout.price_alerts_dialogos,null)
       // v.lastUpdateTextView.text=getString(R.string.changes_since,timeLapse(lastUpdate))
        v.priceAlertsChart.apply {
            xAxis.apply {
                position = XAxis.XAxisPosition.BOTTOM
                setDrawAxisLine(true)
                setDrawGridLines(false)
                granularity = .3f
                labelCount = if(items.size>10)10 else items.size
                valueFormatter = IAxisValueFormatter { value, _ ->
                    items[value.toInt()].symbol
                }
            }

            withMultiple(axisLeft,axisRight){
                setDrawAxisLine(true)
                setDrawGridLines(true)
            }

            legend.isEnabled = false
            setDrawBarShadow(false)
            //setDrawValueAboveBar(true)
            description.isEnabled = false
            setPinchZoom(false)
            setDrawGridBackground(false)

            data = {
                val green = Color.rgb(110, 190, 102)
                val red = Color.rgb(211, 74, 88)


                val entries = mutableListOf<BarEntry>()
                val colors = mutableListOf<Int>()

                items.forEachIndexed { index, info ->
                    colors.add(if(info.change>0) green else red)
                    entries.add(BarEntry(index.toFloat(),info.change.toFloat(),info.symbol))
                }

                val set1 = BarDataSet(entries,"changes").apply {
                    setDrawIcons(false)
                    setDrawValues(false)
                    setColors(colors)
                    valueFormatter = IValueFormatter {
                        _, entry, _, _ ->
                        formatNumber(entry.y.toDouble(),false,false,decimals = 2)+"%"
                    }
                }

                val dataSets = mutableListOf<IBarDataSet>().apply {
                    add(set1)
                }

                BarData(dataSets).apply {
                    setValueTextSize(10f)
                    barWidth = .4f
                }

            }()

            setVisibleXRangeMaximum(10f)
            //this doesn't work on HorizontalBarChart
            moveViewToX(data.entryCount.toFloat())
        }
        AlertDialog.Builder(this).setTitle(R.string.price_alerts).setView(v)
                .setPositiveButton(R.string.ok) { _: DialogInterface, _: Int ->
                    intent?.extras?.clear()
                }.show()


    }

//dependencies
fun<T> withMultiple(vararg args: T, block: T.() -> Unit) {
  args.forEach {
    it.apply (block)
  }
}

data class PriceChangeInfo(var symbol:String, var  change:Double):Parcelable {
    constructor(parcel: Parcel) : this(
            parcel.readString()!!,
            parcel.readDouble()) {}

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(symbol)
        parcel.writeDouble(change)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<PriceChangeInfo> {
        override fun createFromParcel(parcel: Parcel): PriceChangeInfo {
            return PriceChangeInfo(parcel)
        }

        override fun newArray(size: Int): Array<PriceChangeInfo?> {
            return arrayOfNulls(size)
        }
    }
}

我已经在github上打开了一个问题: https://github.com/PhilJay/MPAndroidChart/issues/4397

任何提示| hack |可能的解决方案将受到高度赞赏。预先感谢。

2 个答案:

答案 0 :(得分:1)

我使用以下方法解决了该问题:

moveViewTo(0f,data.entryCount.f,YAxis.AxisDependency.LEFT)

答案 1 :(得分:0)

这对我有用:

chart.resetViewPortOffsets()
            chart.moveViewToX(chart.highlighted[0].x)