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