Размер Текста метки согласно размеру экрана в круговой диаграмме двигателя диаграммы в андроиде

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

9

11 ответы

Эта проблема сводится к резолюции. 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);
23
добавлено
Что я должен передать как metrices?
добавлено автор Kaidul Islam, источник
Жаль об этом - я пропустил его в своем оригинальном ответе. Я просто добавил код, чтобы получить метрики.
добавлено автор Andy Gaskell, источник

Эта проблема сводится к резолюции. 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);
23
добавлено
Что я должен передать как metrices?
добавлено автор Kaidul Islam, источник
Жаль об этом - я пропустил его в своем оригинальном ответе. Я просто добавил код, чтобы получить метрики.
добавлено автор Andy Gaskell, источник

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

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

Таким образом, я в основном настроил края и размеры текста диаграммы в зависимости от плотности экрана устройства. Отметьте: Я исключил средний случай плотности на данный момент.

13
добавлено
Это не хорошая идея твердому коду размеры. Я предложил лучшее, более гибкое решение.
добавлено автор Athlan, источник

Я написал два метода, названные _dp и _sp, чтобы преобразовать в ценности 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/разности потенциалов. Например, установить шрифт, измеренный в 18

renderer.setAxisTitleTextSize(_sp(18));

И установить края с ценностями разности потенциалов:

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

NOTE: I made one change to this code. It is possible to get a 0 value for these functions -- which is a real problem if you are dividing by the return value. I added a test to return 1 if the return value is < 1. ie: return ((rv < 1) ? 1 : v);

3
добавлено

Я написал два метода, названные _dp и _sp, чтобы преобразовать в ценности 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/разности потенциалов. Например, установить шрифт, измеренный в 18

renderer.setAxisTitleTextSize(_sp(18));

И установить края с ценностями разности потенциалов:

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

NOTE: I made one change to this code. It is possible to get a 0 value for these functions -- which is a real problem if you are dividing by the return value. I added a test to return 1 if the return value is < 1. ie: return ((rv < 1) ? 1 : v);

3
добавлено

Я думаю, что лучший способ сделать это состоит в том, чтобы определить размеры в файле dimens.xml в разности потенциалов и SP как так:

16sp
14sp
12sp
5dp
14sp
40dp
3dp
3dp
10dp
40dp
10dp
20dp

И затем используйте getDimension и getDimensionPixelOffset преобразовать в пиксели, формируя renderer, такие как:

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 и дизайн, очень последователен.

2
добавлено

Я думаю, что лучший способ сделать это состоит в том, чтобы определить размеры в файле dimens.xml в разности потенциалов и SP как так:

16sp
14sp
12sp
5dp
14sp
40dp
3dp
3dp
10dp
40dp
10dp
20dp

И затем используйте getDimension и getDimensionPixelOffset преобразовать в пиксели, формируя renderer, такие как:

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 и дизайн, очень последователен.

2
добавлено

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


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

TextView testTextView = (TextView) rootView.findViewById(R.id.dummyTextView);
float textSize = testTextView.getTextSize();
renderer.setLabelsTextSize(textSize);
renderer.setLegendTextSize(textSize);
2
добавлено
как это решение будет работать в случае различных 2 разрешений экрана.
добавлено автор CoDe, источник

Можно установить размер текста этикеток этот путь:

renderer.setLabelsTextSize(size);

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

1
добавлено

Можно попробовать это:

renderer.setLegendTextSize(textSize);
0
добавлено

Можно попробовать это:

renderer.setLegendTextSize(textSize);
0
добавлено
Mobile Dev Jobs — вакансии и аналитика
Mobile Dev Jobs — вакансии и аналитика
6 187 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению iOS, Android, Xamarin и т.д. ВАЖНО: Правила публикации и правила канала: Ссылка – https://telegra.ph/Pravila-oformleniya-vakansij-i-rezyume-11-09-2

Android Developers
Android Developers
4 476 участник(ов)

Общаемся на темы, посвященным Android-разработке, SDK, Kotlin, Realm и т.д.

Android Architecture
Android Architecture
2 186 участник(ов)

Русскоязычный чат по архитектуре в андроид приложениях. Подробнее: http://telegra.ph/Android-Architecture-12-24

rus-speaking/android
rus-speaking/android
1 705 участник(ов)

Основной чат по Android разработке (вопрос-ответ). ПРАВИЛА: bit.ly/andr-rules. NEWS: bit.ly/AnrdResId ЧАТЫ: Основной: bit.ly/andr-main IDE, сборка, Git, сервисы: bit.ly/andr-tools Оффтоп: bit.ly/andr-offtop Конференции, события: bit.ly/andr-events Вакансии, найм: bit.ly/andr-job Архитектура: bit.ly/andr-patterns Rx: bit.ly/andr-rx Тестирование: bit.ly/andr-test Kotlin: bit.ly/andr-kotlin Хаmarin: bit.ly/andr-xamarin За мат, спам, агрессию, предложения о работе, оффтоп в этом канале - бан на сутки и более ☢☢☢

Android Dev Подкаст
Android Dev Подкаст
1 325 участник(ов)

Комната для обсуждения Android Dev подкаста apptractor.ru/AndroidDev/ Общее обсуждение Android: https://t.me/android_ru Остальные чаты про Android: http://t.me/devChats Наши новости https://t.me/androiddevpodcast_news

Android Guards
Android Guards
602 участник(ов)

Обсуждение любых вопросов касающихся безопасности Android. - Защита системы и приложений - Уязвимости и эксплойты - Вредоносное ПО - Копание в кишках системы и приложений (RE)

Android JOB
Android JOB
466 участник(ов)

Публикуем вакансии и запросы на поиск работы по направлению Android (full-time, part-time, remote и разовые подработки)

AndroidDev :: Разработка. It's Android time now!
AndroidDev :: Разработка. It's Android time now!
458 участник(ов)

It's Android time now! Чат разработчиков Android. Вакансии, резюме и информацию о митапах размещать можно. Публикацию скрытой и явной рекламы ваших каналов и сайтов после получения разрешения от @olegushakov

Aandroid Talks!
Aandroid Talks!
212 участник(ов)

Чат об общих вопросах по ОС Android. Чат для разработки под андроид - pro.android: https://t.me/joinchat/AAAAAEKIFKnmRT9cMebb9w

Android Rus
Android Rus
68 участник(ов)