Можно ли настроить ImageView так, чтобы onDraw вызывался только в определенных случаях? - PullRequest
0 голосов
/ 10 июня 2019

Мое приложение должно показывать набор изображений. Некоторые изображения являются встроенными, в то время как другие были добавлены пользователем. Я создал для этого класс с именем 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. Как мне решить это? Спасибо.

1 Ответ

0 голосов
/ 11 июня 2019

Мне удалось решить эту проблему - я добавил вызов super метода onDraw в SymbolBox:

protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

   ... rest of the code stayed the same ...

}

и это сработало.

...