在Android中,根据图表引擎饼图中的屏幕大小标记文本大小

我成功地使用achart引擎显示饼图。我想根据屏幕大小自定义我的标签文本大小。提前感谢。

你可以这样设置标签的文字大小:

renderer.setLabelsTextSize(size); 

您将不得不findfind屏幕尺寸和标签尺寸之间最佳比例的最佳逻辑。

这个问题归结为解决方法。 achartengine似乎已经考虑到原始像素的devise,而显示质量和像素密度在过去几年里急剧增加。 来自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); 

这是我所做的一个总结版本:

 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值 – 如果除以返回值,这是一个真正的问题。 我添加了一个testing返回1,如果返回值是<1,即:return((rv <1)?1:v);

最佳做法是将虚拟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); 

我认为最好的办法是在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> 

然后在configuration渲染器时使用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)}); } 

我testing的手机范围从800×480到1920×1080,devise非常一致。

你可以试试这个:

 renderer.setLegendTextSize(textSize);