web-dev-qa-db-fra.com

Personnalisation de la légende MPAndroidChart

J'utilise bibliothèque MPAndroidChart . Je veux personnaliser les légendes dans MPAndroidChart. Dans la bibliothèque MPAndroidChart, j'ai essayé de définir la position des légendes. par un code donné legend.setPosition (LegendPosition.BELOW_CHART_CENTER) mais incapable de le faire. Je dois définir des légendes comme indiqué dans l'image suivante

l'aide sera appréciée enter image description here

11
Zia

Veuillez rechercher la réponse donnée MPAndroidChart - Les étiquettes de légende sont coupées . J'ai déjà fourni la réponse en fonction de votre problème. Recherchez le code donné qui vous aidera certainement. Vous devrez implémenter des légendes personnalisées avec leurs couleurs et étiquettes de légendes en suivant les étapes ci-dessous:

Étape 1

Legend legend = mChart.getLegend();

Étape 2

int colorcodes[] = legend.Colors();

Étapes 3

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

Étapes 4

Ensuite, vous devrez prendre une mise en page horizontale ou verticale et obtenir les codes de couleur des légendes et l'étiquette des légendes et, selon la longueur des légendes, créer la mise en page et l'é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));
       left_layout.addView(txt_unit);

        LinearLayout.LayoutParams parms_middle_layout = new LinearLayout.LayoutParams(
                LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
        parms_middle_layout.weight = 1F;
        LinearLayout middle_layout = new LinearLayout(this);
        middle_layout.setOrientation(LinearLayout.HORIZONTAL);
        middle_layout.setGravity(Gravity.CENTER);
        middle_layout.setLayoutParams(parms_middle_layout);

        TextView txt_leads = new TextView(this);
        txt_leads.setText("450");
        middle_layout.addView(txt_leads);

        LinearLayout.LayoutParams parms_right_layout = new LinearLayout.LayoutParams(
                LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
        parms_right_layout.weight = 1F;
        LinearLayout right_layout = new LinearLayout(this);
        right_layout.setOrientation(LinearLayout.HORIZONTAL);
        right_layout.setGravity(Gravity.CENTER);
        right_layout.setLayoutParams(parms_right_layout);

        TextView txt_leads_percentage = new TextView(this);
        txt_leads_percentage.setText(munit_percentage_list.get(i) + "");
        right_layout.addView(txt_leads_percentage);

        childlayout.addView(left_layout);
        childlayout.addView(middle_layout);
        childlayout.addView(right_layout);

Et après cela, ajoutez votre (disposition enfant que vous avez créée lors de l'exécution) à la disposition principale.

10
Amandeep Rohila

Dans votre cas, je vous recommande de désactiver le Legend qui est dessiné par le graphique et de proposer à la place votre propre implémentation.

chart.getLegend().setEnabled(false)

Dans le cas ci-dessus, vous aurez probablement besoin d'un ListView qui récupère les données de l'objet charts Legend et les affiche.

Lorsque vous regardez la classe Legend , vous remarquerez qu'elle a des variables membres pour les couleurs et les étiquettes.

Vous pouvez récupérer ces tableaux (getColors(), getLegendLabels()) et les utiliser pour les afficher dans le ListView.

8
Philipp Jahoda

Suivez le code ci-dessous pour custom legend. Créer table_row_legend.xml dans la ressource de mise en page

    <TableRow xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:layout_width="fill_parent"
        Android:layout_height="wrap_content"
        Android:gravity="center"
        Android:weightSum="3">
        <LinearLayout
            Android:id="@+id/tv_color_container"
            Android:layout_width="0dp"
            Android:layout_height="match_parent"
            Android:layout_gravity="center"
            Android:layout_weight="0.30"
            Android:orientation="horizontal"
            Android:gravity="right"
            Android:padding="5dp">

            <LinearLayout
                Android:id="@+id/tv_color"
                Android:layout_width="20dp"
                Android:layout_height="20dp"
                Android:layout_gravity="center"

                Android:orientation="horizontal"
              />
        </LinearLayout>

        <TextView
            Android:id="@+id/tv_label"
            Android:layout_width="0dp"
            Android:layout_gravity="top"
            Android:layout_weight="1.35"

            Android:gravity="left|top"
            Android:padding="3dp"
            Android:singleLine="true"

            Android:textColor="#2b2b2b"
            Android:textSize="16sp" />

        <TextView
            Android:id="@+id/tv_amt"
            Android:layout_width="0dp"
            Android:layout_weight="1.35"
            Android:gravity="left|top"
            Android:padding="3dp"

            Android:textColor="#2b2b2b"
            Android:textSize="16sp" />
    </TableRow>

Créez un nouveau LinearLayout sous votre graphique à secteurs et encapsulez la disposition parent avec une disposition de défilement avec une hauteur statique jusqu'au graphique à secteurs

    <?xml version="1.0" encoding="utf-8"?>
    <ScrollView
        xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:layout_width="match_parent"
        Android:background="#ffffff"
        Android:layout_height="match_parent">

        <RelativeLayout
            xmlns:Android="http://schemas.Android.com/apk/res/Android"
            Android:layout_width="match_parent"
            Android:layout_height="match_parent"
            Android:layout_marginTop="10dp"
            Android:paddingBottom="10dp"
            Android:layout_marginBottom="10dp"
            Android:layout_centerInParent="true"
           >
      <com.github.mikephil.charting.charts.PieChart
                Android:id="@+id/chart1"
                Android:layout_width="match_parent"
                Android:layout_height="400dp"
                Android:layout_below="@+id/tv_info"
                Android:layout_centerHorizontal="true"
                Android:layout_marginTop="10dp"

                Android:background="#ffffff"
                Android:clickable="true" />

            <TableLayout
                Android:id="@+id/child_layout"
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content"
                Android:layout_below="@+id/chart1"
                Android:orientation="vertical" />
        </RelativeLayout>

    </ScrollView>

Modifiez votre classe d'activité comme suit

public void setCustomLegend(){
        int colorcodes[] = l.getColors();
        Context context = DistributorGraphActivity.this;
        for (int i = 0; i < l.getColors().length - 1; i++) {
            LayoutInflater inflater = getLayoutInflater();
            TableRow tr = (TableRow)          inflater.inflate(R.layout.table_row_legend,
                    childlayout, false);
            childlayout.addView(tr);
            LinearLayout linearLayoutColorContainer=(LinearLayout) tr.getChildAt(0);
            LinearLayout linearLayoutColor= (LinearLayout)           linearLayoutColorContainer.getChildAt(0);
            TextView tvLabel = (TextView) tr.getChildAt(1);
            TextView tvAmt = (TextView) tr.getChildAt(2);
            linearLayoutColor.setBackgroundColor(colorcodes[i]);
            tvLabel.setText(l.getLabel(i));
            tvAmt.setText(arrListDealerGraph.get(i).getAmt());
        }
        mChart.getLegend().setWordWrapEnabled(true);
        mChart.getLegend().setEnabled(false);
}
1
Amol Suryawanshi

pour définir des légendes personnalisées:

public void setLegends(){

Legend l = holder.pieChart.getLegend();

l.getEntries();

l.setPosition(Legend.LegendPosition.BELOW_CHART_CENTER);

l.setYEntrySpace(10f);

l.setWordWrapEnabled(true);

LegendEntry l1=new LegendEntry("Male",Legend.LegendForm.CIRCLE,10f,2f,null,Color.YELLOW);
LegendEntry l2=new LegendEntry("Female", Legend.LegendForm.CIRCLE,10f,2f,null,Color.RED);

l.setCustom(new LegendEntry[]{l1,l2});

l.setEnabled(true);

}
0
Rahul Singh