我使用achart引擎成功显示饼图。我想根据屏幕尺寸自定义我的标签文字大小。谢谢提前。
答案 0 :(得分:23)
这个问题归结为解决方案。 achartengine似乎在设计时考虑了原始像素,而显示质量和像素密度在过去几年中显着增加。来自achartengine样品的标签在我的HTC One上很小!
Android推出了scale-independent pixels。使用achartengine的关键是TypedValue
类。这是我做的:
DisplayMetrics metrics = context.getResources().getDisplayMetrics();
float val = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 18, metrics);
我在上面的链接中从“text size medium”获得了18。
然后,您可以在任何想要使用中等大小文本的位置使用val
。例如:
renderer.setLabelsTextSize(val);
答案 1 :(得分:3)
我编写了两个名为_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. ie:return((rv< 1)?1:v);
答案 2 :(得分:2)
最佳做法是将虚拟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);
答案 3 :(得分:2)
我认为最好的方法是在dp和sp中定义文件dimens.xml
中的大小,如下所示:
<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,设计非常一致。
答案 4 :(得分:1)
您可以这样设置标签文字大小:
renderer.setLabelsTextSize(size);
您必须找到最佳逻辑,以找到屏幕尺寸和标签尺寸之间的最佳比例。
答案 5 :(得分:0)
你可以试试这个:
renderer.setLegendTextSize(textSize);