Размер текста метки в соответствии с размером экрана в круговой диаграмме движка диаграммы в android
Я успешно отображаю круговую диаграмму с помощью achart engine.Я хочу настроить размер текста надписей в соответствии с размером экрана.Спасибо заранее.
7 ответов
вы можете установить размер текста надписей следующим образом:
renderer.setLabelsTextSize(size);
вам нужно будет найти лучшую логику для поиска лучшей пропорции между размером экрана и размером меток.
эта проблема сводится к решению. achartengine, похоже, был разработан с учетом необработанных пикселей, в то время как качество отображения и плотность пикселей резко возросли за последние пару лет. Этикетки из образца achartengine крошечные на моем HTC One!
Android представил масштаб-независимые пиксели. Ключ к использованию их с achartengine является TypedValue
класса. Вот что я сделал:--5-->
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
float val = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 18, metrics);
Я получил 18 от " среднего размера текста" в ссылке выше.
затем вы можете использовать val
везде, где вы хотите использовать текст среднего размера. Например:
renderer.setLabelsTextSize(val);
это сокращенная версия того, что я сделал:
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;
}
поэтому я в основном настроил поля и размеры текста диаграммы в зависимости от плотности экрана устройства. Примечание: Я исключил случай средней плотности на данный момент.
Я написал два метода под названием _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, Если возвращаемое значение
лучше всего поместить фиктивный 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);
Я думаю, что лучший способ сделать это, чтобы определить размеры в файле 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, и дизайн очень последователен.