Android-Glide 4.0.0-RC0 : how to set tint color for ImageView after successfully loading SVG

标签 android svg android-glide tint

我遵循了这个示例:https://github.com/bumptech/glide/tree/master/samples/svg/src/main/java/com/bumptech/glide/samples/svg

使用 Glide 4.0.0-RC0 成功加载 SVG 文件后,我想为 ImageView 设置色调颜色,但 setColorFilter 不起作用

我的来源:

package com.example.quangson.glidesvg;

import static com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions.withCrossFade;

import android.content.ContentResolver;
import android.graphics.PorterDuff;
import android.graphics.drawable.PictureDrawable;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.ImageView;
import com.bumptech.glide.RequestBuilder;
import com.example.quangson.glidesvg.glide.GlideApp;
import com.example.quangson.glidesvg.glide.SvgSoftwareLayerSetter;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "SVGActivity";
    private ImageView imageViewSVG;
    private ImageView imageViewPNG;
    private RequestBuilder<PictureDrawable> requestBuilder;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageViewSVG = (ImageView) findViewById(R.id.svg_image_view1);
        imageViewPNG = (ImageView) findViewById(R.id.svg_image_view2);

        imageViewPNG.setImageResource(R.drawable.image_mylogo);

        requestBuilder = GlideApp.with(this)
                .as(PictureDrawable.class)
                .error(R.drawable.image_error)
                .transition(withCrossFade())
                .listener(new SvgSoftwareLayerSetter());
        Uri uri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + getPackageName() + "/"  + R.raw.android_toy_h);
        requestBuilder.load(uri).into(imageViewSVG);

        imageViewSVG.setColorFilter(getResources().getColor(R.color.colorAccent), PorterDuff.Mode.SRC_IN);
        imageViewPNG.setColorFilter(getResources().getColor(R.color.colorAccent), PorterDuff.Mode.SRC_IN);
    }
}

在我的来源中:

我将 PNG 图像(从 res/drawable)加载到 imageViewPNG 中,并为 imageViewPNG 设置ColorFilter ⇒ 正在工作

我将 SVG 图像(从 res/raw)加载到 imageViewSVG 中,并为 imageViewSVG 设置ColorFilter ⇒ 不起作用(已成功加载 SVG 文件,但无法设置ColorFilter)

请帮我设置 imageViewSVG 的色调颜色。


我尝试像下面的代码一样进行编辑,使 SvgDrawableTranscoder 生成 BitmapDrawable (并在之后设置ColorFilter),但它不起作用,帮帮我吗?

package com.sonzero.chibiz.glide;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Picture;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.PictureDrawable;

import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.resource.SimpleResource;
import com.bumptech.glide.load.resource.transcode.ResourceTranscoder;
import com.caverock.androidsvg.SVG;

/**
 * Convert the {@link SVG}'s internal representation to an Android-compatible one
 * ({@link Picture}).
 */
public class SvgDrawableTranscoder implements ResourceTranscoder<SVG, BitmapDrawable> {
    @Override
    public Resource<BitmapDrawable> transcode(Resource<SVG> toTranscode) {
        SVG svg = toTranscode.get();
        Picture picture = svg.renderToPicture();
        PictureDrawable drawable = new PictureDrawable(picture);
        Bitmap bitmap = asBitmap(drawable);
        BitmapDrawable mDrawable = new BitmapDrawable(bitmap);
        return new SimpleResource<BitmapDrawable>(mDrawable);
    }

    public Bitmap asBitmap(PictureDrawable pd) {
        Bitmap bitmap = Bitmap.createBitmap(pd.getIntrinsicWidth(),pd.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(bitmap);
        canvas.drawPicture(pd.getPicture());
        return bitmap;
    }
}

最佳答案

Glide SVG 加载器生成一个 PictureDrawable。上次我检查过,PictureDrawables 不支持 setColorFilter() 方法。

您可以尝试制作自己的 SvgDrawableTranscoder 版本,它会生成 BitmapDrawable 并使用 AndroidSVG 的 renderToCanvas() 进行绘制方法。

更新

AndroidSVG 1.4+ 现在支持在渲染时传递额外的 CSS。创建一个 RenderOptions 对象并使用 .css() 提供一些 CSS 规则。然后,您可以将该 RenderOptions 对象传递给 SvgDrawableTranscoder 中的 renderToPicture()

RenderOptions  renderOptions = RenderOptions.create().css("path { fill: red; }");
Picture picture = svg.renderToPicture(renderOptions);
...etc...

RenderOptions documentation

关于Android-Glide 4.0.0-RC0 : how to set tint color for ImageView after successfully loading SVG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44127316/

相关文章:

javascript - Snap.svg 确定沿路径的拖动距离

javascript - 如何从 SVG 路径字符串获取像素坐标

android - Glide - 在尝试加载照片时回退或错误后调用方法

java - 如果 url 更改,则 Glide 是否有任何选项,然后缓存将被清除,否则加载旧图像?

javascript - 反转 Canvas 上的路径

android - Proguard, Glide 3.6.1和Gradle 1.3.1错误

java - 升级 Android Studio NDK : CMAKE_C_COMPILER and CMAKE_CXX_COMPILER not set 后出错

android - Android取消静音不会切换为静音

Android:将数据传递给新的 Activity

android - 如何通过用户应用程序将日期设置为设备日历并在android中获取提醒?