android:load 来自网络的 svg 文件并在图像视图中显示
android:load svg file from web and show it on image view
我想从网络加载一个 svg 文件并在 ImageView 中显示该文件。对于非矢量图像,我使用 Picasso 库。
是否也可以将此库用于 svg 文件?
有什么方法可以从网络加载 svg 文件并在 ImageView 中显示它?
我使用 svg-android 库来显示 svg 文件,但我不知道如何从网上获取 svg 图像,该库的所有示例都使用本地文件。
请参考Having issue on Real Device using vector image in android. SVG-android
在用户 post 中,他提出了类似的问题并建议他使用:
在布局文件中为 ImageView 创建一个成员变量;
private ImageView mImageView;
// intialize in onCreate(Bundle savedInstanceState)
mImageView = (ImageView) findViewById(R.id.image_view);
下载图片
private class HttpImageRequestTask extends AsyncTask<Void, Void, Drawable> {
@Override
protected Drawable doInBackground(Void... params) {
try {
final URL url = new URL("http://upload.wikimedia.org/wikipedia/commons/e/e8/Svg_example3.svg");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = urlConnection.getInputStream();
SVG svg = SVGParser. getSVGFromInputStream(inputStream);
Drawable drawable = svg.createPictureDrawable();
return drawable;
} catch (Exception e) {
Log.e("MainActivity", e.getMessage(), e);
}
return null;
}
@Override
protected void onPostExecute(Drawable drawable) {
// Update the view
updateImageView(drawable);
}
}
然后将可绘制对象应用到 Imageview
@SuppressLint("NewApi")
private void updateImageView(Drawable drawable){
if(drawable != null){
// Try using your library and adding this layer type before switching your SVG parsing
mImageView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
mImageView.setImageDrawable(drawable);
}
}
SVGParser 在 https://github.com/pents90/svg-android
可用
更新:对于较新的版本,请查看 Glide 示例
(https://github.com/bumptech/glide/tree/master/samples/svg)
-
您可以使用 Glide (https://github.com/bumptech/glide/tree/v3.6.0) and AndroidSVG (https://bitbucket.org/paullebeau/androidsvg)。
还有一个来自 Glide 的示例:https://github.com/bumptech/glide/tree/v3.6.0/samples/svg/src/main/java/com/bumptech/svgsample/app
设置 GenericRequestBuilder
requestBuilder = Glide.with(mActivity)
.using(Glide.buildStreamModelLoader(Uri.class, mActivity), InputStream.class)
.from(Uri.class)
.as(SVG.class)
.transcode(new SvgDrawableTranscoder(), PictureDrawable.class)
.sourceEncoder(new StreamEncoder())
.cacheDecoder(new FileToStreamDecoder<SVG>(new SvgDecoder()))
.decoder(new SvgDecoder())
.placeholder(R.drawable.ic_facebook)
.error(R.drawable.ic_web)
.animate(android.R.anim.fade_in)
.listener(new SvgSoftwareLayerSetter<Uri>());
通过 uri 使用 RequestBuilder
Uri uri = Uri.parse("https://de.wikipedia.org/wiki/Scalable_Vector_Graphics#/media/File:SVG_logo.svg");
requestBuilder
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
// SVG cannot be serialized so it's not worth to cache it
.load(uri)
.into(mImageView);
使用这个Glide based library
加载xml
添加依赖
compile 'com.github.ar-android:AndroidSvgLoader:1.0.0'
对于最新的 android 依赖项 Gradle 改用它
implementation 'com.github.ar-android:AndroidSvgLoader:1.0.0'
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/ivimage"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list_item);
ImageView image = (ImageView) findViewById(R.id.ivimage);
SvgLoader.pluck()
.with(this)
.setPlaceHolder(R.mipmap.ic_launcher, R.mipmap.ic_launcher)
.load("http://www.clker.com/cliparts/u/Z/2/b/a/6/android-toy-h.svg", image);
}
@Override protected void onDestroy() {
super.onDestroy();
SvgLoader.pluck().close();
}
}
你可以使用这个库
https://github.com/2coffees1team/GlideToVectorYou
正如他所说:"The library is based on Glide and offers the same functionalities + svg support"。
希望下面的代码对你有用。
在build.gradle
中添加这个依赖
implementation 'com.github.corouteam:GlideToVectorYou:v2.0.0'
现在开始工作 MainActivity.java
ImageView image = (ImageView) findViewById(R.id.ivimage);
String url= https://your_url/banking.svg
GlideToVectorYou.init().with(this).load(Uri.parse(url),image);
Kotlin 和 Coil 库从 URL:
加载 SVG
- 添加Kotlin图片加载库build.gradle(模块:app)(也支持其他图片):
Gradle:
implementation 'io.coil-kt:coil:1.4.0'
implementation 'io.coil-kt:coil-svg:1.4.0'
或
节:
implementation("io.coil-kt:coil:1.4.0")
implementation("io.coil-kt:coil-svg:1.4.0")
- 将以下扩展函数添加到您项目的任何 Kotlin 文件中,
(在 class 之外而不是 class 之内):
这里我在xml中使用了AppCompatImageView,如果你只使用ImageView,用下面函数中的ImageView替换AppCompatImageView。
fun AppCompatImageView.loadSvgOrOther(myUrl: String?, cache: Boolean = true, errorImg: Int = R.drawable.logo_round // Place any error image from your drawable) {
myUrl?.let {
if (it.lowercase().endsWith("svg")) {
val imageLoader = ImageLoader.Builder(this.context)
.componentRegistry {
add(SvgDecoder(this@loadSvgOrOther.context))
}.build()
val request = ImageRequest.Builder(this.context).apply {
error(errorImg)
placeholder(errorImg)
data(it).decoder(SvgDecoder(this@loadSvgOrOther.context))
}.target(this).build()
imageLoader.enqueue(request)
} else {
val imageLoader = ImageLoader(context)
val request = ImageRequest.Builder(context).apply {
if (cache) {
memoryCachePolicy(CachePolicy.ENABLED)
} else {
memoryCachePolicy(CachePolicy.DISABLED)
}
error(errorImg)
placeholder(errorImg)
data("$it")
}.target(this).build()
imageLoader.enqueue(request)
}
}
} // loadSvgOrOther
现在像下面这样使用:
myAppCompatImageView.loadSvgOrOther("https[:]//example[.]com/image.svg")
希望这对想要使用 Kotlin 加载 svg、png、jpg 等图像的人有所帮助。
Load SVG using Glide V4 or above
Add dependencies in app.gradle > dependencies
implementation 'com.github.qoqa:glide-svg:2.0.4'
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
Make new class SampleAppGlideModule.java and go to Build>Make Project(ctrl+f9)
import android.content.Context;
import android.util.Log;
import androidx.annotation.NonNull;
import com.bumptech.glide.GlideBuilder;
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.module.AppGlideModule;
@GlideModule
public class SampleAppGlideModule extends AppGlideModule {
@Override
public boolean isManifestParsingEnabled() {
return super.isManifestParsingEnabled();
}
@Override
public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) {
super.applyOptions(context, builder);
builder.setLogLevel(Log.DEBUG);
}
}
Load SVG using Glide V4 or above
GlideApp.with(this)
.load(contentLangModels.get(i).getContentImage()).into(contentLangBinding.ivExtra);
可以使用Coil Image加载库,
将以下依赖项添加到您的应用级别 build.gradle 文件,
def coilVersion = '1.2.2'
implementation "io.coil-kt:coil:$coilVersion"
implementation "io.coil-kt:coil-svg:$coilVersion"
现在创建这个方法,
fun ImageView.loadImageFromUrl(imageUrl: String) {
val imageLoader = ImageLoader.Builder(this.context)
.componentRegistry { add(SvgDecoder(this@loadImageFromUrl.context))
}
.build()
val imageRequest = ImageRequest.Builder(this.context)
.crossfade(true)
.crossfade(300)
.data(imageUrl)
.target(
onStart = {
//set up an image loader or whatever you need
},
onSuccess = { result ->
val bitmap = (result as BitmapDrawable).bitmap
this.setImageBitmap(bitmap)
//dismiss the loader if any
},
onError = {
/**
* TODO: set an error drawable
*/
}
)
.build()
imageLoader.enqueue(imageRequest)
}
现在您可以从 ImageView 调用此扩展函数,
imgView.loadImage(imageUrl)
这适用于 svg、png。我没有尝试过使用 jpgs,但应该也可以使用它们。
我想从网络加载一个 svg 文件并在 ImageView 中显示该文件。对于非矢量图像,我使用 Picasso 库。
是否也可以将此库用于 svg 文件?
有什么方法可以从网络加载 svg 文件并在 ImageView 中显示它?
我使用 svg-android 库来显示 svg 文件,但我不知道如何从网上获取 svg 图像,该库的所有示例都使用本地文件。
请参考Having issue on Real Device using vector image in android. SVG-android
在用户 post 中,他提出了类似的问题并建议他使用:
在布局文件中为 ImageView 创建一个成员变量;
private ImageView mImageView;
// intialize in onCreate(Bundle savedInstanceState)
mImageView = (ImageView) findViewById(R.id.image_view);
下载图片
private class HttpImageRequestTask extends AsyncTask<Void, Void, Drawable> {
@Override
protected Drawable doInBackground(Void... params) {
try {
final URL url = new URL("http://upload.wikimedia.org/wikipedia/commons/e/e8/Svg_example3.svg");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
InputStream inputStream = urlConnection.getInputStream();
SVG svg = SVGParser. getSVGFromInputStream(inputStream);
Drawable drawable = svg.createPictureDrawable();
return drawable;
} catch (Exception e) {
Log.e("MainActivity", e.getMessage(), e);
}
return null;
}
@Override
protected void onPostExecute(Drawable drawable) {
// Update the view
updateImageView(drawable);
}
}
然后将可绘制对象应用到 Imageview
@SuppressLint("NewApi")
private void updateImageView(Drawable drawable){
if(drawable != null){
// Try using your library and adding this layer type before switching your SVG parsing
mImageView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
mImageView.setImageDrawable(drawable);
}
}
SVGParser 在 https://github.com/pents90/svg-android
可用更新:对于较新的版本,请查看 Glide 示例 (https://github.com/bumptech/glide/tree/master/samples/svg)
-
您可以使用 Glide (https://github.com/bumptech/glide/tree/v3.6.0) and AndroidSVG (https://bitbucket.org/paullebeau/androidsvg)。
还有一个来自 Glide 的示例:https://github.com/bumptech/glide/tree/v3.6.0/samples/svg/src/main/java/com/bumptech/svgsample/app
设置 GenericRequestBuilder
requestBuilder = Glide.with(mActivity)
.using(Glide.buildStreamModelLoader(Uri.class, mActivity), InputStream.class)
.from(Uri.class)
.as(SVG.class)
.transcode(new SvgDrawableTranscoder(), PictureDrawable.class)
.sourceEncoder(new StreamEncoder())
.cacheDecoder(new FileToStreamDecoder<SVG>(new SvgDecoder()))
.decoder(new SvgDecoder())
.placeholder(R.drawable.ic_facebook)
.error(R.drawable.ic_web)
.animate(android.R.anim.fade_in)
.listener(new SvgSoftwareLayerSetter<Uri>());
通过 uri 使用 RequestBuilder
Uri uri = Uri.parse("https://de.wikipedia.org/wiki/Scalable_Vector_Graphics#/media/File:SVG_logo.svg");
requestBuilder
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
// SVG cannot be serialized so it's not worth to cache it
.load(uri)
.into(mImageView);
使用这个Glide based library
加载xml
添加依赖
compile 'com.github.ar-android:AndroidSvgLoader:1.0.0'
对于最新的 android 依赖项 Gradle 改用它
implementation 'com.github.ar-android:AndroidSvgLoader:1.0.0'
main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<ImageView
android:id="@+id/ivimage"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list_item);
ImageView image = (ImageView) findViewById(R.id.ivimage);
SvgLoader.pluck()
.with(this)
.setPlaceHolder(R.mipmap.ic_launcher, R.mipmap.ic_launcher)
.load("http://www.clker.com/cliparts/u/Z/2/b/a/6/android-toy-h.svg", image);
}
@Override protected void onDestroy() {
super.onDestroy();
SvgLoader.pluck().close();
}
}
你可以使用这个库
https://github.com/2coffees1team/GlideToVectorYou
正如他所说:"The library is based on Glide and offers the same functionalities + svg support"。
希望下面的代码对你有用。
在build.gradle
中添加这个依赖implementation 'com.github.corouteam:GlideToVectorYou:v2.0.0'
现在开始工作 MainActivity.java
ImageView image = (ImageView) findViewById(R.id.ivimage);
String url= https://your_url/banking.svg
GlideToVectorYou.init().with(this).load(Uri.parse(url),image);
Kotlin 和 Coil 库从 URL:
加载 SVG- 添加Kotlin图片加载库build.gradle(模块:app)(也支持其他图片):
Gradle:
implementation 'io.coil-kt:coil:1.4.0'
implementation 'io.coil-kt:coil-svg:1.4.0'
或
节:
implementation("io.coil-kt:coil:1.4.0")
implementation("io.coil-kt:coil-svg:1.4.0")
- 将以下扩展函数添加到您项目的任何 Kotlin 文件中, (在 class 之外而不是 class 之内):
这里我在xml中使用了AppCompatImageView,如果你只使用ImageView,用下面函数中的ImageView替换AppCompatImageView。
fun AppCompatImageView.loadSvgOrOther(myUrl: String?, cache: Boolean = true, errorImg: Int = R.drawable.logo_round // Place any error image from your drawable) {
myUrl?.let {
if (it.lowercase().endsWith("svg")) {
val imageLoader = ImageLoader.Builder(this.context)
.componentRegistry {
add(SvgDecoder(this@loadSvgOrOther.context))
}.build()
val request = ImageRequest.Builder(this.context).apply {
error(errorImg)
placeholder(errorImg)
data(it).decoder(SvgDecoder(this@loadSvgOrOther.context))
}.target(this).build()
imageLoader.enqueue(request)
} else {
val imageLoader = ImageLoader(context)
val request = ImageRequest.Builder(context).apply {
if (cache) {
memoryCachePolicy(CachePolicy.ENABLED)
} else {
memoryCachePolicy(CachePolicy.DISABLED)
}
error(errorImg)
placeholder(errorImg)
data("$it")
}.target(this).build()
imageLoader.enqueue(request)
}
}
} // loadSvgOrOther
现在像下面这样使用:
myAppCompatImageView.loadSvgOrOther("https[:]//example[.]com/image.svg")
希望这对想要使用 Kotlin 加载 svg、png、jpg 等图像的人有所帮助。
Load SVG using Glide V4 or above
Add dependencies in app.gradle > dependencies
implementation 'com.github.qoqa:glide-svg:2.0.4'
implementation 'com.github.bumptech.glide:glide:4.11.0'
annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0'
Make new class SampleAppGlideModule.java and go to Build>Make Project(ctrl+f9)
import android.content.Context;
import android.util.Log;
import androidx.annotation.NonNull;
import com.bumptech.glide.GlideBuilder;
import com.bumptech.glide.annotation.GlideModule;
import com.bumptech.glide.module.AppGlideModule;
@GlideModule
public class SampleAppGlideModule extends AppGlideModule {
@Override
public boolean isManifestParsingEnabled() {
return super.isManifestParsingEnabled();
}
@Override
public void applyOptions(@NonNull Context context, @NonNull GlideBuilder builder) {
super.applyOptions(context, builder);
builder.setLogLevel(Log.DEBUG);
}
}
Load SVG using Glide V4 or above
GlideApp.with(this)
.load(contentLangModels.get(i).getContentImage()).into(contentLangBinding.ivExtra);
可以使用Coil Image加载库,
将以下依赖项添加到您的应用级别 build.gradle 文件,
def coilVersion = '1.2.2'
implementation "io.coil-kt:coil:$coilVersion"
implementation "io.coil-kt:coil-svg:$coilVersion"
现在创建这个方法,
fun ImageView.loadImageFromUrl(imageUrl: String) {
val imageLoader = ImageLoader.Builder(this.context)
.componentRegistry { add(SvgDecoder(this@loadImageFromUrl.context))
}
.build()
val imageRequest = ImageRequest.Builder(this.context)
.crossfade(true)
.crossfade(300)
.data(imageUrl)
.target(
onStart = {
//set up an image loader or whatever you need
},
onSuccess = { result ->
val bitmap = (result as BitmapDrawable).bitmap
this.setImageBitmap(bitmap)
//dismiss the loader if any
},
onError = {
/**
* TODO: set an error drawable
*/
}
)
.build()
imageLoader.enqueue(imageRequest)
}
现在您可以从 ImageView 调用此扩展函数,
imgView.loadImage(imageUrl)
这适用于 svg、png。我没有尝试过使用 jpgs,但应该也可以使用它们。