Androidplot - X-Axis labels cut off

大兔子大兔子 提交于 2019-11-28 09:02:11

问题


I'm creating a bar chart but have run into an issue with the x-axis labels being cut off on a tablet. Attached is the correct layout on a phone and the incorrect layout on a tablet.

Does any one know why this issue occurs on a tablet and how to fix it?

Phone layout

https://drive.google.com/file/d/0B4CxFPSlLEYpdGZCMm8xdGZHTlk/edit?usp=sharing

Tablet layout

https://drive.google.com/file/d/0B4CxFPSlLEYpakx1WFo3cGhNSTg/edit?usp=sharing

This is my code to create the bar chart.

Layout file

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fillViewport="true"
        android:paddingBottom="@dimen/activity_vertical_margin"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="@dimen/activity_vertical_margin"
        tools:context="com.usage.bigpondpro.MainActivity$PlaceholderFragment"
        android:id="@+id/svDailyContainter" >

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

            <com.androidplot.xy.XYPlot
                android:id="@+id/dailyXYPlot"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                androidPlot.title="Sample Bar Graph"
                androidPlot.titleWidget.labelPaint.textSize="@dimen/title_font_size"
                androidPlot.graphWidget.marginTop="20dp"
                androidPlot.graphWidget.marginLeft="10dp"
                androidPlot.graphWidget.marginBottom="20dp"
                androidPlot.graphWidget.marginRight="10dp"
                androidPlot.rangeLabelWidget.labelPaint.textSize="@dimen/range_label_font_size"
              androidPlot.domainLabelWidget.labelPaint.textSize="@dimen/range_label_font_size"  
                />     

        </LinearLayout>
    </ScrollView>

Activity

    private void CreateGraph()
    {
        // initialize our XYPlot reference:
        XYPlot plot = (XYPlot)this.findViewById(R.id.dailyXYPlot);

        // Create

 a couple arrays of y-values to plot:
        Number[] series1Numbers = GenerateGraphValues();

        // Turn the above arrays into XYSeries':
        XYSeries series1 = new SimpleXYSeries(
        Arrays.asList(series1Numbers),          // SimpleXYSeries takes a List so turn our array into a List
         SimpleXYSeries.ArrayFormat.Y_VALS_ONLY, // Y_VALS_ONLY means use the element index as the x value
                "Series1");                             // Set the display title of the series

        BarFormatter series1Format = new BarFormatter(Color.rgb(51, 181, 229), Color.TRANSPARENT);

        PointLabelFormatter  plf = new PointLabelFormatter();
        plf.getTextPaint().setTextSize(18);
        plf.getTextPaint().setColor(Color.BLACK);
        series1Format.setPointLabelFormatter(plf);


        series1Format.setPointLabeler(new PointLabeler() {
            DecimalFormat df = new DecimalFormat("##0.00");

            public String getLabel(XYSeries series, int index) {

                //need to check for null
                if(series.getY(index) == null) return "";

                return df.format(series.getY(index));
            }
        });



        // add a new series' to the xyplot:
        plot.addSeries(series1, series1Format);


        //Y axis config
        plot.setRangeLabel("Values"); //label
        plot.setRangeBoundaries(0, 110, BoundaryMode.FIXED); //scale
        plot.setRangeStep(XYStepMode.SUBDIVIDE, 5); //steps
        plot.getGraphWidget().getRangeLabelPaint().setTextSize(26); //font size

        DecimalFormat nf = new DecimalFormat("#0");
        plot.setRangeValueFormat(nf);

        //X Axs config
        plot.setDomainLabel("Indexes");
        plot.setDomainStep(XYStepMode.SUBDIVIDE, 25);
       // plot.getGraphWidget().setDomainValueFormat(new GraphXLabelFormat());
        plot.getGraphWidget().getDomainLabelPaint().setTextSize(18);
        plot.getGraphWidget().setDomainLabelVerticalOffset(5);

        //other config
        plot.getLegendWidget().setVisible(false); //hide legend
        plot.getGraphWidget().getDomainGridLinePaint().setColor(Color.TRANSPARENT); //hide grid lines
        plot.getGraphWidget().getRangeGridLinePaint().setColor(Color.TRANSPARENT); //hide grid lines
        plot.getGraphWidget().setGridPaddingLeft(40); //give some padding
        plot.getGraphWidget().setGridPaddingRight(40); //give some padding
        plot.getGraphWidget().getGridBackgroundPaint().setColor(Color.WHITE); //background color
        plot.getTitleWidget().setPaddingTop(10); //give some padding

        //set bar width
        BarRenderer<?> renderer = (BarRenderer<?>) plot.getRenderer(BarRenderer.class);
        renderer.setBarWidth(25);

        //change x lable orientation
        plot.getGraphWidget().setDomainLabelOrientation(-90);

        //set graph height and width

        /** 
         For some reason when the device is in landscape mode the entire graph canvas is blank.
         Through trial and error if in landscape mode and the screen width is multiplied by 0.96 the graph and all it's data appear again.....why???
         **/
        DisplayMetrics displaymetrics = new DisplayMetrics();
        ((WindowManager) this.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getMetrics(displaymetrics);

        int Width = (int) (displaymetrics.widthPixels * 0.96);

        //default to portrait
        LayoutParams lp = new LayoutParams(LayoutParams.MATCH_PARENT, 750);
        //need to check the orienation
        if(IsLandscapeOrientation())
        {
            lp = new LayoutParams(Width, 560);
        }

        plot.setLayoutParams(lp);

    }

    private Number[] GenerateGraphValues()
    {
        int min = 30;
        int max = 100;
        int PlotPoints = 25;
        Number[] series1Numbers = new Number[PlotPoints];


        for(int x = 0; x < PlotPoints; x++){

            Random r = new Random();
            int randomNumber = r.nextInt(max - min + 1) + min;
            series1Numbers[x] = randomNumber;

        }

        return series1Numbers;  

    }

    private boolean IsLandscapeOrientation()
    {
        Display display = ((WindowManager) this.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
        int rotation = display.getRotation();

        boolean IsLandscape;


        switch (rotation) {
        case Surface.ROTATION_0:
        case Surface.ROTATION_180:
            IsLandscape = false;
         break;

        case Surface.ROTATION_90:
        case Surface.ROTATION_270:  
            IsLandscape = true;
         break;

        default:
            IsLandscape = true;
         break;
        }

        return IsLandscape;
    }

回答1:


The problem appears to be insufficient space in the graph widgets bottom margin. If you add this to your plot's XML:

androidPlot.graphWidget.marginBottom="100dp"

Then the problem should go away. 100dp is probably overkill so you'll need to dial it in but you get the idea :)



来源:https://stackoverflow.com/questions/25780552/androidplot-x-axis-labels-cut-off

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!