Мое приложение должно показывать набор изображений. Некоторые изображения являются встроенными, в то время как другие были добавлены пользователем. Я создал для этого класс с именем SymbolBox
(здесь я его упростил):
public class SymbolBox extends android.support.v7.widget.AppCompatImageView {
private FullSymbol mSymbol; // Symbol to show
private final Paint mPaint; // Paint variable to use
// Constructor initialises options and sets up the paint object
public SymbolBox(Context context, AttributeSet attrs) {
super(context, attrs);
mPaint = new Paint();
}
// Set the symbol
public void setSymbol(FullSymbol symbol) {
this.mSymbol = symbol;
}
// Draw the symbol
protected void onDraw(Canvas canvas) {
if(this.mSymbol == null) return;
String drawableUrl = mSymbol.getUrl();
if(drawableUrl != null) return; // Only use this to draw from base
// Get canvas size
float height = getHeight();
float width = getWidth();
// Draw the symbol
String drawableName = mSymbol.getBase();
Context context = getContext();
if((drawableName == null) || (drawableName.equals(""))) { drawableName = "blank"; }
Resources resources = context.getResources();
final int resourceId = resources.getIdentifier(drawableName,
"drawable",
context.getPackageName());
Drawable d;
if (resourceId != 0) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
d = resources.getDrawable(resourceId, context.getTheme());
} else {
d = resources.getDrawable(resourceId);
}
d.setBounds(0, 0, getWidth(), getHeight());
d.draw(canvas);
}
}
FullSymbol
определяется следующим образом:
public class FullSymbol {
private String name, base;
private String url;
// CONSTRUCTOR
public FullSymbol() {}
public String getBase() { return this.base; }
public String getName() { return name; }
public String getUrl() { return url; }
public void setBase(String newBase) { this.base = newBase; }
public void setName(String newName) { this.name = newName; }
public void setUrl(String newUrl) { this.url = newUrl; }
}
Каждый FullSymbol
может иметь либо base
, либо url
(если он не имеет ни того, ни другого, база будет установлена на «пусто»). base
является ссылкой на встроенное изображение; url
является ссылкой на онлайн-изображение (которое было загружено пользователем).
Во фрагменте, который вызывает все это, я устанавливаю SymbolBox
в макете, а затем использую Glide
для загрузки изображения в SymbolBox
(у меня возникают проблемы при загрузке загруженного изображения так что просто используйте фиксированный URL):
SymbolBox test = rootView.findViewById(R.id.testSymbol);
Glide.with(this).load("http://path/to/image").into(test);
Итак, если у FullSymbol есть URL-адрес, то изображение с этого URL-адреса должно быть загружено в SymbolBox с помощью Glide. Если у него нет URL-адреса, то следует использовать значение base, а изображение рисуется с помощью drawables.
Проблема, с которой я столкнулся, состоит в том, что часть Glide показывает что-либо, только если onDraw извлечен из класса SymbolBox (т.е. полностью закомментирован; если у меня просто пустая функция, она не работает). Но мне нужен onDraw, чтобы нарисовать изображение, если нет URL, и я использую базу.
Есть ли способ как-то игнорировать onDraw, если URL существует, но включить его иначе? Или другой способ рисования из базы - я могу создать функцию, но мне нужен доступ к Canvas. Как мне решить это? Спасибо.