概述:我正在尝试创建一个扩展 Drawable 的类。我的测试应用程序的行为不像我预期的那样。没有图像填满屏幕,当我期望的时候。
详细信息:我试图了解如何创建将其他 Drawable 作为参数并根据需要操作它们的自定义 Drawable。我已经通读并大致理解了现有示例的源代码,例如 LayerDrawable 和 LevelListDrawable,然后我在ProxyDrawable类中遇到了这个概念的一个非常精简的版本。
据我了解,基本上是;
- 覆盖 Drawable 的 getter 以将传递给其构造函数的 Drawable 的属性作为它自己的属性。
- 覆盖 Drawable 的设置器以将属性向下传递给传入的 Drawable。
- 调用传入的 Drawable 自己的 draw() 方法将其绘制到 ProxyDrawable 的画布上。
我试图在一个简单的测试应用程序中实现这一点,如下面的代码所示。
FrameLayout frame1 在我的 activity_main.xml 中的宽度和高度都设置为 match_parent,因此它占据了全屏。
但是,当我运行此测试应用程序时,ic_launcher 图像不会出现在框架中。
如代码注释中所述,如果我在设置框架的背景时直接使用 ic_launcher,图像确实会出现。因此问题必须在 MyProxyDrawable 类中。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MyProxyDrawable myDrawable = new MyProxyDrawable(getResources().getDrawable(R.drawable.ic_launcher));
FrameLayout myFrame = (FrameLayout)findViewById(R.id.frame1);
myFrame.setBackground(myDrawable);
// ** NOTE **
// The ic_launcher image fills the whole screen if
// I replace the line above with the line below, so there
// is no problem with the resource or frame.
//myFrame.setBackground(getResources().getDrawable(R.drawable.ic_launcher));
}
public class MyProxyDrawable extends Drawable {
private Drawable mProxy;
private boolean mMutated;
public MyProxyDrawable(Drawable target) {
mProxy = target;
}
public Drawable getProxy() {
return mProxy;
}
public void setProxy(Drawable proxy) {
if (proxy != this) {
mProxy = proxy;
}
}
@Override
public void draw(Canvas canvas) {
if (mProxy != null) {
mProxy.draw(canvas);
}
}
@Override
public int getIntrinsicWidth() {
return mProxy != null ? mProxy.getIntrinsicWidth() : -1;
}
@Override
public int getIntrinsicHeight() {
return mProxy != null ? mProxy.getIntrinsicHeight() : -1;
}
@Override
public int getOpacity() {
return mProxy != null ? mProxy.getOpacity() : PixelFormat.TRANSPARENT;
}
@Override
public void setFilterBitmap(boolean filter) {
if (mProxy != null) {
mProxy.setFilterBitmap(filter);
}
}
@Override
public void setDither(boolean dither) {
if (mProxy != null) {
mProxy.setDither(dither);
}
}
@Override
public void setColorFilter(ColorFilter colorFilter) {
if (mProxy != null) {
mProxy.setColorFilter(colorFilter);
}
}
@Override
public void setAlpha(int alpha) {
if (mProxy != null) {
mProxy.setAlpha(alpha);
}
}
@Override
public Drawable mutate() {
if (mProxy != null && !mMutated && super.mutate() == this) {
mProxy.mutate();
mMutated = true;
}
return this;
}
}
}