[英]Android - Glide 4.0.0-RC0: how to set tint color for ImageView after successfully loading SVG
我跟着這個樣本: 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 設置了顏色過濾器⇒ WORKING
我將 SVG 圖像(從 res/raw)加載到 imageViewSVG 和 setColorFilter for imageViewSVG ⇒ NOT WORKING(成功加載 SVG 文件但無法 setColorFilter)
請幫我設置 imageViewSVG 的色調顏色。
我嘗試像下面的代碼一樣進行編輯以制作生成 BitmapDrawable 的 SvgDrawableTranscoder(然后將 setColorFilter ),但它不起作用,幫幫我嗎?
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
反對renderToPicture()
在你的SvgDrawableTranscoder
。
RenderOptions renderOptions = RenderOptions.create().css("path { fill: red; }");
Picture picture = svg.renderToPicture(renderOptions);
...etc...
在這里我的方法工作正常
步驟 1使用 glide 將 svg 設置為 imageView(在我的情況下 it.menuItemIcon 是 ImageView 對象)
Glide.with(it.context).`as`(PictureDrawable::class.java).load(itemData.imageURL)
.addListener(object: RequestListener<PictureDrawable> {
override fun onLoadFailed(
e: GlideException?,
model: Any?,
target: Target<PictureDrawable>?,
isFirstResource: Boolean
): Boolean {
it.menuItemIcon.visibility = View.INVISIBLE
return false
}
override fun onResourceReady(
resource: PictureDrawable?,
model: Any?,
target: Target<PictureDrawable>?,
dataSource: DataSource?,
isFirstResource: Boolean
): Boolean {
it.menuItemIcon.visibility = View.VISIBLE
return false
}
})
.addListener(SvgSoftwareLayerListener()).into(it.menuItemIcon)
Step-2現在點擊按鈕調用這兩個方法
if(it.menuItemIcon.drawable!=null){
val bitmap = getBitMap(it.menuItemIcon)
setBitmapAndTint(bitmap,holder.itemView.context,it.menuItemIcon,itemData.isSelected)
}
Step-3實現 getBitMap() 從 ImageView 對象獲取 Bitmap
private fun getBitMap(view: AppCompatImageView): Bitmap {
val returnedBitmap = Bitmap.createBitmap(view.width, view.height, Bitmap.Config.ARGB_8888)
val canvas = Canvas(returnedBitmap)
val bgDrawable: Drawable = view.drawable
bgDrawable.draw(canvas)
view.draw(canvas)
return returnedBitmap
}
Step-4現在實現 setBitmapAndTint() 在 imageView 中設置位圖和 colorFilter(Tint)
private fun setBitmapAndTint(bitmap: Bitmap, context: Context, menuItemIcon: AppCompatImageView, selected: Boolean) {
menuItemIcon.setImageBitmap(bitmap)
menuItemIcon.setColorFilter(ContextCompat.getColor(context,R.color.ColorBlack))
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.