在Android Studio中导入SVG文件

huangapple go评论185阅读模式
英文:

Import n svg file in Android Studio

问题

我尝试在Android Studio中导入svg文件,通过

新建 - 导入资源...

但似乎对svg没有完全的支持... 它会将文件转换为xml,但文本会消失

例如:

  1. ERROR @ line 27: <text> is not supported
  2. ERROR @ line 27: <tspan> is not supported

是否有其他方法可以实现这个目标?

编辑:
我现在尝试了...

  1. @OptIn(ExperimentalFoundationApi::class)
  2. @Composable
  3. fun Show_map(picName:String) {
  4. val mContext = LocalContext.current
  5. Canvas(modifier = Modifier.fillMaxSize()) {
  6. val svgString = loadSvgFromRaw(mContext, R.raw.nomap)
  7. val imageBitmap = convertSvgToImageBitmap(mContext,svgString!!)
  8. imageBitmap?.let {
  9. drawImage(
  10. image = it,
  11. topLeft = Offset.Zero,
  12. alpha = 1.0f
  13. )
  14. }
  15. }
  16. }
  17. fun loadSvgFromRaw(context: Context, resourceId: Int): String? {
  18. return try {
  19. val inputStream = context.resources.openRawResource(resourceId)
  20. val size = inputStream.available()
  21. val buffer = ByteArray(size)
  22. inputStream.read(buffer)
  23. inputStream.close()
  24. String(buffer, Charsets.UTF_8)
  25. } catch (e: Exception) {
  26. e.printStackTrace()
  27. null
  28. }
  29. }
  30. fun convertSvgToImageBitmap(context: Context,svgString: String): ImageBitmap {
  31. val svgString = loadSvgFromRaw(context, R.raw.nomap)
  32. val svg = SVG.getFromString(svgString)
  33. val targetWidth = 200
  34. val targetHeight = 200
  35. val requestOptions = RequestOptions()
  36. .override(targetWidth, targetHeight)
  37. .diskCacheStrategy(DiskCacheStrategy.NONE)
  38. .skipMemoryCache(true)
  39. val drawable = Glide.with(context)
  40. .`as`(Drawable::class.java)
  41. .load(svg)
  42. .transition(DrawableTransitionOptions.withCrossFade())
  43. .apply(requestOptions)
  44. .submit()
  45. .get()
  46. return (drawable as BitmapDrawable).bitmap.asImageBitmap()
  47. }

但在运行时的get()处出现了错误 - 您必须在后台线程上调用此方法 - 之前在Android Studio中没有显示错误

有什么想法吗?- 应用程序显示一个白色的Activity

英文:

I have tried to import svg files in Android Studio via

New - Import Asset ...

but it seems there is no fully support for svg ... it converts the file to xml but the text disappears

e.g.

  1. ERROR @ line 27: <text> is not supported
  2. ERROR @ line 27: <tspan> is not supported

Are there other ways to achieve the goal?

edit:
I have tried now ...

  1. @OptIn(ExperimentalFoundationApi::class)
  2. @Composable
  3. fun Show_map(picName:String) {
  4. val mContext = LocalContext.current
  5. Canvas(modifier = Modifier.fillMaxSize()) {
  6. val svgString = loadSvgFromRaw(mContext, R.raw.nomap)
  7. val imageBitmap = convertSvgToImageBitmap(mContext,svgString!!)
  8. imageBitmap?.let {
  9. drawImage(
  10. image = it,
  11. topLeft = Offset.Zero,
  12. alpha = 1.0f
  13. )
  14. }
  15. }
  16. }
  17. fun loadSvgFromRaw(context: Context, resourceId: Int): String? {
  18. return try {
  19. val inputStream = context.resources.openRawResource(resourceId)
  20. val size = inputStream.available()
  21. val buffer = ByteArray(size)
  22. inputStream.read(buffer)
  23. inputStream.close()
  24. String(buffer, Charsets.UTF_8)
  25. } catch (e: Exception) {
  26. e.printStackTrace()
  27. null
  28. }
  29. }
  30. fun convertSvgToImageBitmap(context: Context,svgString: String): ImageBitmap {
  31. val svgString = loadSvgFromRaw(context, R.raw.nomap)
  32. val svg = SVG.getFromString(svgString)
  33. val targetWidth = 200
  34. val targetHeight = 200
  35. val requestOptions = RequestOptions()
  36. .override(targetWidth, targetHeight)
  37. .diskCacheStrategy(DiskCacheStrategy.NONE)
  38. .skipMemoryCache(true)
  39. val drawable = Glide.with(context)
  40. .`as`(Drawable::class.java)
  41. .load(svg)
  42. .transition(DrawableTransitionOptions.withCrossFade())
  43. .apply(requestOptions)
  44. .submit()
  45. .get()
  46. return (drawable as BitmapDrawable).bitmap.asImageBitmap()
  47. }

But got an error at get() on runtime - You must call this method on a background thread - before shows Android Studio no error

Any ideas? - app shows a white Activity

答案1

得分: 1

使用 AndroidSVG 库:AndroidSVG 是一个库,允许您在 Android 中直接渲染 SVG 图像。您可以通过在您的应用程序的 build.gradle 文件中包含以下依赖项来将该库添加到您的项目中:

implementation 'com.caverock:androidsvg:1.4'

英文:

Use AndroidSVG library: AndroidSVG is a library that allows you to directly render SVG images in Android. You can add the library to your project by including the following dependency in your app's build.gradle file:

implementation 'com.caverock:androidsvg:1.4'

答案2

得分: 0

  1. // 以下是要翻译的内容:
  2. @OptIn(ExperimentalFoundationApi::class)
  3. @Composable
  4. fun Show_map(picName:String) {
  5. val mContext = LocalContext.current
  6. Canvas(modifier = Modifier.fillMaxSize()) {
  7. val svgString = loadSvgFromRaw(mContext, R.raw.nomap)
  8. GlobalScope.launch {
  9. val imageBitmap = convertSvgToImageBitmap(mContext,svgString!!)
  10. // SVG.registerExternalFileResolver()
  11. imageBitmap?.let {
  12. drawImage(
  13. image = it,
  14. topLeft = Offset.Zero,
  15. alpha = 1.0f
  16. )
  17. }
  18. }
  19. }
  20. }
  21. fun loadSvgFromRaw(context: Context, resourceId: Int): String? {
  22. return try {
  23. val inputStream = context.resources.openRawResource(resourceId)
  24. val size = inputStream.available()
  25. val buffer = ByteArray(size)
  26. inputStream.read(buffer)
  27. inputStream.close()
  28. String(buffer, Charsets.UTF_8)
  29. } catch (e: Exception) {
  30. e.printStackTrace()
  31. null
  32. }
  33. }
  34. suspend fun convertSvgToImageBitmap(context: Context,svgString: String): ImageBitmap {
  35. val svgString = loadSvgFromRaw(context, R.raw.nomap)
  36. val svg = SVG.getFromString(svgString)
  37. val targetWidth = 200
  38. val targetHeight = 200
  39. val requestOptions = RequestOptions()
  40. .override(targetWidth, targetHeight)
  41. .diskCacheStrategy(DiskCacheStrategy.NONE)
  42. .skipMemoryCache(true)
  43. val drawable = Glide.with(context)
  44. .`as`(Drawable::class.java)
  45. .load(svg)
  46. .transition(DrawableTransitionOptions.withCrossFade())
  47. .apply(requestOptions)
  48. .submit()
  49. .get()
  50. return (drawable as BitmapDrawable).bitmap.asImageBitmap()
  51. }
英文:
  1. @OptIn(ExperimentalFoundationApi::class)
  2. @Composable
  3. fun Show_map(picName:String) {
  4. val mContext = LocalContext.current
  5. Canvas(modifier = Modifier.fillMaxSize()) {
  6. val svgString = loadSvgFromRaw(mContext, R.raw.nomap)
  7. GlobalScope.launch {
  8. val imageBitmap = convertSvgToImageBitmap(mContext,svgString!!)
  9. // SVG.registerExternalFileResolver()
  10. imageBitmap?.let {
  11. drawImage(
  12. image = it,
  13. topLeft = Offset.Zero,
  14. alpha = 1.0f
  15. )
  16. }
  17. }
  18. }
  19. }
  20. fun loadSvgFromRaw(context: Context, resourceId: Int): String? {
  21. return try {
  22. val inputStream = context.resources.openRawResource(resourceId)
  23. val size = inputStream.available()
  24. val buffer = ByteArray(size)
  25. inputStream.read(buffer)
  26. inputStream.close()
  27. String(buffer, Charsets.UTF_8)
  28. } catch (e: Exception) {
  29. e.printStackTrace()
  30. null
  31. }
  32. }
  33. suspend fun convertSvgToImageBitmap(context: Context,svgString: String): ImageBitmap {
  34. val svgString = loadSvgFromRaw(context, R.raw.nomap)
  35. val svg = SVG.getFromString(svgString)
  36. val targetWidth = 200
  37. val targetHeight = 200
  38. val requestOptions = RequestOptions()
  39. .override(targetWidth, targetHeight)
  40. .diskCacheStrategy(DiskCacheStrategy.NONE)
  41. .skipMemoryCache(true)
  42. val drawable = Glide.with(context)
  43. .`as`(Drawable::class.java)
  44. .load(svg)
  45. .transition(DrawableTransitionOptions.withCrossFade())
  46. .apply(requestOptions)
  47. .submit()
  48. .get()
  49. return (drawable as BitmapDrawable).bitmap.asImageBitmap()
  50. }

I have changed the code it does not work anyway get an error

Failed to find any ModelLoaders registered for model class: class com.caverock.androidsvg.SVG

答案3

得分: 0

已尝试多次 - 太多的代码没有效果

更改为 Coil

  1. implementation("io.coil-kt:coil-compose:2.4.0")
  2. implementation("io.coil-kt:coil-svg:2.4.0")

@Composable
fun ImageExample() {
AsyncImage(
model = R.drawable.boing1,
contentDescription = "这是一个示例图像"
)
}

而且... - 与 svg 文件一起工作非常容易

另一个解决方法是在 Adobe Illustrator 中导出 svg 文件并设置对话框以将文本转换为轮廓

英文:

Tried several times - too much code for nothing

Changed to Coil

  1. implementation("io.coil-kt:coil-compose:2.4.0")
  2. implementation("io.coil-kt:coil-svg:2.4.0")
  3. @Composable
  4. fun ImageExample() {
  5. AsyncImage(
  6. model = R.drawable.boing1,
  7. contentDescription = "This is an example image"
  8. )

And ... - its working very easy with svg files

another workaround is to export svg files in Adobe Illustrator
and setting dialog to convert text to outline

huangapple
  • 本文由 发表于 2023年5月24日 20:00:39
  • 转载请务必保留本文链接:https://go.coder-hub.com/76323292.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定