/* * Copyright 2017 GcsSloop * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * Last modified 2017-03-31 14:20:42 * * GitHub: https://github.com/GcsSloop * Website: http://www.gcssloop.com * Weibo: http://weibo.com/GcsSloop */ package com.gcssloop.diycode.base.glide; import android.content.Context; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.text.Html; import android.view.View; import android.widget.TextView; import com.bumptech.glide.Glide; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.load.resource.drawable.GlideDrawable; import com.bumptech.glide.request.Request; import com.bumptech.glide.request.animation.GlideAnimation; import com.bumptech.glide.request.target.ViewTarget; import com.gcssloop.diycode.R; import com.gcssloop.diycode_sdk.log.Logger; import java.util.HashSet; import java.util.Set; /** * 用 Glide 加载图片,并在 TextView 中显示 */ public final class GlideImageGetter implements Html.ImageGetter, Drawable.Callback { private final Context mContext; private final TextView mTextView; private final Set<ImageGetterViewTarget> mTargets; public static GlideImageGetter get(View view) { return (GlideImageGetter) view.getTag(R.id.drawable_callback_tag); } public void clear() { GlideImageGetter prev = get(mTextView); if (prev == null) return; for (ImageGetterViewTarget target : prev.mTargets) { Glide.clear(target); } } public GlideImageGetter(Context context, TextView textView) { this.mContext = context; this.mTextView = textView; clear(); mTargets = new HashSet<>(); mTextView.setTag(R.id.drawable_callback_tag, this); } @Override public Drawable getDrawable(String url) { final UrlDrawable urlDrawable = new UrlDrawable(); Logger.i("Downloading from: " + url); Glide.with(mContext) .load(url) .diskCacheStrategy(DiskCacheStrategy.ALL) .into(new ImageGetterViewTarget(mTextView, urlDrawable)); return urlDrawable; } @Override public void invalidateDrawable(Drawable who) { mTextView.invalidate(); } @Override public void scheduleDrawable(Drawable who, Runnable what, long when) { } @Override public void unscheduleDrawable(Drawable who, Runnable what) { } private class ImageGetterViewTarget extends ViewTarget<TextView, GlideDrawable> { private final UrlDrawable mDrawable; private ImageGetterViewTarget(TextView view, UrlDrawable drawable) { super(view); mTargets.add(this); this.mDrawable = drawable; } @Override public void onResourceReady(GlideDrawable resource, GlideAnimation<? super GlideDrawable> glideAnimation) { Rect rect; if (resource.getIntrinsicWidth() > 100) { float width; float height; Logger.i("Image width is " + resource.getIntrinsicWidth()); Logger.i("View width is " + view.getWidth()); if (resource.getIntrinsicWidth() >= getView().getWidth()) { float downScale = (float) resource.getIntrinsicWidth() / getView().getWidth(); width = (float) resource.getIntrinsicWidth() / (float) downScale; height = (float) resource.getIntrinsicHeight() / (float) downScale; } else { float multiplier = (float) getView().getWidth() / resource.getIntrinsicWidth(); width = (float) resource.getIntrinsicWidth() * (float) multiplier; height = (float) resource.getIntrinsicHeight() * (float) multiplier; } Logger.i("New Image width is " + width); rect = new Rect(0, 0, Math.round(width), Math.round(height)); } else { rect = new Rect(0, 0, resource.getIntrinsicWidth() * 2, resource.getIntrinsicHeight() * 2); } resource.setBounds(rect); mDrawable.setBounds(rect); mDrawable.setDrawable(resource); if (resource.isAnimated()) { mDrawable.setCallback(get(getView())); resource.setLoopCount(GlideDrawable.LOOP_FOREVER); resource.start(); } getView().setText(getView().getText()); getView().invalidate(); } private Request request; @Override public Request getRequest() { return request; } @Override public void setRequest(Request request) { this.request = request; } } }