2017-01-20 1 views
1

У меня возникают проблемы с настройкой диаграммы полной ширины; с осью Y с координатой x и правой стороной графика на полной ширине.MPAndroidChart Полная ширина с ярлыками Y-Axis, расположенными внутри

При настройке графика я делаю следующее:

setDrawGridBackground(false); 
    setDrawBorders(false); 
    getLegend().setEnabled(false); 
    setAutoScaleMinMaxEnabled(true); 
    setTouchEnabled(true); 
    setDragEnabled(true); 
    setScaleEnabled(true); 
    setPinchZoom(true); 
    setDoubleTapToZoomEnabled(false); 
    setBackgroundColor(Color.TRANSPARENT); 
    getAxisRight().setEnabled(false); 
    getDescription().setEnabled(false); 

    final YAxis yAxis = getAxisLeft(); 
    yAxis.setLabelCount(4,true); 
    yAxis.setPosition(YAxis.YAxisLabelPosition.INSIDE_CHART); 
    yAxis.setValueFormatter(new TemperatureValueFormatter()); 
    yAxis.setTextColor(Color.WHITE); 
    yAxis.setGridColor(Color.argb(102,255,255,255)); 
    yAxis.setAxisLineColor(Color.TRANSPARENT); 

    final XAxis xAxis = getXAxis(); 
    xAxis.setDrawLimitLinesBehindData(true); 
    xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); 
    xAxis.setTextColor(Color.WHITE); 
    xAxis.disableGridDashedLine(); 
    xAxis.setDrawGridLines(false); 
    xAxis.setGridColor(Color.argb(204,255,255,255)); 
    xAxis.setAxisLineColor(Color.TRANSPARENT); 
    xAxis.setValueFormatter(new TimestampValueFormatter()); 
    xAxis.setLabelCount(4); 
    xAxis.setAvoidFirstLastClipping(true); 
    xAxis.setSpaceMin(10f); 

После добавления исходных данных или его обновления с динамическими данными, которые я называю следующее:

invalidate(); 
fitScreen(); 

Что происходит, есть еще край между yaxis и левой стороной моего взгляда и правым краем и правой стороной моего представления. Эта маржа должна исчезнуть.

Я пробовал использовать setExtraOffsets, но, к сожалению, кажется, он ограничивает его по краю, который я вижу, поскольку я пробовал устанавливать отрицательные значения, но не повезло.

На любом родителе или на самой карте нет отступов или полей. При изменении позиций ярлыков Y-Axis на внешнем уровне они выглядят так, как будто они используют край обзора и не ограничены тем же пределом, что и при их позиционировании внутри.

Что я здесь делаю неправильно?

EDIT Скриншот

Current outcome

+0

Используйте это - 'chart.setViewPortOffsets (0F, 0F, 0f, 0f),' ' xAxis.setEnabled (true); ' ' yAxis.setEnabled (true); '.Для всех этих команд в вашем методе' Oncreate() '.Если это не работает, тогда покажите свой макет xml –

ответ

1

Использование MPAndroidChart 3.0.1

мне удалось добиться того, что вы хотите, удалив эту строку из кода, который вы указали в вопросе:

xAxis.setSpaceMin(10f); //DON'T NEED THIS!! 

и добавление следующий код:

mChart.setViewPortOffsets(0f, 0f, 0f, 0f); 
    float xMax = mChart.getData().getDataSetByIndex(0).getXMax(); 
    float xMin = 0; 
    xAxis.setAxisMaximum(xMax); 
    xAxis.setAxisMinimum(xMin); 

Перед: (обратите внимание на разницу между левой линией Xaxis и первым х значением при 0 - это нежелательная)

a line chart with a margin between the left xAxis and the first value at 0

После: (обратите внимание, что мы теперь зафиксировали его, чтобы не было предела, а первое значение x заподлицо с левой стороной экрана в соответствии с требованием OP)

a line chart with the margins flush as per OP's spec

Если у вас есть какие-либо требования к пользовательскому интерфейсу, вы не упомянули об этом в вопросе, чтобы этот ответ решил вашу проблему. Вы также можете рассмотреть следующие вопросы:

xAxis.setPosition(XAxis.XAxisPosition.BOTTOM_INSIDE); //changed to match your screenshot 

Полное доказательство концепции:

import android.graphics.Color; 
import android.graphics.drawable.Drawable; 
import android.os.Bundle; 
import android.support.v4.content.ContextCompat; 
import android.view.Menu; 
import android.view.WindowManager; 

import com.github.mikephil.charting.charts.LineChart; 
import com.github.mikephil.charting.components.XAxis; 
import com.github.mikephil.charting.components.YAxis; 
import com.github.mikephil.charting.data.Entry; 
import com.github.mikephil.charting.data.LineData; 
import com.github.mikephil.charting.data.LineDataSet; 
import com.github.mikephil.charting.formatter.DefaultAxisValueFormatter; 
import com.github.mikephil.charting.interfaces.datasets.ILineDataSet; 
import com.github.mikephil.charting.utils.Utils; 

import java.util.ArrayList; 

public class LineChartActivity5 extends Activity { 

    private LineChart mChart; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
       WindowManager.LayoutParams.FLAG_FULLSCREEN); 
     setContentView(R.layout.activity_linechart); 

     mChart = (LineChart) findViewById(R.id.chart1); 

     mChart.setDrawGridBackground(false); 
     mChart.setDrawBorders(false); 
     mChart.getLegend().setEnabled(false); 
     mChart.setAutoScaleMinMaxEnabled(true); 
     mChart.setTouchEnabled(true); 
     mChart.setDragEnabled(true); 
     mChart.setScaleEnabled(true); 
     mChart.setPinchZoom(true); 
     mChart.setDoubleTapToZoomEnabled(false); 
     mChart.setBackgroundColor(Color.parseColor("#FF8000")); 
     mChart.getAxisRight().setEnabled(false); 
     mChart.getDescription().setEnabled(false); 

     final YAxis yAxis = mChart.getAxisLeft(); 
     yAxis.setLabelCount(4,true); 
     yAxis.setPosition(YAxis.YAxisLabelPosition.INSIDE_CHART); 
     yAxis.setValueFormatter(new DefaultAxisValueFormatter(2)); 
     yAxis.setTextColor(Color.WHITE); 
     yAxis.setTextSize(15f); //not in your original but added 
     yAxis.setGridColor(Color.argb(102,255,255,255)); 
     yAxis.setAxisLineColor(Color.TRANSPARENT); 
     yAxis.setAxisMinimum(0); //not in your original but added 

     final XAxis xAxis = mChart.getXAxis(); 
     xAxis.setDrawLimitLinesBehindData(true); 
     xAxis.setPosition(XAxis.XAxisPosition.BOTTOM_INSIDE); //changed to match your spec 
     xAxis.setTextColor(Color.WHITE); 
     xAxis.disableGridDashedLine(); 
     xAxis.setDrawGridLines(false); 
     xAxis.setGridColor(Color.argb(204,255,255,255)); 

     xAxis.setAxisLineColor(Color.TRANSPARENT); 
     xAxis.setValueFormatter(new DefaultAxisValueFormatter(2)); //not in your original but added 
     //xAxis.setValueFormatter(new TimestampValueFormatter()); 
     xAxis.setLabelCount(4); 
     xAxis.setAvoidFirstLastClipping(true); 
     //xAxis.setSpaceMin(10f); //DON'T NEED THIS!! 

     setData(16, 15); 

     mChart.setViewPortOffsets(0f, 0f, 0f, 0f); 
     float xMax = mChart.getData().getDataSetByIndex(0).getXMax(); 
     float xMin = 0; 
     xAxis.setAxisMaximum(xMax); 
     xAxis.setAxisMinimum(xMin); 
    } 

    private void setData(int count, float range) { 

     ArrayList<Entry> values = new ArrayList<Entry>(); 

     for (int i = 0; i < count; i++) { 

      float val = (float) (Math.random() * range) + 3; 
      values.add(new Entry(i, val)); 
     } 

     LineDataSet set1; 

     if (mChart.getData() != null && 
       mChart.getData().getDataSetCount() > 0) { 
      set1 = (LineDataSet)mChart.getData().getDataSetByIndex(0); 
      set1.setValues(values); 
      mChart.getData().notifyDataChanged(); 
      mChart.notifyDataSetChanged(); 
     } else { 
      set1 = new LineDataSet(values, "DataSet 1"); 
      set1.setColor(Color.WHITE); 
      set1.setCircleColor(Color.BLACK); 
      set1.setLineWidth(3f); 
      set1.setDrawCircles(false); 
      set1.setMode(LineDataSet.Mode.CUBIC_BEZIER); 

      set1.setValueTextSize(9f); 
      set1.setDrawValues(false); 
      set1.setDrawFilled(true); 
      set1.setFormLineWidth(1f); 
      set1.setFormSize(15.f); 

      if (Utils.getSDKInt() >= 18) { 
       // fill drawable only supported on api level 18 and above 
       Drawable drawable = ContextCompat.getDrawable(this, R.drawable.fade_orange); 
       set1.setFillDrawable(drawable); 
      } 
      else { 
       set1.setFillColor(Color.BLACK); 
      } 

      ArrayList<ILineDataSet> dataSets = new ArrayList<ILineDataSet>(); 
      dataSets.add(set1); // add the datasets 

      // create a data object with the datasets 
      LineData data = new LineData(dataSets); 

      // set data 
      mChart.setData(data); 
     } 
    } 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     getMenuInflater().inflate(R.menu.line, menu); 
     return true; 
    } 
} 
+1

Благодарим вас за подробный ответ. Ваше объяснение помогло, и основное исправление заключалось в настройке смещений порта просмотра. После некоторых беспорядков это также имеет значение, когда вы вызываете этот метод. – StuStirling

Смежные вопросы