使用 Universal Images Loader 生成的图片无法缩放
Generated pictures with Universal Images Loader do not scale
我正在使用 android-svg 和 UniversalImageLoader 在自定义国际象棋组件中显示 svg 图片。虽然国际象棋组件是 ImageView 的子类,但我不能只使用
ImageLoader.getInstance().displayImage()
因为图片不填充ImageView,只填充一个cell,cell尺寸是在运行时计算的。
我试过使用方法 loadImage
ImageLoader.getInstance().loadImage("assets://svg/red_x_cross.svg",
new ImageSize(sizePx, sizePx), loadedCompleteListener);
但好像我没有传递 ImageSize 对象:所有图像都保持其原始大小。
配置过程如下:
DisplayImageOptions displayImageOptions = new DisplayImageOptions.Builder()
.imageScaleType(ImageScaleType.EXACTLY)
.cacheOnDisk(true)
.cacheInMemory(true)
.build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.memoryCacheSize(175 * 1024)
.diskCacheSize(175 * 1024)
.imageDecoder(new SvgDecoder())
.defaultDisplayImageOptions(displayImageOptions)
.build();
ImageLoader.getInstance().init(config);
这里是 SvgDecoder :
/**
* Utility class in order to configure Universal Image Loader library.
* Code from glide project sample
*/
public class SvgDecoder implements ImageDecoder {
@Override
public Bitmap decode(ImageDecodingInfo imageDecodingInfo) throws IOException {
InputStream is = imageDecodingInfo.getDownloader().getStream(
imageDecodingInfo.getImageUri(), imageDecodingInfo.getExtraForDownloader());
SVG svg;
try {
svg = SVG.getFromInputStream(is);
} catch (SVGParseException e) {
e.printStackTrace();
return null;
}
Picture picture = svg.renderToPicture();
PictureDrawable pictureDrawable = new PictureDrawable(picture);
// I think the problem is in this call parameters (getWidth/getHeight)
// but what must I write instead ?
Bitmap image = Bitmap.createBitmap(pictureDrawable.getIntrinsicWidth(),
pictureDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Canvas imageCanvas = new Canvas(image);
svg.renderToCanvas(imageCanvas);
return image;
}
}
我使用的所有 svg 文件都定义了一个视图框。
我认为问题出在我从 Glide 库示例中复制粘贴的 SvgDecoder,但我不知道应该写什么(我在哪里发表评论)。
当我说设置图像大小是 SvgDecoder class 的责任时,我的猜测是相当正确的。其实我必须
- 从 UIL
扩展了 BaseImageDecoder class
在构建位图后添加以下行(它将为我计算最终大小)
decodedBitmap = considerExactScaleAndOrientatiton(decodedBitmap, decodingInfo, 0, false);
我正在使用 android-svg 和 UniversalImageLoader 在自定义国际象棋组件中显示 svg 图片。虽然国际象棋组件是 ImageView 的子类,但我不能只使用
ImageLoader.getInstance().displayImage()
因为图片不填充ImageView,只填充一个cell,cell尺寸是在运行时计算的。
我试过使用方法 loadImage
ImageLoader.getInstance().loadImage("assets://svg/red_x_cross.svg",
new ImageSize(sizePx, sizePx), loadedCompleteListener);
但好像我没有传递 ImageSize 对象:所有图像都保持其原始大小。
配置过程如下:
DisplayImageOptions displayImageOptions = new DisplayImageOptions.Builder()
.imageScaleType(ImageScaleType.EXACTLY)
.cacheOnDisk(true)
.cacheInMemory(true)
.build();
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.memoryCacheSize(175 * 1024)
.diskCacheSize(175 * 1024)
.imageDecoder(new SvgDecoder())
.defaultDisplayImageOptions(displayImageOptions)
.build();
ImageLoader.getInstance().init(config);
这里是 SvgDecoder :
/**
* Utility class in order to configure Universal Image Loader library.
* Code from glide project sample
*/
public class SvgDecoder implements ImageDecoder {
@Override
public Bitmap decode(ImageDecodingInfo imageDecodingInfo) throws IOException {
InputStream is = imageDecodingInfo.getDownloader().getStream(
imageDecodingInfo.getImageUri(), imageDecodingInfo.getExtraForDownloader());
SVG svg;
try {
svg = SVG.getFromInputStream(is);
} catch (SVGParseException e) {
e.printStackTrace();
return null;
}
Picture picture = svg.renderToPicture();
PictureDrawable pictureDrawable = new PictureDrawable(picture);
// I think the problem is in this call parameters (getWidth/getHeight)
// but what must I write instead ?
Bitmap image = Bitmap.createBitmap(pictureDrawable.getIntrinsicWidth(),
pictureDrawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
Canvas imageCanvas = new Canvas(image);
svg.renderToCanvas(imageCanvas);
return image;
}
}
我使用的所有 svg 文件都定义了一个视图框。
我认为问题出在我从 Glide 库示例中复制粘贴的 SvgDecoder,但我不知道应该写什么(我在哪里发表评论)。
当我说设置图像大小是 SvgDecoder class 的责任时,我的猜测是相当正确的。其实我必须
- 从 UIL 扩展了 BaseImageDecoder class
在构建位图后添加以下行(它将为我计算最终大小)
decodedBitmap = considerExactScaleAndOrientatiton(decodedBitmap, decodingInfo, 0, false);