可以设置ImageView以便仅在某些情况下调用onDraw吗?

时间:2019-06-10 20:10:41

标签: imageview android-drawable android-glide ondraw

我的应用程序需要显示一组图像。一些图像是内置的,而其他图像已由用户添加。我为此创建了一个名为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是对在线图片的参考(已由用户上传)。

在调用所有这些内容的Fragment中,我正在布局中设置一个SymbolBox,然后使用Glide将图像加载到SymbolBox中(在下载上传的图片时遇到问题,因此现在仅使用固定的网址):

SymbolBox test = rootView.findViewById(R.id.testSymbol);
Glide.with(this).load("http://path/to/image").into(test);

因此,如果FullSymbol具有URL,则应使用Glide将位于该URL处的图像加载到SymbolBox中。如果没有网址,则应使用base的值,并使用可绘制对象绘制图像。

我遇到的问题是,如果onDraw从SymbolBox类中取出,则Glide部分仅显示任何内容(即完全注释掉;如果我只有一个空函数,则它不起作用)。但是,如果没有网址,并且我正在使用底座,则需要使用onDraw绘制图像。

是否可以通过某种方式忽略onDraw(如果该URL存在),否则包括它?或者是从基础绘制的另一种方式-我可以创建一个函数,但是我需要访问Canvas。我该如何解决?谢谢。

1 个答案:

答案 0 :(得分:0)

我设法解决了这个问题-我在super的{​​{1}}的{​​{1}}方法中添加了一个调用:

onDraw

它奏效了。