GIF 在我的 React Native 应用程序的 Android 版本中没有动画
GIFs not animating in the Android version of my React Native app
我正在努力让我的 GIF 在我的 RN 应用程序的 Android 版本上进行动画处理。 iOS 版本按预期为循环 GIF 制作动画,但我在 Android 设备上只看到 GIF 卡住的“单帧”图像。
根据调试和 RN 文档,需要在 /android/app/build.[=72= 中的 dependencies
中添加几行 implementation
],但即使清理了 gradle(/android 文件夹中的 运行 ./gradlew clean
)并删除了RN 应用程序的缓存(运行 react-native start --reset-cache
在项目根文件夹中),我没有看到我的应用程序有任何区别。
我用谷歌搜索并尝试了很多。基于我的调试冒险,我已经尝试并仔细检查了这些建议,这似乎对其他人有用,但对我似乎不起作用...
- 我已经尝试了几个版本的 fresco-libraries,它们似乎
是必需的,我也尝试将这些线放在
dependencies
. 的底部和顶部
- 部分回答还建议增加一行或多行代码
android/app/proguard-rules.pro 但这并没有改变
任何东西。
- 我在我的应用程序中以不同的方式使用 GIF,但它总是
width
和 height
包含在 <Image />
上 style
属性。
- 我尝试过使用来自不同 CDN 和域的 GIF-uris。
- 在我的测试设备上重新安装了该应用程序。
- 关闭并重新打开我的代码编辑器。
我使用的是以下版本:
- Java: 11.0.12
- React Native:0.65
- Android SDK: 30.0.2
- npm: 6.14.4
这是我的全/android/app/build.gradle:
apply plugin: "com.android.application"
import com.android.build.OutputFile
project.ext.react = [
enableHermes: false, // clean and rebuild if changing
]
apply from: "../../node_modules/react-native/react.gradle"
def enableSeparateBuildPerCPUArchitecture = false
def enableProguardInReleaseBuilds = false
def jscFlavor = 'org.webkit:android-jsc:+'
def enableHermes = project.ext.react.get("enableHermes", false);
android {
ndkVersion rootProject.ext.ndkVersion
compileSdkVersion rootProject.ext.compileSdkVersion
defaultConfig {
applicationId "com.example.app"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "1.0"
}
splits {
abi {
reset()
enable enableSeparateBuildPerCPUArchitecture
universalApk false // If true, also generate a universal APK
include "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
}
}
signingConfigs {
debug {
storeFile file('debug.keystore')
storePassword 'android'
keyAlias 'androiddebugkey'
keyPassword 'android'
}
}
buildTypes {
debug {
signingConfig signingConfigs.debug
}
release {
// Caution! In production, you need to generate your own keystore file.
// see https://reactnative.dev/docs/signed-apk-android.
signingConfig signingConfigs.debug
minifyEnabled enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
}
}
// applicationVariants are e.g. debug, release
applicationVariants.all { variant ->
variant.outputs.each { output ->
// For each separate APK per architecture, set a unique version code as described here:
// https://developer.android.com/studio/build/configure-apk-splits.html
// Example: versionCode 1 will generate 1001 for armeabi-v7a, 1002 for x86, etc.
def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
def abi = output.getFilter(OutputFile.ABI)
if (abi != null) { // null for the universal-debug, universal-release variants
output.versionCodeOverride =
defaultConfig.versionCode * 1000 + versionCodes.get(abi)
}
}
}
}
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
//noinspection GradleDynamicVersion
implementation "com.facebook.react:react-native:+" // From node_modules
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") {
exclude group:'com.facebook.fbjni'
}
debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
exclude group:'com.facebook.flipper'
exclude group:'com.squareup.okhttp3', module:'okhttp'
}
debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") {
exclude group:'com.facebook.flipper'
}
if (enableHermes) {
def hermesPath = "../../node_modules/hermes-engine/android/";
debugImplementation files(hermesPath + "hermes-debug.aar")
releaseImplementation files(hermesPath + "hermes-release.aar")
} else {
implementation jscFlavor
}
implementation project(':react-native-notifications')
implementation 'com.google.firebase:firebase-core:16.0.0'
implementation 'com.google.android.gms:play-services-ads:19.8.0'
implementation "androidx.appcompat:appcompat:1.0.0"
implementation 'com.facebook.fresco:fresco:2.4.0'
implementation 'com.facebook.fresco:animated-gif:2.4.0'
implementation 'com.facebook.fresco:webpsupport:2.4.0'
}
// Run this once to be able to run the application with BUCK
// puts all compile dependencies into folder libs for BUCK to use
task copyDownloadableDepsToLibs(type: Copy) {
from configurations.compile
into 'libs'
}
apply plugin: 'com.google.gms.google-services'
apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
如果我错过了一些明显的事情,请告诉我。我在 iOS- 开发方面肯定更有经验,所以我很可能错过了一些东西:-)
添加android/app/build.gradle
// For animated GIF support
compile 'com.facebook.fresco:animated-gif:1.+'
更简单的解决方法是使用 FastImage 库,它内置了 Gif 支持,并具有缓存等附加优势
我自己在 android 上遇到了 GIF 的问题,最终转向了 google 似乎接受甚至拥有自己的转换工具的动画 webp。他们 android 多年来一直支持它,而且似乎工作得更加稳定。甚至可以通过将扩展名更改为 webp 而不是 PNG 来工作?
我在使用 react-native 0.66.3 时遇到了同样的问题,在 app/build.gradle
中将 com.facebook.fresco:animated-gif
更新为 2.6.0
对我有用
Android
支持 GIF 和 WebP
构建您自己的本机代码时,Android 默认不支持 GIF 和 WebP。
您需要在 android/app/build.gradle 中添加一些可选模块,具体取决于您的应用程序的需要。
dependencies {
// If your app supports Android versions before Ice Cream Sandwich (API level 14)
implementation 'com.facebook.fresco:animated-base-support:1.3.0'
// For animated GIF support
implementation 'com.facebook.fresco:animated-gif:2.5.0'
// For WebP support, including animated WebP
implementation 'com.facebook.fresco:animated-webp:2.5.0'
implementation 'com.facebook.fresco:webpsupport:2.5.0'
// For WebP support, without animations
implementation 'com.facebook.fresco:webpsupport:2.5.0'
}
你可以按照官方文档Link
我正在努力让我的 GIF 在我的 RN 应用程序的 Android 版本上进行动画处理。 iOS 版本按预期为循环 GIF 制作动画,但我在 Android 设备上只看到 GIF 卡住的“单帧”图像。
根据调试和 RN 文档,需要在 /android/app/build.[=72= 中的 dependencies
中添加几行 implementation
],但即使清理了 gradle(/android 文件夹中的 运行 ./gradlew clean
)并删除了RN 应用程序的缓存(运行 react-native start --reset-cache
在项目根文件夹中),我没有看到我的应用程序有任何区别。
我用谷歌搜索并尝试了很多。基于我的调试冒险,我已经尝试并仔细检查了这些建议,这似乎对其他人有用,但对我似乎不起作用...
- 我已经尝试了几个版本的 fresco-libraries,它们似乎
是必需的,我也尝试将这些线放在
dependencies
. 的底部和顶部
- 部分回答还建议增加一行或多行代码 android/app/proguard-rules.pro 但这并没有改变 任何东西。
- 我在我的应用程序中以不同的方式使用 GIF,但它总是
width
和height
包含在<Image />
上style
属性。 - 我尝试过使用来自不同 CDN 和域的 GIF-uris。
- 在我的测试设备上重新安装了该应用程序。
- 关闭并重新打开我的代码编辑器。
我使用的是以下版本:
- Java: 11.0.12
- React Native:0.65
- Android SDK: 30.0.2
- npm: 6.14.4
这是我的全/android/app/build.gradle:
apply plugin: "com.android.application"
import com.android.build.OutputFile
project.ext.react = [
enableHermes: false, // clean and rebuild if changing
]
apply from: "../../node_modules/react-native/react.gradle"
def enableSeparateBuildPerCPUArchitecture = false
def enableProguardInReleaseBuilds = false
def jscFlavor = 'org.webkit:android-jsc:+'
def enableHermes = project.ext.react.get("enableHermes", false);
android {
ndkVersion rootProject.ext.ndkVersion
compileSdkVersion rootProject.ext.compileSdkVersion
defaultConfig {
applicationId "com.example.app"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "1.0"
}
splits {
abi {
reset()
enable enableSeparateBuildPerCPUArchitecture
universalApk false // If true, also generate a universal APK
include "armeabi-v7a", "x86", "arm64-v8a", "x86_64"
}
}
signingConfigs {
debug {
storeFile file('debug.keystore')
storePassword 'android'
keyAlias 'androiddebugkey'
keyPassword 'android'
}
}
buildTypes {
debug {
signingConfig signingConfigs.debug
}
release {
// Caution! In production, you need to generate your own keystore file.
// see https://reactnative.dev/docs/signed-apk-android.
signingConfig signingConfigs.debug
minifyEnabled enableProguardInReleaseBuilds
proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
}
}
// applicationVariants are e.g. debug, release
applicationVariants.all { variant ->
variant.outputs.each { output ->
// For each separate APK per architecture, set a unique version code as described here:
// https://developer.android.com/studio/build/configure-apk-splits.html
// Example: versionCode 1 will generate 1001 for armeabi-v7a, 1002 for x86, etc.
def versionCodes = ["armeabi-v7a": 1, "x86": 2, "arm64-v8a": 3, "x86_64": 4]
def abi = output.getFilter(OutputFile.ABI)
if (abi != null) { // null for the universal-debug, universal-release variants
output.versionCodeOverride =
defaultConfig.versionCode * 1000 + versionCodes.get(abi)
}
}
}
}
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
//noinspection GradleDynamicVersion
implementation "com.facebook.react:react-native:+" // From node_modules
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") {
exclude group:'com.facebook.fbjni'
}
debugImplementation("com.facebook.flipper:flipper-network-plugin:${FLIPPER_VERSION}") {
exclude group:'com.facebook.flipper'
exclude group:'com.squareup.okhttp3', module:'okhttp'
}
debugImplementation("com.facebook.flipper:flipper-fresco-plugin:${FLIPPER_VERSION}") {
exclude group:'com.facebook.flipper'
}
if (enableHermes) {
def hermesPath = "../../node_modules/hermes-engine/android/";
debugImplementation files(hermesPath + "hermes-debug.aar")
releaseImplementation files(hermesPath + "hermes-release.aar")
} else {
implementation jscFlavor
}
implementation project(':react-native-notifications')
implementation 'com.google.firebase:firebase-core:16.0.0'
implementation 'com.google.android.gms:play-services-ads:19.8.0'
implementation "androidx.appcompat:appcompat:1.0.0"
implementation 'com.facebook.fresco:fresco:2.4.0'
implementation 'com.facebook.fresco:animated-gif:2.4.0'
implementation 'com.facebook.fresco:webpsupport:2.4.0'
}
// Run this once to be able to run the application with BUCK
// puts all compile dependencies into folder libs for BUCK to use
task copyDownloadableDepsToLibs(type: Copy) {
from configurations.compile
into 'libs'
}
apply plugin: 'com.google.gms.google-services'
apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
如果我错过了一些明显的事情,请告诉我。我在 iOS- 开发方面肯定更有经验,所以我很可能错过了一些东西:-)
添加android/app/build.gradle
// For animated GIF support
compile 'com.facebook.fresco:animated-gif:1.+'
更简单的解决方法是使用 FastImage 库,它内置了 Gif 支持,并具有缓存等附加优势
我自己在 android 上遇到了 GIF 的问题,最终转向了 google 似乎接受甚至拥有自己的转换工具的动画 webp。他们 android 多年来一直支持它,而且似乎工作得更加稳定。甚至可以通过将扩展名更改为 webp 而不是 PNG 来工作?
我在使用 react-native 0.66.3 时遇到了同样的问题,在 app/build.gradle
中将 com.facebook.fresco:animated-gif
更新为 2.6.0
对我有用
Android
支持 GIF 和 WebP构建您自己的本机代码时,Android 默认不支持 GIF 和 WebP。
您需要在 android/app/build.gradle 中添加一些可选模块,具体取决于您的应用程序的需要。
dependencies {
// If your app supports Android versions before Ice Cream Sandwich (API level 14)
implementation 'com.facebook.fresco:animated-base-support:1.3.0'
// For animated GIF support
implementation 'com.facebook.fresco:animated-gif:2.5.0'
// For WebP support, including animated WebP
implementation 'com.facebook.fresco:animated-webp:2.5.0'
implementation 'com.facebook.fresco:webpsupport:2.5.0'
// For WebP support, without animations
implementation 'com.facebook.fresco:webpsupport:2.5.0'
}
你可以按照官方文档Link