扩展Drawable类(使用ProxyDrawable示例)

时间:2013-09-12 09:31:39

标签: android android-drawable

概述:我正在尝试创建一个扩展Drawable的类。我的测试应用程序不像我期望的那样。当我期待应该的时候,没有图像填满屏幕。

详细信息:我试图了解如何创建自定义Drawables,将其他Drawables作为参数并根据需要进行操作。我已经阅读了并且通常理解了明显的现有示例(如LayerDrawable和LevelListDrawable)的源代码,然后我在ProxyDrawable类中遇到了这个概念的非常剥离的版本。

据我所知,基本上是这样;

  • 覆盖Drawable的getter,将Drawable的属性作为自己的构造函数传递给它。
  • 覆盖Drawable的setter,将属性传递给传入的Drawable。
  • 调用传入的Drawable自己的draw()方法将其绘制到ProxyDrawable的画布上。

我尝试在一个简单的测试应用中实现这一点,如下面的代码所示。

在我的activity_main.xml中,FrameLayout frame1的宽度和高度都设置为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;
        }
    }

}

0 个答案:

没有答案