web-dev-qa-db-fra.com

MPAndroidChart - Les étiquettes de légende sont coupées

J'utilise bibliothèque MPAndroidChart . Quelqu'un a ce problème? Lorsque je mets les étiquettes en position INFÉRIEURE, elles sont coupées.

Je vous remercie

enter image description here

21
rafaelasguerra

Ils sont coupés car votre le texte est trop long et la bibliothèque ne prend pas en charge le "wrapping" des étiquettes vers une nouvelle ligne.

Vous devrez raccourcir vos étiquettes de légende ou implémenter vous-même la fonctionnalité souhaitée.

MISE À JOUR:

L'habillage de mots pour Legend est maintenant pris en charge.

chart.getLegend().setWordWrapEnabled(true);
16
Philipp Jahoda

Cela semble être une nouvelle fonctionnalité depuis juin (2015):

chart.getLegend().setWordWrapEnabled(true);

Javadoc:

/**
 * Should the legend Word wrap? / this is currently supported only for:
 * BelowChartLeft, BelowChartRight, BelowChartCenter. / note that Word
 * wrapping a legend takes a toll on performance. / you may want to set
 * maxSizePercent when Word wrapping, to set the point where the text wraps.
 * / default: false
 * 
 * @param enabled
 */
public void setWordWrapEnabled(boolean enabled) {
    mWordWrapEnabled = enabled;
}
44
Aksel Willgert

Vous devez implémenter des légendes personnalisées avec leurs couleurs et étiquettes de légendes en suivant les étapes Étape 1

Legend legend = mChart.getLegend();

Étape 2

int colorcodes[] = legend.Colors();

étapes

for (int i = 0; i <  legend.Colors().length-1; i++) {
 .....
 .....
 }

étapes 4

Ensuite, vous devez prendre une disposition horizontale ou verticale. Vous devez obtenir les codes de couleurs des légendes et les légendes et, selon la longueur des légendes, créer une mise en page et une étiquette. Un exemple de code est donné ci-dessous

        LinearLayout.LayoutParams parms_left_layout = new LinearLayout.LayoutParams(
                LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
        parms_left_layout.weight = 1F;
        LinearLayout left_layout = new LinearLayout(context);
        left_layout.setOrientation(LinearLayout.HORIZONTAL);
        left_layout.setGravity(Gravity.CENTER);
        left_layout.setLayoutParams(parms_left_layout);

        LinearLayout.LayoutParams parms_legen_layout = new LinearLayout.LayoutParams(
                20, 20);
        parms_legen_layout.setMargins(0, 0, 20, 0);
        LinearLayout legend_layout = new LinearLayout(context);
        legend_layout.setLayoutParams(parms_legen_layout);
        legend_layout.setOrientation(LinearLayout.HORIZONTAL);
        legend_layout.setBackgroundColor(colorcodes[i]);
        left_layout.addView(legend_layout);

        TextView txt_unit = new TextView(context);
        txt_unit.setText(legend.getLabel(i));

J'espère que ceci vous aidera

7
Amandeep Rohila

Ici, je vais vous montrer un moyen simple par "Traditionnel Android Way", c'est assez simple, mon code est ci-dessous:

<LinearLayout
    Android:id="@+id/i_am_chart_view_container"
    ...
    Android:paddingRight="20dp"
    Android:clipChildren="false"
    Android:clipToPadding="false"
    .../>

Il suffit d'ajouter un peu de padding à la disposition du conteneur, ou un peu de margin à la vue graphique, et enfin de définir clipChildren & clipToPadding sur false.

Résultat ci-dessous:

la zone bleue est le remplissage ou la zone de marge.

enter image description here

5
codezjx

Définir la prise en charge du contenu enveloppant uniquement la position Legends lorsque la position de la légende est inférieure à ChartCef

     Legend legend = pieChart.getLegend();
        legend.setPosition(Legend.LegendPosition.BELOW_CHART_LEFT);
        legend.setWordWrapEnabled(true);

Après cet ensemble de données

 pieChart.setData(pieData)

ça marchera bien

3
Vinod Ranga
 Legend l = pieChart.getLegend();
 l.setPosition(LegendPosition.BELOW_CHART_LEFT);
 l.setXEntrySpace(7f);
 l.setYEntrySpace(0f);
 l.setYOffset(0f);
 l.setDirection(LegendDirection.LEFT_TO_RIGHT);
 l.setWordWrapEnabled(true);
3
Darshan Kachhadiya

Pour éviter écrêtage des valeurs de légende utilisez le bloc de code suivant

Legend legend=lineChart.getLegend();
legend.setWordWrapEnabled(true);

Doc (pour la légende):

/**
     * Should the legend Word wrap? / this is currently supported only for:
     * BelowChartLeft, BelowChartRight, BelowChartCenter. / note that Word
     * wrapping a legend takes a toll on performance. / you may want to set
     * maxSizePercent when Word wrapping, to set the point where the text wraps.
     * / default: false
     * 
     * @param enabled
     */
    public void setWordWrapEnabled(boolean enabled) {
        mWordWrapEnabled = enabled;
    }

Pour éviter écrêtage des étiquettes de l'axe des x utilisez

XAxis xAxis = lineChart.getXAxis();
xAxis.setAvoidFirstLastClipping(true);

Doc (pour les étiquettes de l'axe des x):

/**
     * if set to true, the chart will avoid that the first and last label entry
     * in the chart "clip" off the Edge of the chart or the screen
     * 
     * @param enabled
     */
    public void setAvoidFirstLastClipping(boolean enabled) {
        mAvoidFirstLastClipping = enabled;
    }
1

Essaye ça:

Legend l = pieChart.getLegend();
l.setVerticalAlignment(Legend.LegendVerticalAlignment.BOTTOM);
l.setHorizontalAlignment(Legend.LegendHorizontalAlignment.LEFT);
l.setOrientation(Legend.LegendOrientation.HORIZONTAL);
l.setDrawInside(false);
l.setXEntrySpace(4f);
l.setYEntrySpace(0f);
l.setWordWrapEnabled(true);
0
Vandana patel

Après une longue recherche, j'ai trouvé la solution. Le code ci-dessous l'a résolu.

chart.getLegend (). setWordWrapEnabled (true);

0
SFDCCoder