Android res.getFraction()


今天我遇到一个问题,就是改东西的时候,看到同事有用到下面的东西:

在res->values->dimensions中定义这样:
<item type="dimen" name="screen_offset_percentage">8%</item> 

使用的时候:
screenOffset = (int)(screenWidth * res.getFraction(R.dimen.screen_offset_percentage, 1, 1));

用我的Nexus7测试后数据如下:

Nexus 7: width = 1200   , height = 1774
res.getFraction(R.dimen.nav_portrait_screen_offset_percentage, 1, 1), 这个值在我的nexus7 是:0.08000004
screenOffset = (int)(width * res.getFraction(R.dimen.screen_offset_percentage, 1, 1));  这个值是96
 
我不理解的是:为啥, res.getFraction(R.dimen.nav_portrait_screen_offset_percentage, 1, 1) 不是 1200 × 8% = 96, 而是0.08000004 × 1200,0.08000004 是怎么计算出来的呢?

http://developer.android.com/reference/android/content/res/Resources.html#getFraction%28int,%20int,%20int%29
http://developer.android.com/reference/android/util/TypedValue.html

具体的自己跟一下getFraction的代码吧,我 跟了一下,各种复杂运算,我直接就蒙了,就没继续看,感兴趣的看看吧。

我试图Google,但是没有找到,只搜到了类似下面这样的:

packages/apps/SystemUI$ resgrep status_bar_icon_drawing_alpha

在Android原生代码中,有一个项目,就是SystemUi用到了,搜索上面这句可以看到是下面这样用的。

final float alpha = res.getFraction(R.dimen.status_bar_icon_drawing_alpha, 1, 1);
setAlpha(alpha);


-------------------------------------------------------------------------------------------------
后来在StackOverflow上搜到这个:
http://stackoverflow.com/questions/11734470/how-does-one-use-resources-getfraction
http://codego.net/176820/

里面有一个回答可能有些帮助我们理解:

You specify fractions in XML as so:

   <item name="fraction" type="fraction">5%</item>
   <item name="parent_fraction" type="fraction">2%p</item>

Where 5% would be 0.05 when actually used.

Then:

// 0.05f
getResources().getFraction(R.fraction.fraction, 1, 1);
// 0.02f
getResources().getFraction(R.fraction.parent_fraction, 1, 1);
// 0.10f
getResources().getFraction(R.fraction.fraction, 2, 1);
// 0.10f
getResources().getFraction(R.fraction.fraction, 2, 2);
// 0.04f
getResources().getFraction(R.fraction.parent_fraction, 1, 2);
// 0.04f
getResources().getFraction(R.fraction.parent_fraction, 2, 2);

As you can see, depending on the type of fraction, the getFraction method multiples the values accordingly. If you specify a parent fraction (%p), it uses the second argument (pbase), ignoring the first. On the other hand, specifying a normal fraction, only the baseargument is used, multiplying he fraction by this.


-------------------------------------------------------------------------------------------
从上面似乎能看出点什么,我们做个测试:在res->values->dimens.xml中:

<item type="fraction" name="fraction_test">5%</item>

<item name="xxx" type="drawable" format="reference">@drawable/abc_ab_bottom_solid_dark_holo</item>

用eclipse的自动提示发现:type的参数有很多,从bool, integer, drawable.... format也有很多格式。我用加粗的行做测试,结果如下:


 float result = getActivity().getResources().getFraction(R.fraction.fraction_test, 5, 6);

1)如果fraction_test 是5%,那么result就是:5%*5 ~ 0.25 (约等于0.25,然后转为int就是0.25)

2)如果fraction_test 是5%p,那么result就是:5%*6 ~ 0.30 (约等于0.30,然后转为int就是0.30)

需要自己实际测试下,我想你应该明白点了。

实际如何使用呢?比如你可以按照设计师的标注和屏幕做计算,计算出的比例就是这个值,比如:我的Nexus7(w=1200, h=1824),设计师给的屏幕偏移比例是:5%
<item type="dimen" name="offset">5%</item>
int offset = width *  (int) (res.getFraction(R.fraction.fraction_test, 5, 6));
offset = 1200 * 0.25 = 300(px)

就是这样使用了,不知道明白没有?
 



你可能感兴趣的:(Android res.getFraction())