#android #sprite
#Android #спрайт
Вопрос:
Я бы хотел анимировать спрайт. Я выбираю текущий кадр с помощью BitmapRegionDecoder, но это вызывает сбой на некоторых устройствах Anroid 6.0 (в основном на Samsung). Я получаю эту трассировку стека:
Сборка отпечатка пальца: ‘samsung / zeroltexx / zerolte: 6.0.1 / MMB29K / G925FXXU4DPGW: user / release-keys’ Редакция: ’10’ ABI: ‘arm64’ pid: 10872, tid: 10872, имя: .aff.index.main >>> com.aff.index.main <<<сигнал 11 (SIGSEGV), код 1 (SEGV_MAPERR), ошибка addr 0x30 x0 0000000000000000 x1 0000000000000000 x2 0000000000000002 x3 0000000000000000 x4 0000000000000000 x5 00000000ffffffff x6 0000000000000000 x7 0000000000000000 x8 0000000000000000 x8 0000000000000000 x9 0000000000000000 x10 0000000000000000 x11 0000000000000000 x12 0000007f1d0fd5c8 x13 0000000000000002 x14 0000000000000000 x15 0000000000000000 c8000000c5 x16 0000007f7931c5f8 x17 0000007f7925e3dc x18 0000000000000000 x19 0000000000000000 x20 0000007f7563d180 x21 0000000000000001×22 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.итак (_ZNK7android6Bitmap4infoEv) #01 пк 00000000000f8344 /system/lib64/libandroid_runtime.so (_zn11graphicsjni12createbitmapep7_jnienvpn 7android6bitmapeip11_jbytearrayp8_jobjecti 60) #02 пк 0000000000104224 /system/lib64/ libandroid_runtime.so #03 пк 0000000003f6b77c /system/framework/arm64/boot.oat (смещение 0x2f37000)
Я называю это выполняемым внутри представления
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
try {
if (isInited amp;amp; 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);
}
}
}
На многих устройствах она работает хорошо, например, на Nexus 6.0 с Android 7.0 или на Sony XPeria Z1 с Android 5.x, но на моем Samsung Galaxy S6 с Android 6.x мое приложение вылетает.
Ответ №1:
Однажды у меня была похожая проблема. Проблема заключалась в том, что я использовал библиотеку, которая не включала 64-разрядный код arm. В Android есть ошибка, при которой предполагается, что если одна библиотека объединяет 64-разрядный машинный код, предполагается, что все библиотеки, использующие машинный код, содержат 64-разрядный код. Я считаю, что Galaxy S7 — это 64-битный телефон. Проверьте свой разнесенный apk, чтобы убедиться, что это так.
Вы можете загрузить весь спринт и обрезать из него области, используя Java-код. Вы можете найти ответ о том, как это сделать, в этой статье. Разработчики Android, сделайте свою панель инструментов и просмотр фонов морозными
Короче говоря:
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);
Я рекомендую вернуться к этому, если первый метод не сработал.