概述
这篇文章主要是让那些用到MPAndroidChart 却不知道如何在X轴显示文字的朋友看。这边用的版本是3.0.。android studio 要集成的话 需要在app的bulid.gradle内加入
compile 'com.github.PhilJay:MPAndroidChart:v3.0.0' 这句。如果要从零开始学习MPAndroidChart 可以去看CSDN上刘某人程序员的MPAndroidChart系列里面东邪,里面东西写的满全的。
手上有个项目要用到图表,所以在网上找框架来学习 看了下hellocharts和MPAndroidChart。最终选择了MPAndroidChart。看数十篇详解文章后 并自己手动的去玩了下。觉得还是挺酷的。但是网上看到的文章里面X轴(XAxis)全部都是float类型 数字坐标(时间,天数这些)。而项目内则有些图的X轴需要是文字形式(比如名称)。后来看原作者自己写的DayAxisValueFormatter 实现IAxisValueFormatter 从而在X轴上显示月份加天数。受到启发,对Xaxis.setValueFormatter如:
xAxis.setValueFormatter(new IAxisValueFormatter() {
@Override public String getFormattedValue(float value, AxisBase axis) {
return String.valueOf(data.get((int) value));
}
@Override public int getDecimalDigits() {
return 0;
}
});
东西很简单,但是我在网上找了半天还是没找到。然后请教了一些下写过MPAndroidChart多篇详解的人。他们给我的回答是要改MPAndroidChart源码。所以我想应该还是有很多朋友不了解这个东西。有些懂的朋友可能会提到
LineData lineData = new LineData(xValues, lineDataSets);这个东西好像只在2.0.几之前有。像我用的3.0就没了。
不多说,直接上个线形图的简单代码。
public class LineChartActivity extends BaseActivity implements OnChartGestureListener, OnChartValueSelectedListener, View.OnClickListener { private LineChart mLineChar; private LineDataSet set1; //显示顶点值 private Button btn_show_values; //是否填满 private Button btn_actionToggleFilled; //是否显示圆点 private Button btn_actionToggleCircles; //切换立方 private Button btn_actionToggleCubic; //切换尖角/矩形 private Button btn_actionToggleStepped; //切换横向立方 private Button btn_actionToggleHorizontalCubic; //x轴动画 private Button btn_anim_x; //y轴动画 private Button btn_anim_y; //xy轴动画 private Button btn_anim_xy; //保存到sd卡 private Button btn_save_sd; //切换自动最大最小值 private Button btn_auto_mix_max; private ArrayList<String> data; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.layout_linechar); initView(); } //初始化View private void initView() {
//模拟返回的数据名称
data=new ArrayList<>(); data.add(0,"你"); data.add(1,"瞅"); data.add(2,"啥"); data.add(3,"!"); data.add(4,"瞅"); data.add(5,"你"); data.add(6,"咋"); data.add(7,"地"); //基本控件 btn_show_values = (Button) findViewById(R.id.btn_show_values); btn_show_values.setOnClickListener(this); btn_actionToggleFilled = (Button) findViewById(R.id.btn_actionToggleFilled); btn_actionToggleFilled.setOnClickListener(this); btn_actionToggleCircles = (Button) findViewById(R.id.btn_actionToggleCircles); btn_actionToggleCircles.setOnClickListener(this); btn_actionToggleCubic = (Button) findViewById(R.id.btn_actionToggleCubic); btn_actionToggleCubic.setOnClickListener(this); btn_actionToggleStepped = (Button) findViewById(R.id.btn_actionToggleStepped); btn_actionToggleStepped.setOnClickListener(this); btn_actionToggleHorizontalCubic = (Button) findViewById(R.id.btn_actionToggleHorizontalCubic); btn_actionToggleHorizontalCubic.setOnClickListener(this); btn_anim_x = (Button) findViewById(R.id.btn_anim_x); btn_anim_x.setOnClickListener(this); btn_anim_y = (Button) findViewById(R.id.btn_anim_y); btn_anim_y.setOnClickListener(this); btn_anim_xy = (Button) findViewById(R.id.btn_anim_xy); btn_anim_xy.setOnClickListener(this); btn_save_sd = (Button) findViewById(R.id.btn_save_sd); btn_save_sd.setOnClickListener(this); btn_auto_mix_max = (Button) findViewById(R.id.btn_auto_mix_max); btn_auto_mix_max.setOnClickListener(this); mLineChar = (LineChart) findViewById(R.id.mLineChar); //设置手势滑动事件 mLineChar.setOnChartGestureListener(this); //设置数值选择监听 mLineChar.setOnChartValueSelectedListener(this); //后台绘制 mLineChar.setDrawGridBackground(false); //设置描述文本 mLineChar.getDescription().setEnabled(false); //设置支持触控手势 mLineChar.setTouchEnabled(true); //设置缩放 mLineChar.setDragEnabled(true); //设置推动 mLineChar.setScaleEnabled(true); //如果禁用,扩展可以在x轴和y轴分别完成 mLineChar.setPinchZoom(true); //x轴 LimitLine llXAxis = new LimitLine(10f, "标记"); //设置线宽 llXAxis.setLineWidth(4f); // llXAxis.enableDashedLine(10f, 10f, 0f); //设置 llXAxis.setLabelPosition(LimitLine.LimitLabelPosition.RIGHT_BOTTOM); llXAxis.setTextSize(10f); XAxis xAxis = mLineChar.getXAxis(); xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); xAxis.enableGridDashedLine(10f, 10f, 0f); xAxis.setGranularity(1f); //设置x轴的最大值 xAxis.setAxisMaximum(7f); //设置x轴的最小值 xAxis.setAxisMinimum(0f);
//具体实现就是这行代码 xAxis.setValueFormatter(new IAxisValueFormatter() { @Override public String getFormattedValue(float value, AxisBase axis) { return String.valueOf(data.get((int) value)); } @Override public int getDecimalDigits() { return 0; } }); YAxis leftAxis = mLineChar.getAxisLeft(); //重置所有限制线,以避免重叠线 leftAxis.removeAllLimitLines(); //y轴最大 leftAxis.setAxisMaximum(200f); //y轴最小 leftAxis.setAxisMinimum(0f); leftAxis.enableGridDashedLine(10f, 10f, 0f); leftAxis.setDrawZeroLine(false); // 限制数据(而不是背后的线条勾勒出了上面) leftAxis.setDrawLimitLinesBehindData(true); mLineChar.getAxisRight().setEnabled(false); //这里我模拟一些数据 ArrayList<Entry> values = new ArrayList<Entry>(); values.add(new Entry(1, 50)); values.add(new Entry(2, 66)); values.add(new Entry(3, 120)); values.add(new Entry(4, 30)); values.add(new Entry(5, 100)); values.add(new Entry(6, 120)); values.add(new Entry(7, 30)); //设置数据 setData(values); //默认动画 mLineChar.animateX(2500); //刷新 //mChart.invalidate(); // 得到这个文字 Legend l = mLineChar.getLegend(); // 修改文字 ... l.setForm(Legend.LegendForm.LINE); } //传递数据集 private void setData(ArrayList<Entry> values) { if (mLineChar.getData() != null && mLineChar.getData().getDataSetCount() > 0) { set1 = (LineDataSet) mLineChar.getData().getDataSetByIndex(0); set1.setValues(values); mLineChar.getData().notifyDataChanged(); mLineChar.notifyDataSetChanged(); } else { // 创建一个数据集,并给它一个类型 set1 = new LineDataSet(values, "你瞅啥"); // 在这里设置线 set1.enableDashedLine(10f, 5f, 0f); set1.enableDashedHighlightLine(10f, 5f, 0f); set1.setColor(Color.BLACK); set1.setCircleColor(Color.BLACK); set1.setLineWidth(1f); set1.setCircleRadius(3f); set1.setDrawCircleHole(false); set1.setValueTextSize(9f); set1.setDrawFilled(true); set1.setFormLineWidth(1f); set1.setFormLineDashEffect(new DashPathEffect(new float[]{10f, 5f}, 0f)); set1.setFormSize(15.f); if (Utils.getSDKInt() >= 18) { // 填充背景只支持18以上 //Drawable drawable = ContextCompat.getDrawable(this, R.mipmap.ic_launcher); //set1.setFillDrawable(drawable); set1.setFillColor(Color.YELLOW); } else { set1.setFillColor(Color.BLACK); } ArrayList<ILineDataSet> dataSets = new ArrayList<ILineDataSet>(); //添加数据集 dataSets.add(set1); //创建一个数据集的数据对象 LineData data = new LineData(dataSets); //谁知数据 mLineChar.setData(data); } } @Override public void onChartGestureStart(MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture) { } @Override public void onChartGestureEnd(MotionEvent me, ChartTouchListener.ChartGesture lastPerformedGesture) { // 完成之后停止晃动 if (lastPerformedGesture != ChartTouchListener.ChartGesture.SINGLE_TAP) mLineChar.highlightValues(null); } @Override public void onChartLongPressed(MotionEvent me) { } @Override public void onChartDoubleTapped(MotionEvent me) { } @Override public void onChartSingleTapped(MotionEvent me) { } @Override public void onChartFling(MotionEvent me1, MotionEvent me2, float velocityX, float velocityY) { } @Override public void onChartScale(MotionEvent me, float scaleX, float scaleY) { } @Override public void onChartTranslate(MotionEvent me, float dX, float dY) { } @Override public void onValueSelected(Entry e, Highlight h) { } @Override public void onNothingSelected() { } //点击事件 @Override public void onClick(View v) { switch (v.getId()) { //显示顶点的值开关 case R.id.btn_show_values: //获取到当前值 List<ILineDataSet> sets = mLineChar.getData().getDataSets(); for (ILineDataSet iSet : sets) { LineDataSet set = (LineDataSet) iSet; //切换显示/隐藏 set.setDrawValues(!set.isDrawValuesEnabled()); } //刷新 mLineChar.invalidate(); break; //是否填满 case R.id.btn_actionToggleFilled: List<ILineDataSet> setsFilled = mLineChar.getData().getDataSets(); for (ILineDataSet iSet : setsFilled) { LineDataSet set = (LineDataSet) iSet; if (set.isDrawFilledEnabled()) set.setDrawFilled(false); else set.setDrawFilled(true); } mLineChar.invalidate(); break; //是否显示圆点 case R.id.btn_actionToggleCircles: List<ILineDataSet> setsCircles = mLineChar.getData().getDataSets(); for (ILineDataSet iSet : setsCircles) { LineDataSet set = (LineDataSet) iSet; if (set.isDrawCirclesEnabled()) set.setDrawCircles(false); else set.setDrawCircles(true); } mLineChar.invalidate(); break; //切换立方 case R.id.btn_actionToggleCubic: List<ILineDataSet> setsCubic = mLineChar.getData().getDataSets(); for (ILineDataSet iSet : setsCubic) { LineDataSet set = (LineDataSet) iSet; set.setMode(set.getMode() == LineDataSet.Mode.CUBIC_BEZIER ? LineDataSet.Mode.LINEAR : LineDataSet.Mode.CUBIC_BEZIER); } mLineChar.invalidate(); break; //切换尖角/矩形 case R.id.btn_actionToggleStepped: List<ILineDataSet> setsStepped = mLineChar.getData().getDataSets(); for (ILineDataSet iSet : setsStepped) { LineDataSet set = (LineDataSet) iSet; set.setMode(set.getMode() == LineDataSet.Mode.STEPPED ? LineDataSet.Mode.LINEAR : LineDataSet.Mode.STEPPED); } mLineChar.invalidate(); break; //切换横向立方 case R.id.btn_actionToggleHorizontalCubic: List<ILineDataSet> setsHorizontalCubic = mLineChar.getData().getDataSets(); for (ILineDataSet iSet : setsHorizontalCubic) { LineDataSet set = (LineDataSet) iSet; set.setMode(set.getMode() == LineDataSet.Mode.HORIZONTAL_BEZIER ? LineDataSet.Mode.LINEAR : LineDataSet.Mode.HORIZONTAL_BEZIER); } mLineChar.invalidate(); break; //x轴动画 case R.id.btn_anim_x: mLineChar.animateX(3000); break; //y轴动画 case R.id.btn_anim_y: mLineChar.animateY(3000, Easing.EasingOption.EaseInCubic); break; //xy轴动画 case R.id.btn_anim_xy: mLineChar.animateXY(3000, 3000); break; //保存到sd卡 case R.id.btn_save_sd: if (mLineChar.saveToPath("title" + System.currentTimeMillis(), "")) { Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show(); } else Toast.makeText(this, "保存失败", Toast.LENGTH_SHORT).show(); break; //切换自动最大最小值 case R.id.btn_auto_mix_max: mLineChar.setAutoScaleMinMaxEnabled(!mLineChar.isAutoScaleMinMaxEnabled()); mLineChar.notifyDataSetChanged(); break; } } }layout:<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.github.mikephil.charting.charts.LineChart android:id="@+id/mLineChar" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"/> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/btn_show_values" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="顶点显示值"/> <Button android:id="@+id/btn_actionToggleFilled" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="是否填满"/> <Button android:id="@+id/btn_actionToggleCircles" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="是否显示圆点"/> <Button android:id="@+id/btn_actionToggleCubic" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="切换立方"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/btn_actionToggleStepped" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="切换尖角/矩形"/> <Button android:id="@+id/btn_actionToggleHorizontalCubic" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="切换横向立方"/> <Button android:id="@+id/btn_anim_x" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="X轴动画"/> <Button android:id="@+id/btn_anim_y" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Y轴动画"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <Button android:id="@+id/btn_anim_xy" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="XY轴动画"/> <Button android:id="@+id/btn_save_sd" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="保存到SD卡"/> <Button android:id="@+id/btn_auto_mix_max" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="切换自动最大最小值"/> </LinearLayout> </LinearLayout>
最后
以上就是光亮柚子为你收集整理的关于MPAndroidChart 条形图与线形图的X轴显示文字。的全部内容,希望文章能够帮你解决关于MPAndroidChart 条形图与线形图的X轴显示文字。所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复