Размер текста метки в соответствии с размером экрана в круговой диаграмме движка диаграмм в Android

Я успешно показываю круговую диаграмму с помощью механизма achart. Я хочу настроить размер текста меток в соответствии с размером экрана. Заранее спасибо.


person hcp    schedule 28.12.2012    source источник


Ответы (7)


Вы можете установить размер текста меток следующим образом:

renderer.setLabelsTextSize(size);

Вам нужно будет найти наилучшую логику для нахождения наилучшей пропорции между размером экрана и размером меток.

person Dan D.    schedule 28.12.2012
comment
Это помогло мне. - person Sreekanth Karumanaghat; 27.07.2020

Эта проблема сводится к разрешению. achartengine, кажется, был разработан с учетом необработанных пикселей, в то время как качество отображения и плотность пикселей резко возросли за последние пару лет. Надписи от образца achartengine на моем HTC One крошечные!

Android представил пиксели, не зависящие от масштаба. Ключом к их использованию с achartengine является класс TypedValue. Вот что я сделал:

DisplayMetrics metrics = context.getResources().getDisplayMetrics();
float val = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 18, metrics);

Я получил 18 от «средний размер текста» по ссылке выше.

Затем вы можете использовать val везде, где хотите использовать текст среднего размера. Например:

renderer.setLabelsTextSize(val);
person Andy Gaskell    schedule 08.08.2013
comment
Что я должен передать в качестве метрик? - person Kaidul; 17.08.2013
comment
Извините за это - я пропустил это в своем первоначальном ответе. Я просто добавил код для получения метрик. - person Andy Gaskell; 17.08.2013

Это обобщенная версия того, что я сделал:

public static final int TEXT_SIZE_XHDPI = 24;
public static final int TEXT_SIZE_HDPI = 20;
public static final int TEXT_SIZE_MDPI = 18;
public static final int TEXT_SIZE_LDPI = 13;

XYMultipleSeriesRenderer renderer = new XYMultipleSeriesRenderer();

    switch (getResources().getDisplayMetrics().densityDpi) {
        case DisplayMetrics.DENSITY_XHIGH:
                renderer.setMargins(new int[] { 40, 90, 25, 10 });
                renderer.setAxisTitleTextSize(Constants.TEXT_SIZE_XHDPI);
                renderer.setChartTitleTextSize(Constants.TEXT_SIZE_XHDPI);
                renderer.setLabelsTextSize(Constants.TEXT_SIZE_XHDPI);
                renderer.setLegendTextSize(Constants.TEXT_SIZE_XHDPI);
                break;
        case DisplayMetrics.DENSITY_HIGH:
                renderer.setMargins(new int[] { 30, 50, 20, 10 });
                renderer.setAxisTitleTextSize(Constants.TEXT_SIZE_HDPI);
                renderer.setChartTitleTextSize(Constants.TEXT_SIZE_HDPI);
                renderer.setLabelsTextSize(Constants.TEXT_SIZE_HDPI);
                renderer.setLegendTextSize(Constants.TEXT_SIZE_HDPI);
                break;
        default:
                renderer.setMargins(new int[] { 30, 50, 20, 10 });
                renderer.setAxisTitleTextSize(Constants.TEXT_SIZE_LDPI);
                renderer.setChartTitleTextSize(Constants.TEXT_SIZE_LDPI);
                renderer.setLabelsTextSize(Constants.TEXT_SIZE_LDPI);
                renderer.setLegendTextSize(Constants.TEXT_SIZE_LDPI);
                break;
    }

Поэтому я в основном настраивал поля и размеры текста диаграммы в зависимости от плотности экрана устройства. Примечание. На данный момент я исключил случай средней плотности.

person Ryan    schedule 07.01.2013
comment
Не рекомендуется жестко задавать размеры. Я предложил лучшее, более гибкое решение. - person Athlan; 06.08.2013

Я написал два метода с именами _dp и _sp для преобразования в значения dp и sp.

private DisplayMetrics displayMetrics;
private boolean isPortrait;
int _dp(float pixels) {
   return (int)(pixels * displayMetrics.density);
}
float _sp(float pixels) {
    return (pixels * displayMetrics.scaledDensity);
}

В вашем onCreate вам нужно установить значение displayMetrics:

displayMetrics = (this.getResources()).getDisplayMetrics();

Затем вы просто используете _sp и _dp, чтобы получить значение sp/dp. Например, чтобы установить шрифт, масштабированный до 18

renderer.setAxisTitleTextSize(_sp(18));

И установить поля со значениями dp:

renderer.setMargins(new int[] {_dp(25), _dp(30), _dp(35), _dp(20)});

ПРИМЕЧАНИЕ. Я внес одно изменение в этот код. Для этих функций можно получить значение 0, что является реальной проблемой, если вы делите на возвращаемое значение. Я добавил тест для возврата 1, если возвращаемое значение равно ‹ 1. т.е.: return ((rv ‹ 1) ? 1 : v);

person steven smith    schedule 27.08.2014

Лучшей практикой является размещение фиктивного TextView в макете, чтобы получить textSize:

<TextView
        android:id="@+id/dummyTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone"
        android:text="TextView" />

И в вашем коде, например:

TextView testTextView = (TextView) rootView.findViewById(R.id.dummyTextView);
float textSize = testTextView.getTextSize();
renderer.setLabelsTextSize(textSize);
renderer.setLegendTextSize(textSize);
person Athlan    schedule 06.08.2013
comment
как это решение будет работать в случае разного разрешения экрана 2. - person CoDe; 09.05.2014

Я думаю, что лучший способ сделать это — определить размеры в файле dimens.xml в dp и sp следующим образом:

<dimen name="graph_chart_text_size">16sp</dimen>
<dimen name="graph_axis_title_text_size">14sp</dimen>
<dimen name="graph_labels_text_size">12sp</dimen>
<dimen name="graph_labels_padding">5dp</dimen>
<dimen name="graph_legend_text_size">14sp</dimen>
<dimen name="graph_legend_height">40dp</dimen>
<dimen name="graph_point">3dp</dimen>
<dimen name="graph_line">3dp</dimen>
<dimen name="graph_margin_top">10dp</dimen>
<dimen name="graph_margin_left">40dp</dimen>
<dimen name="graph_margin_right">10dp</dimen>
<dimen name="graph_margin_bottom">20dp</dimen>

Затем используйте getDimension и getDimensionPixelOffset для преобразования в пиксели при настройке средства визуализации , такие как:

renderer.setChartTitleTextSize(context.getResources().getDimension(R.dimen.graph_chart_text_size));
renderer.setAxisTitleTextSize(context.getResources().getDimension(R.dimen.graph_axis_title_text_size));
renderer.setLabelsTextSize(context.getResources().getDimension(R.dimen.graph_labels_text_size));
renderer.setLegendTextSize(context.getResources().getDimension(R.dimen.graph_legend_text_size));
renderer.setLegendHeight(context.getResources().getDimensionPixelOffset(R.dimen.graph_legend_height));
renderer.setMargins(new int[]{
        context.getResources().getDimensionPixelOffset(R.dimen.graph_margin_top),
        context.getResources().getDimensionPixelOffset(R.dimen.graph_margin_left_mood),
        context.getResources().getDimensionPixelOffset(R.dimen.graph_margin_bottom),
        context.getResources().getDimensionPixelOffset(R.dimen.graph_margin_right)});
    }

Я тестировал на телефонах с разрешением от 800x480 до 1920x1080, дизайн очень стабильный.

person Tiago A.    schedule 27.11.2013

Вы можете попробовать это:

renderer.setLegendTextSize(textSize);
person h.boulla    schedule 10.01.2014