1.新建color.xml文件,在res/values路径下新建color.xml文件
文件内容:
<?xml version="1.0" encoding="utf-8"?> <resources> <!--底部渐变色--> <color name="color1">#ffcc0000</color> <!--顶部渐变色--> <color name="color2">#ff00ddff</color> </resources>
2. 在java代码中设置颜色
//1. 找到定义的2个颜色 //底部渐变色 int bottomColor = ContextCompat.getColor(this, R.color.color1); //顶部渐变色 int topColor = ContextCompat.getColor(this, R.color.color2); //2. 新建List存储渐变色 List<GradientColor> gradientColors = new ArrayList<>(); gradientColors.add(new GradientColor(bottomColor, topColor)); //3. 添加颜色List到BarDataSet //set类型是BarDataSet set.setGradientColors(gradientColors);
4.继承HorizontalBarChart写一个新类,命名为MyHorizontalBarChart
import android.content.Context; import android.util.AttributeSet; import com.github.mikephil.charting.charts.HorizontalBarChart; public class MyHorizontalBarChart extends HorizontalBarChart { public MyHorizontalBarChart(Context context) { super(context); } public MyHorizontalBarChart(Context context, AttributeSet attrs) { super(context, attrs); } public MyHorizontalBarChart(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override protected void init() { super.init(); this.mRenderer = new MyHorizontalBarChartRenderer(this, this.mAnimator, this.mViewPortHandler); } }
5.继承HorizontalBarChartRenderer写一个新的渲染器,调整为水平颜色渐变
import android.graphics.Canvas; import android.graphics.LinearGradient; import android.graphics.RectF; import com.github.mikephil.charting.animation.ChartAnimator; import com.github.mikephil.charting.buffer.BarBuffer; import com.github.mikephil.charting.data.BarData; import com.github.mikephil.charting.data.BarEntry; import com.github.mikephil.charting.interfaces.dataprovider.BarDataProvider; import com.github.mikephil.charting.interfaces.datasets.IBarDataSet; import com.github.mikephil.charting.model.GradientColor; import com.github.mikephil.charting.renderer.HorizontalBarChartRenderer; import com.github.mikephil.charting.utils.Transformer; import com.github.mikephil.charting.utils.Utils; import com.github.mikephil.charting.utils.ViewPortHandler; public class MyHorizontalBarChartRenderer extends HorizontalBarChartRenderer { public MyHorizontalBarChartRenderer(BarDataProvider chart, ChartAnimator animator, ViewPortHandler viewPortHandler) { super(chart, animator, viewPortHandler); } private RectF mBarShadowRectBuffer = new RectF(); @Override protected void drawDataSet(Canvas c, IBarDataSet dataSet, int index) { super.drawDataSet(c, dataSet, index); Transformer trans = mChart.getTransformer(dataSet.getAxisDependency()); mBarBorderPaint.setColor(dataSet.getBarBorderColor()); mBarBorderPaint.setStrokeWidth(Utils.convertDpToPixel(dataSet.getBarBorderWidth())); final boolean drawBorder = dataSet.getBarBorderWidth() > 0.f; float phaseX = mAnimator.getPhaseX(); float phaseY = mAnimator.getPhaseY(); // draw the bar shadow before the values if (mChart.isDrawBarShadowEnabled()) { mShadowPaint.setColor(dataSet.getBarShadowColor()); BarData barData = mChart.getBarData(); final float barWidth = barData.getBarWidth(); final float barWidthHalf = barWidth / 2.0f; float x; for (int i = 0, count = Math.min((int)(Math.ceil((float)(dataSet.getEntryCount()) * phaseX)), dataSet.getEntryCount()); i < count; i++) { BarEntry e = dataSet.getEntryForIndex(i); x = e.getX(); mBarShadowRectBuffer.left = x - barWidthHalf; mBarShadowRectBuffer.right = x + barWidthHalf; trans.rectValueToPixel(mBarShadowRectBuffer); if (!mViewPortHandler.isInBoundsLeft(mBarShadowRectBuffer.right)) continue; if (!mViewPortHandler.isInBoundsRight(mBarShadowRectBuffer.left)) break; mBarShadowRectBuffer.top = mViewPortHandler.contentTop(); mBarShadowRectBuffer.bottom = mViewPortHandler.contentBottom(); c.drawRect(mBarShadowRectBuffer, mShadowPaint); } } // initialize the buffer BarBuffer buffer = mBarBuffers[index]; buffer.setPhases(phaseX, phaseY); buffer.setDataSet(index); buffer.setInverted(mChart.isInverted(dataSet.getAxisDependency())); buffer.setBarWidth(mChart.getBarData().getBarWidth()); buffer.feed(dataSet); trans.pointValuesToPixel(buffer.buffer); final boolean isSingleColor = dataSet.getColors().size() == 1; if (isSingleColor) { mRenderPaint.setColor(dataSet.getColor()); } for (int j = 0; j < buffer.size(); j += 4) { if (!mViewPortHandler.isInBoundsLeft(buffer.buffer[j + 2])) continue; if (!mViewPortHandler.isInBoundsRight(buffer.buffer[j])) break; if (!isSingleColor) { // Set the color for the currently drawn value. If the index // is out of bounds, reuse colors. mRenderPaint.setColor(dataSet.getColor(j / 4)); } if (dataSet.getGradientColor() != null) { GradientColor gradientColor = dataSet.getGradientColor(); mRenderPaint.setShader( new LinearGradient( buffer.buffer[j], buffer.buffer[j + 3], buffer.buffer[j], buffer.buffer[j + 1], gradientColor.getStartColor(), gradientColor.getEndColor(), android.graphics.Shader.TileMode.MIRROR)); } if (dataSet.getGradientColors() != null) { mRenderPaint.setShader( new LinearGradient( buffer.buffer[j], buffer.buffer[j+3], buffer.buffer[j+2], buffer.buffer[j+1], dataSet.getGradientColor(j / 4).getEndColor(), dataSet.getGradientColor(j / 4).getStartColor(), android.graphics.Shader.TileMode.MIRROR)); } c.drawRect(buffer.buffer[j], buffer.buffer[j + 1], buffer.buffer[j + 2], buffer.buffer[j + 3], mRenderPaint); if (drawBorder) { c.drawRect(buffer.buffer[j], buffer.buffer[j + 1], buffer.buffer[j + 2], buffer.buffer[j + 3], mBarBorderPaint); } } } }
6. 在layout文件中添加自定义的MyHorizontalBarChart
<com.mpchart.MyHorizontalBarChart android:id="@+id/bar_chart1" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginLeft="20dp" android:layout_gravity="left|center_vertical"> </com.mdctbcinput.main.MyHorizontalBarChart >
其他代码按照官方样例正常写既可