0

概述:我正在尝试创建一个扩展 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;
        }
    }

}
4

0 回答 0