您的位置:首页 > 移动开发 > Android开发

Android利用注解转换字段的尺寸类型

2014-07-05 19:08 260 查看
在类里写的尺寸值默认是px的,这样在做不同屏幕适配的时候十分不方便
所以一般都利用

public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}


这种方法把在代码中写的值转换成dp的

但是这不是我想要的效果我希望我代码里面写的是

@PxToDp(px = 10)
int
changdu;
下面是实现:

public class BasicInfoLayout extends ViewGroup{
@Target</span>(ElementType.<span class="s2"><em>FIELD</em></span>)</p><p class="p3"><span class="s3">	</span><strong>public</strong><span class="s3"> </span><strong>@interface</strong><span class="s3"> </span><span class="s1">PxToDp</span><span class="s3"> {</span></p><p class="p1"><span>	</span><span>	</span><span class="s4"><strong>int</strong></span> px();</p><p class="p1"><span>	</span>}</p>
<span style="white-space:pre"></span><p class="p1"><span class="s1"><span style="white-space:pre">	</span>@PxToDp</span></p><p class="p2"><span class="s2">	</span><span class="s3"><strong>int</strong></span><span class="s2"> <strong>width=10;</strong></span></p><p class="p2"><span class="s2"></span></p><p class="p1"><span class="s1"><strong><span style="white-space:pre">	</span>public</strong></span> BasicInfoLayout(Context context, AttributeSet attrs) {</p><p class="p1"><span>	</span><span>	</span><span class="s1"><strong>super</strong></span>(context, attrs);</p><p class="p1"></p><p class="p1"><span style="white-space:pre">		</span>inject(getResources(), <span class="s1"><strong>this</strong></span>, XKBaseViewGroup.<span class="s1"><strong>class</strong></span>);</p><p class="p1"><span>	</span>}</p><p class="p1"><span style="white-space:pre">	</span></p><p class="p1"><span class="s1"><strong><span style="white-space:pre">	</span>public</strong></span> <span class="s1"><strong>void</strong></span> inject(Resources res, View view, Class<?> viewBaseClass) {</p><p class="p1"><span>	</span><span>	</span><span class="s1"><strong>for</strong></span> (Class<?> clazz = view.getClass(); !viewBaseClass.equals(clazz); clazz = clazz<span style="font-family: Arial, Helvetica, sans-serif;">.getSuperclass()) {</span></p><p class="p1"><span>	</span><span>	</span><span>	</span><span class="s1"><strong>for</strong></span> (Field field : clazz.getDeclaredFields()) {</p><p class="p1"><span>	</span><span>	</span><span>	</span><span>	</span>field.setAccessible(<span class="s1"><strong>true</strong></span>);</p><p class="p1"><span>	</span><span>	</span><span>	</span><span>	</span>Class<?> fieldType = field.getType();</p><p class="p1"><span>	</span><span>	</span><span>	</span><span>	</span>Object value = <span class="s1"><strong>null</strong></span>;</p><p class="p1"><span>	</span><span>	</span><span>	</span><span>	</span><span class="s1"><strong>for</strong></span> (Annotation a : field.getAnnotations()) {</p><p class="p3"><span class="s2"><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span></span><span style="font-family: Arial, Helvetica, sans-serif;"> </span><span class="s1" style="font-family: Arial, Helvetica, sans-serif;"><strong>if</strong></span><span style="font-family: Arial, Helvetica, sans-serif;"> (a </span><span class="s1" style="font-family: Arial, Helvetica, sans-serif;"><strong>instanceof</strong></span><span style="font-family: Arial, Helvetica, sans-serif;"> </span><span class="s3" style="font-family: Arial, Helvetica, sans-serif;">PxToDp</span><span style="font-family: Arial, Helvetica, sans-serif;">) {</span></p><p class="p1"><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span><span class="s1"><strong>try</strong></span> {</p><p class="p1"><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span>Method m = (Method) view.getClass().getMethod(</p><p class="p1"><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span>field.getName());</p><p class="p1"><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span>Integer val = (Integer) m.invoke(view);</p><p class="p1"><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span>value = val + 1000;</p><p class="p1"><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span>} <span class="s1"><strong>catch</strong></span> (NoSuchMethodException | IllegalAccessException<span style="font-family: Arial, Helvetica, sans-serif;">| IllegalArgumentException</span><span style="font-family: Arial, Helvetica, sans-serif;">| InvocationTargetException e) {</span></p><p class="p1"><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span>e.printStackTrace();</p><p class="p1"><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span>}</p><p class="p1"><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span>}</p><p class="p1"><span>	</span><span>	</span><span>	</span><span>	</span>}</p><p class="p1"><span>	</span><span>	</span><span>	</span><span>	</span><span class="s1"><strong>if</strong></span> (value != <span class="s1"><strong>null</strong></span>) {</p><p class="p1"><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span><span class="s1"><strong>try</strong></span> {</p><p class="p1"><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span>field.set(view, value);</p><p class="p1"><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span>} <span class="s1"><strong>catch</strong></span> (IllegalAccessException e) {</p><p class="p1"><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span>Log.<em>e</em>(<span class="s4">"XKBaseViewInjecter"</span>, field + <span class="s4">"\n"</span> + value, e);</p><p class="p1"><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span>} <span class="s1"><strong>catch</strong></span> (IllegalArgumentException e) {</p><p class="p1"><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span>Log.<em>e</em>(<span class="s4">"XKBaseViewInjecter"</span>, field + <span class="s4">"\n"</span> + value, e);</p><p class="p1"><span>	</span><span>	</span><span>	</span><span>	</span><span>	</span>}</p><p class="p1"><span>	</span><span>	</span><span>	</span><span>	</span>}</p><p class="p1"><span>	</span><span>	</span><span>	</span>}</p><p class="p1"><span>	</span><span>	</span>}</p><p class="p1"><span>	</span>}</p>}
这样就能达到我想要的效果咯 哈哈 虽然说性能上还是有些影响的 但是代码看着很规整
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: