【问题标题】:MP Android Chart - How to set default number of bars displayed in BarGraph view?MP Android Chart - 如何设置条形图视图中显示的默认条数?
【发布时间】:2016-06-21 18:33:16
【问题描述】:

我是 android 开发的新手,目前正在学习如何构建图表,希望最终连接到数据库并创建动态图表。我使用了 MPAndroid 图表 GitHub 页面 (https://github.com/PhilJay/MPAndroidChart/) 中的示例 并试图对其进行操作以满足我的要求。

现在我的图表有一个 x 轴(天)和一个 y 轴(加仑)。

为简单起见,我创建了一个字符串数组“Day1”到“Day30”,用作我的 X 值。 Y 值是一个随机数(只是为了查看不同的条形大小)。

目前: 我的图表显示所有 30 天的随机 Y 值,我可以放大和缩小,以及在放大时向左或向右滚动。

我想要什么: 构建图表后,我希望图表的默认视图仅显示 7 天(例如“Day5”到“Day11”),但仍然可以在图表上向左或向右滚动以查看其他天 1 -30。另外,我希望能够从 7 天缩小到最多 30 天,或者放大以查看最少 3 天。

这是我目前的 java 文件。 我现在知道它的草率,我正在学习

public class ConsumptionActivity extends AppCompatActivity
        implements NavigationView.OnNavigationItemSelectedListener, OnChartValueSelectedListener, OnSeekBarChangeListener {


    protected BarChart mChart;
    private SeekBar mSeekBarX, mSeekBarY;
    private TextView tvX, tvY;

    private Typeface mTf;
    protected String[] mDays = new String[] {
            "Day 1","Day 2","Day 3","Day 4","Day 5","Day 6","Day 7","Day 8","Day 9","Day 10","Day 11","Day 12","Day 13","Day 14","Day 15",
            "Day 16","Day 17","Day 18","Day 19","Day 20","Day 21","Day 22","Day 23","Day 24","Day 25","Day 26","Day 27","Day 28","Day 29","Day 30"};



    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_consumption);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);


        setSupportActionBar(toolbar);



        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);

        Intent intent = getIntent();
        LoginAuthentification loggedIn = (LoginAuthentification) intent.getExtras().getSerializable("LoginClass");


        Spinner spinner = (Spinner) findViewById(R.id.accountDropdown);

        SpinnerAdapter snprAdapter = new ArrayAdapter<String>(this, R.layout.support_simple_spinner_dropdown_item, loggedIn.getAccountList());


        spinner.setAdapter(snprAdapter);

// Create an ArrayAdapter using the string array and a default spinner layout
        /*ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this,
                R.array.test, android.R.layout.simple_spinner_item);
// Specify the layout to use when the list of choices appears
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
// Apply the adapter to the spinner
        spinner.setAdapter(adapter);*/
        spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                // An item was selected. You can retrieve the selected item using
                // parent.getItemAtPosition(pos)
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
                // Another interface callback
            }
        });

        ObjectMapper mapper = new ObjectMapper();
        APICalls accountInfo = new APICalls();
        AccountDetails accountInUse = new AccountDetails();


        try {
            accountInUse = mapper.readValue(String.valueOf(accountInfo.AccountDetails(loggedIn.getToken(),loggedIn.getAccountList().get(0))), AccountDetails.class);
        } catch (Exception e) {
            e.printStackTrace();
        }


        /*tvX = (TextView) findViewById(R.id.tvXMax);
        tvY = (TextView) findViewById(R.id.tvYMax);

        mSeekBarX = (SeekBar) findViewById(R.id.seekBar1);
        mSeekBarY = (SeekBar) findViewById(R.id.seekBar2);*/

        mChart = (BarChart) findViewById(R.id.chart1);
        mChart.setOnChartValueSelectedListener(this);

        mChart.setDrawBarShadow(false);
        mChart.setDrawValueAboveBar(true);

        mChart.setDescription("Water Consumption Details");
        mChart.animateXY(8000, 8000);
        // if more than 60 entries are displayed in the chart, no values will be
        // drawn
        mChart.setMaxVisibleValueCount(60);

        // scaling can now only be done on x- and y-axis separately
        mChart.setPinchZoom(false);

        mChart.setDrawGridBackground(true);
        // mChart.setDrawYLabels(false);

        mTf = Typeface.createFromAsset(getAssets(), "OpenSans-Regular.ttf");

        XAxis xAxis = mChart.getXAxis();
        xAxis.setPosition(XAxisPosition.BOTTOM);
        xAxis.setTypeface(mTf);
        xAxis.setDrawGridLines(false);
        xAxis.setSpaceBetweenLabels(2);


        YAxisValueFormatter custom = new MyYAxisValueFormatter();

        YAxis leftAxis = mChart.getAxisLeft();
        leftAxis.setTypeface(mTf);
        leftAxis.setLabelCount(8, false);
        leftAxis.setValueFormatter(custom);
        leftAxis.setPosition(YAxisLabelPosition.OUTSIDE_CHART);
        leftAxis.setSpaceTop(15f);
        leftAxis.setAxisMinValue(0f); // this replaces setStartAtZero(true)

        YAxis rightAxis = mChart.getAxisRight();
        rightAxis.setDrawGridLines(false);
        rightAxis.setTypeface(mTf);
        rightAxis.setLabelCount(8, false);
        rightAxis.setValueFormatter(custom);
        rightAxis.setSpaceTop(15f);
        rightAxis.setAxisMinValue(0f); // this replaces setStartAtZero(true)

        Legend l = mChart.getLegend();
        l.setPosition(Legend.LegendPosition.BELOW_CHART_LEFT);
        l.setForm(Legend.LegendForm.SQUARE);
        l.setFormSize(9f);
        l.setTextSize(11f);
        l.setXEntrySpace(4f);
        //l.setExtra(ColorTemplate.VORDIPLOM_COLORS, new String[] { "abc",
        //"def", "ghj", "ikl", "mno" });
        //l.setCustom(ColorTemplate.VORDIPLOM_COLORS, new String[] { "abc",
        //"def", "ghj", "ikl", "mno" });


        setData(30, 50);

        // setting data
       /* mSeekBarY.setProgress(50);
        mSeekBarX.setProgress(12);

        mSeekBarY.setOnSeekBarChangeListener(this);
        mSeekBarX.setOnSeekBarChangeListener(this);*/

        // mChart.setDrawLegend(false);




/*
        APICalls callsForAll = new APICalls();
        try {
            callsForAll.AccountDetails(token.get(0),token.get(1));
        } catch (Exception e) {
            e.printStackTrace();
        }
        final TextView nameView = (TextView) findViewById(R.id.name);

*/
    }




    @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.consumption, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_Alerts) {

        } else if (id == R.id.nav_settings) {

        }
          else if (id == R.id.nav_Logout){

           // LOGOUT LOGIC SHOULD GO HERE
            android.os.Process.killProcess(android.os.Process.myPid());
            System.exit(1);
        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

   @Override
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {

    }

    @Override
    public void onStartTrackingTouch(SeekBar seekBar) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onStopTrackingTouch(SeekBar seekBar) {
        // TODO Auto-generated method stub

    }

    private void setData(int count, float range) {

        ArrayList<String> xVals = new ArrayList<String>();
        for (int i = 0; i < count; i++) {
            xVals.add(mDays[i]);
        }

        ArrayList<BarEntry> yVals1 = new ArrayList<BarEntry>();

        for (int i = 0; i < count; i++) {
            float mult = (range + 1);
            float val = (float) (Math.random() * mult);
            yVals1.add(new BarEntry(val, i));
        }

        BarDataSet set1 = new BarDataSet(yVals1, "DataSet");
        set1.setBarSpacePercent(35f);
        ArrayList<IBarDataSet> dataSets = new ArrayList<IBarDataSet>();
        dataSets.add(set1);
        set1.setColors(new int[]{R.color.neptuneOrange,R.color.colorPrimary});

        BarData data = new BarData(xVals, dataSets);
        data.setValueTextSize(10f);
        data.setValueTypeface(mTf);

        mChart.setData(data);
    }

    @SuppressLint("NewApi")
    @Override
    public void onValueSelected(Entry e, int dataSetIndex, Highlight h) {

        if (e == null)
            return;

        RectF bounds = mChart.getBarBounds((BarEntry) e);
        PointF position = mChart.getPosition(e, AxisDependency.LEFT);

        Log.i("bounds", bounds.toString());
        Log.i("position", position.toString());

        Log.i("x-index",
                "low: " + mChart.getLowestVisibleXIndex() + ", high: "
                        + mChart.getHighestVisibleXIndex());
    }

    public void onNothingSelected() {
    };
}

【问题讨论】:

  • 给你:github.com/PhilJay/MPAndroidChart/wiki/Modifying-the-Viewport 我也在使用这个库。我建议您阅读完整的 wiki。
  • 谢谢!我一直在看 wiki 和 javadoc,但不确定我应该看什么。我会通读一遍,希望能弄明白!
  • @Bang 你得到答案了吗??
  • chart.setVisibleXRangeMaximum(20);

标签: java android charts bar-chart mpandroidchart


【解决方案1】:

setMaxVisibleValueCount(int count):设置图表上最大可见绘制值标签的数量。这仅在启用 setDrawValues() 时生效。参考API

【讨论】:

    【解决方案2】:

    “我希望图表的默认视图仅显示 7 天”

    你需要的是

    chart.setVisibleXRangeMaximum(7); // 允许显示 7 个值 在 x 轴上一次,而不是更多

    因为最大可见计数值不符合您的要求。

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 2018-05-18
      • 1970-01-01
      • 2020-05-29
      • 1970-01-01
      • 1970-01-01
      • 2016-05-16
      • 2015-12-25
      • 1970-01-01
      相关资源
      最近更新 更多