我正在创建一个条形图,但遇到了在平板电脑上切断 x 轴标签的问题。附件是手机上的正确布局和平板电脑上的错误布局。

有谁知道为什么平板电脑会出现这个问题以及如何解决它?

手机布局

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

平板电脑布局

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

这是我创建条形图的代码。

布局文件

<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;
    }

最佳答案

问题似乎是图形小部件底部边距中的空间不足。如果您将其添加到您的绘图的 XML 中:

androidPlot.graphWidget.marginBottom="100dp"

那么问题就应该消失了。 100dp 可能有点矫枉过正,所以你需要拨入它,但你明白了:)

关于Androidplot - X 轴标签被切断,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25780552/

10-10 19:50