我的应用程序需要显示一组图像。一些图像是内置的,而其他图像已由用户添加。我为此创建了一个名为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。我该如何解决?谢谢。
答案 0 :(得分:0)
我设法解决了这个问题-我在super
的{{1}}的{{1}}方法中添加了一个调用:
onDraw
它奏效了。