一般来说,eclipse只是IDE开发工具,它虽然能编译apk,但是大多数开发情况下,都会要求必须在源码里编译通过,达到工程化,而不是单单的demo。
问题:
这次悲催而又诡异的遇到了这么个问题:
作者也是在eclipse中建的工程,并调试。因为要放到源码里去编译,所以加了个在根目录里加Android.mk放到源码编译,也编过了。
运行时,eclipse的效果如图:
android 源码编译的效果为:
神奇的事情竟然出现了,焦点框的阴影居然跑到文字上去了!!!我勒个去。
这里图片(更多)、文字(游戏),焦点框,都是用canvas画出来的。
分析:
1.查看代码,但是很明显代码里画焦点框和阴影都是同时画的,坐标也是一样的,文字那里没有加阴影的代码
void onDrawFocus(Canvas canvas, int left, int top) {
//阴影
paint.reset();
paint.setShadowLayer(20f, 10f, 10f, Color.BLACK);
RectF focusRectF = new RectF(x - space, y - space, r + space, b
+ space);
canvas.save();
canvas.drawRoundRect(focusRectF, 10f, 10f, paint);
canvas.restore();
// 显示全图
canvas.save();
canvas.drawBitmap(image_temp, x - space, y - space, null);
canvas.restore();
paint.reset();
paint.setStrokeWidth(6);
paint.setStyle(Style.STROKE);
paint.setColor(Color.rgb(255, 201, 42));
RectF focusRectF1 = new RectF(x - space, y - space, r + space, b
+ space); // 焦点框
canvas.save();
canvas.drawRoundRect(focusRectF1, 0, 0, paint);
canvas.restore();
}
所以想来代码是不会出现这样的的效果的。为了得到结论,重新加了段代码,画了个红色矩形块放到android源码里编译,也正常显示了。唯独这个阴影跑到文字上去了。莫名中...
2.折磨良久未果,老大过来反馈下,给我建议:反编译对比2个apk,有哪些地方不一样。
dex2jar.bat反编译源码,不对呀,不应该是源码问题导致的,2者编译过程最多是编译部分代码的顺序不一致。
apktool反编译资源文件。2者()最后对比,发现:
android 源码编译的apk eclipse编译的apk
lib下面的库首先排除,smali也是源码里的东西,也可排除;但当时注意了以下smali/android/annotation/下面多了2个文件,打开之后:
.class public interface abstract annotation Landroid/annotation/TargetApi;
.super Ljava/lang/Object;
.source "TargetApi.java"
# interfaces
.implements Ljava/lang/annotation/Annotation;
# annotations
.annotation runtime Ljava/lang/annotation/Retention;
value = .enum Ljava/lang/annotation/RetentionPolicy;->CLASS:Ljava/lang/annotation/RetentionPolicy;
.end annotation
.annotation runtime Ljava/lang/annotation/Target;
value = {
.enum Ljava/lang/annotation/ElementType;->TYPE:Ljava/lang/annotation/ElementType;,
.enum Ljava/lang/annotation/ElementType;->METHOD:Ljava/lang/annotation/ElementType;,
.enum Ljava/lang/annotation/ElementType;->CONSTRUCTOR:Ljava/lang/annotation/ElementType;
}
.end annotation
# virtual methods
.method public abstract value()I
.end method
没看明白,╮(╯▽╰)╭
网上找下,原来是代码注释的接口。代码中使用:
@TargetApi annotaion:高版本API的代码在低版本SDK兼容
但好像,这个也并没有方法解决此时的问题。接着往下看AndroidManifest.xml:
只有这个一个地方不一样:
android:targetSdkVersion="15"
此时也点愣了,我了个去,作者代码上传svn时并没有这个android:targetSdkVersion="15" 啊。绞尽脑思没明白这是为什么?抓狂中...
(android:minSdkVersion="" android:targetSdkVersion="" android:minSdkVersion=""可以网上找下了解这个区别)
查看官方api,这么描述:
设置这个属性是为了使你的应用能正常兼容运行在你的设备上,当设备平台的系统API高于你应用中设置的targetSdkVersion。
但是明显有一句:
An integer designating the API Level that the application targets. If not set, the default value equals that given to minSdkVersion.
当没有设置时,默认值为你给出最小的minSdkVersion。那此时这个应该就是我设置8呀,为什么会是15?痛苦中...
接着找原因。我用的android源码版本就是4.0.3的,正好是对应15的level。是不android源码编译时,默认加进去了?
半天,这猜测没有找到解释。悲催中...
那就按照boss的解决问题的终极思路---死办法:试试呗。不能老纠结在这个问题,只能试过才能验证。
3.猜想碰运气
a>eclipse中的AndroidManifest.xml中加上android:targetSdkVersion="15",编译运行发现,出现和android源码编译的apk一样,阴影跑到上面文字上去了╮(╯▽╰)╭
这怎么整,源码里编译,有方法可以不让加上android:targetSdkVersion="15" 这个么?表示没找到。无奈继续试...
b>eclipse中的android:targetSdkVersion="14",编译还是同样的效果,不是说设备机的版本高于刚设置的“14”,就启用兼容运行么?为什么效果还是和15一样的?表示极度不解?
c>继续调android:targetSdkVersion="13",效果正常了,阴影在焦点框周围了。这是为什么?为什么?不懂....
没办法,接着试下把android:targetSdkVersion="13",放到android源码了编译,效果正常显示
4.附:
问题是解决了,但是这搞得不明不白的。
这原因现在还没弄明白,为什么api里说的有误差?让我怀疑这已经最准确的释义?诚心求遇到同样问题并解决问题的朋友转告下,tksO(∩_∩)O~
提醒:各位同仁遇到类似的问题的时候,千万小心这个...
来源:oschina
链接:https://my.oschina.net/u/587911/blog/140857