我想为精灵制作动画。 我通过BitmapRegionDecoder选择当前帧,但它导致一些Anroid 6.0设备(主要是三星)的本机崩溃。 我得到了这个堆栈跟踪:
构建指纹:' samsung / zeroltexx / zerolte:6.0.1 / MMB29K / G925FXXU4DPGW:用户/发布密钥' 修订版:' 10' ABI:' arm64' pid:10872,tid:10872,name:.aff.index.main>>> com.aff.index.main<<< 信号11(SIGSEGV),代码1(SEGV_MAPERR),故障地址0x30 x0 0000000000000000 x1 0000000000000000 x2 0000000000000002 x3 0000000000000000 x4 0000000000000000 x5 00000000ffffffff x6 0000000000000000 x7 0000000000000000 x8 0000000000000000 x9 0000000000000000 x10 0000000000000000 x11 0000000000000000 x12 0000007f1d0fd5c8 x13 0000000000000002 x14 0000000000000000 x15 000000c8000000c5 x16 0000007f7931c5f8 x17 0000007f7925e3dc x18 0000000000000000 x19 0000000000000000 x20 0000007f7563d180 x21 0000000000000001 x22 0000000000000000 x23 0000000000000000 x24 0000000000000000 x25 0000000000000000 x26 00000000ffffffff x27 0000000000000000 x28 0000000000000000 x29 0000007fead6d070 x30 0000007f79264348 sp 0000007fead6d050 pc 0000007f7925e3dc pstate 回溯: #00 pc 00000000000f23dc /system/lib64/libandroid_runtime.so(__ZNK7android6Bitmap4infoEv) #01 pc 00000000000f8344 /system/lib64/libandroid_runtime.so(________ZG111,,,,,, #02 pc 0000000000104224 /system/lib64/libandroid_runtime.so #03 pc 0000000003f6b77c /system/framework/arm64/boot.oat(offset 0x2f37000)
我在View
中调用此runnable @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
try {
if (isInited && region != null) canvas.drawBitmap(region, 0, 0, paint);
} catch (Throwable t) {
Timber.w(t, null);
}
}
class AnimatePlaceholderRunnable implements Runnable {
@Override
public void run() {
try {
if (Build.VERSION.SDK_INT < 10) return;
if (!isAnimating) return;
if ((top + height + empty) <= maxTop) top = top + height + empty;
else
top = 0;
bottom = top + height;
src = new Rect(left, top, right, bottom);
region = decoder.decodeRegion(src, null);
invalidate();
postDelayed(placeholderRunnable, 41);
} catch (Throwable t) {
Timber.w(t, null);
}
}
}
在许多设备上运行良好,例如在使用Android 7.0的Nexus 6.0或使用Android 5.x的Sony XPeria Z1上,但在使用Android 6.x的Samsung Galaxy S6上我的应用程序崩溃。
答案 0 :(得分:0)
我曾遇到过类似的问题。问题是我使用的是一个没有捆绑64位arm代码的库。 Android有一个错误,它假定如果一个库捆绑64位本机代码,它假定所有使用本机代码的库都有64位代码。我相信Galaxy S7是一款64位手机。检查你的爆炸apk,看看是否是这种情况。
您可以使用Java代码加载整个sprint和crop区域。 您可以在本文中找到有关如何执行此操作的答案。 Android Devs, make your Toolbar and View backgrounds frosty
简而言之:
Matrix matrix = new Matrix();
//half the size of the cropped bitmap
//to increase performance, it will also
//increase the blur effect.
matrix.setScale(0.5f, 0.5f);
Bitmap bitmap = Bitmap.createBitmap(spriteBitmap,
(int) targetView.getX(), //start x
(int) targetView.getY(), //start y
targetView.getMeasuredWidth(), //end x
targetView.getMeasureHeight(), //end y
matrix,
true);
如果第一种方法不起作用,我的建议是回到这一点。