由于項目需要,需要改MpandroidChart源碼,下面,先看下效果圖:
效果很簡單,但是由于所選依賴庫沒提供相關方法,所以就需要重寫源碼了.
這條紅色的標志線其實就是那個影廳的均值嘛,這條線看著是不是和圖表中的連接線很像呢,那把連接線稍加改造不就可以了嗎?下面,先看下此依賴庫自帶的連接線的效果圖:
思考一下,我們只需要把值的顏色設置成透明就可以了,然后把連接線改造一下.
首先,先設置圖表的連接線的屬性.
pieData.setDrawValues(true);//餅狀圖上顯示值
dataSet.setValueLinePart1Length(0.3f);//設置連接線的長度
//x,y值在圓外顯示(在圓外才會有連接線)
dataSet.setXValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE);
dataSet.setXValuePosition(PieDataSet.ValuePosition.OUTSIDE_SLICE);
//數據連接線距圖形片內部邊界的距離,為百分數(0~100f)
dataSet.setValueLinePart1OffsetPercentage(0f);
//設置x,y在圓外顯示的值為透明(transparent = 0x00000000)
pieData.setValueTextColor(transparent);復制代碼
好了,現在就該修改源碼了.
首先找到PieChart類,發現圖表的繪制的代碼都在PieChartRenderer類中.為了不影響其他圖表,我們把PieChart和PieChartExtraRenderer復制一份,在復制的代碼中做修改.
在PieChartExtraRenderer中找到drawValues( )這個方法,這個方法就是繪制顯示值和連接線的方法.
可以很快找到,這條折線
我們把第二折線注釋掉,就不會出現和連接線一樣的折線效果了.
然后可以在這個方法的前幾行找到得到的角度,
由于圖表是自動獲取角度的,那我們如果設置方法手動改變角度,不就可以了嗎.所以在上圖中,我把原有代碼注釋掉,改為我們獲取的角度,在這個類中添加方法:
然后我們在設置圖表的時候先設置這個指示線的角度
里邊的值為0~360f,由于我們用的是連接線,連接線都是從所占區域的中間畫的,所以我們需要乘以2.
運行時,會報錯,是因為數組越界了.
再循環中,每次循環xIndex都會加1,由于我們的餅狀圖有兩個數據,所以會循環兩次,就會越界.所以上圖我們強制xIndex為0.
由于循環兩次,所以會畫2個線,我們要第一條線,所以再加個參數time,把time放循環末尾time++,而在畫線的方法外添加判斷
這樣效果就實現了.
提醒一點,觸摸事件會因為為空報錯,需要把觸摸事件禁用.
pieChart.setRotationEnabled(false);//觸摸旋轉
pieChart.setTouchEnabled(false);復制代碼
下邊,給個修改好的餅狀圖的依賴庫,使用PieChartExtra這個餅狀圖,同時要設置標志線角度,調用PieChartExtraRenderer.setRotateLine(rotate)
方法