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

时间:2012-12-28 09:53:03

标签: android achartengine

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

6 个答案:

答案 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>

然后在配置渲染器时使用getDimensiongetDimensionPixelOffset转换为像素,例如:

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