Android 扩展可绘制类(使用ProxyDrawable示例)
概述:我正在尝试创建一个扩展Drawable的类。我的测试应用程序的行为不符合我的预期。我认为屏幕上应该没有图像 详细信息:我试图了解如何创建自定义绘图,将其他绘图作为参数,并根据需要对其进行操作。我已经通读并大致理解了LayerDrawable和LevelListDrawable等现有示例的源代码,然后在课堂上遇到了这个概念的一个非常精简的版本 据我了解,基本上,Android 扩展可绘制类(使用ProxyDrawable示例),android,android-drawable,Android,Android Drawable,概述:我正在尝试创建一个扩展Drawable的类。我的测试应用程序的行为不符合我的预期。我认为屏幕上应该没有图像 详细信息:我试图了解如何创建自定义绘图,将其他绘图作为参数,并根据需要对其进行操作。我已经通读并大致理解了LayerDrawable和LevelListDrawable等现有示例的源代码,然后在课堂上遇到了这个概念的一个非常精简的版本 据我了解,基本上, 重写Drawable的getter,以将传递给其构造函数的Drawable的属性作为自己的属性 重写Drawable的sette
- 重写Drawable的getter,以将传递给其构造函数的Drawable的属性作为自己的属性
- 重写Drawable的setter以将属性向下传递给传入的Drawable
- 调用传入的Drawable自己的draw()方法将其绘制到ProxyDrawable的画布
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;
}
}
}
试图覆盖onBoundsChange@pskink我覆盖了onBoundsChange添加
mProxy.setBounds(边界)代码>成功了。非常感谢。我一直在思考为什么在收到你的帖子后的最后一个小时里这是必要的,但灯泡就是不亮。为什么在我的新类“draw()方法”中调用传入对象的draw()方法还不够?我真的很想理解,因为我知道不这样做只会导致我的代码不好。我认为你应该保留符号并调用mProxy.onBoundsChange,它现在起作用的原因是Drawable在默认情况下有空的大小/边界,尽量不要覆盖onBoundsChange并尝试调试mProxy.draw,您将看到空mPeoxy是如何绘制的itself@pskink. 我现在明白了。创建新类对象时,其边界为空。当它第一次绘制时,它的边界会改变以填充屏幕,这会调用onBoundsChange(),以便我可以将其传递给mProxy。明亮的非常感谢。