Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/206.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 扩展可绘制类(使用ProxyDrawable示例)_Android_Android Drawable - Fatal编程技术网

Android 扩展可绘制类(使用ProxyDrawable示例)

Android 扩展可绘制类(使用ProxyDrawable示例),android,android-drawable,Android,Android Drawable,概述:我正在尝试创建一个扩展Drawable的类。我的测试应用程序的行为不符合我的预期。我认为屏幕上应该没有图像 详细信息:我试图了解如何创建自定义绘图,将其他绘图作为参数,并根据需要对其进行操作。我已经通读并大致理解了LayerDrawable和LevelListDrawable等现有示例的源代码,然后在课堂上遇到了这个概念的一个非常精简的版本 据我了解,基本上, 重写Drawable的getter,以将传递给其构造函数的Drawable的属性作为自己的属性 重写Drawable的sette

概述:我正在尝试创建一个扩展Drawable的类。我的测试应用程序的行为不符合我的预期。我认为屏幕上应该没有图像

详细信息:我试图了解如何创建自定义绘图,将其他绘图作为参数,并根据需要对其进行操作。我已经通读并大致理解了LayerDrawable和LevelListDrawable等现有示例的源代码,然后在课堂上遇到了这个概念的一个非常精简的版本

据我了解,基本上,

  • 重写Drawable的getter,以将传递给其构造函数的Drawable的属性作为自己的属性
  • 重写Drawable的setter以将属性向下传递给传入的Drawable
  • 调用传入的Drawable自己的draw()方法将其绘制到ProxyDrawable的画布
我尝试在一个简单的测试应用程序中实现这一点,如下面的代码所示

FrameLayout frame1被设置为与my activity_main.xml中的\u父对象的宽度和高度相匹配,因此它占据了整个屏幕

但是,当我运行此测试应用程序时,ic_启动器图像不会出现在框架中

如代码注释中所述,如果我在设置帧背景时直接使用ic_启动器,则会显示图像。因此,问题必须在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;
        }
    }

}

试图覆盖onBoundsChange@pskink我覆盖了onBoundsChange添加
mProxy.setBounds(边界)成功了。非常感谢。我一直在思考为什么在收到你的帖子后的最后一个小时里这是必要的,但灯泡就是不亮。为什么在我的新类“draw()方法”中调用传入对象的draw()方法还不够?我真的很想理解,因为我知道不这样做只会导致我的代码不好。我认为你应该保留符号并调用mProxy.onBoundsChange,它现在起作用的原因是Drawable在默认情况下有空的大小/边界,尽量不要覆盖onBoundsChange并尝试调试mProxy.draw,您将看到空mPeoxy是如何绘制的itself@pskink. 我现在明白了。创建新类对象时,其边界为空。当它第一次绘制时,它的边界会改变以填充屏幕,这会调用onBoundsChange(),以便我可以将其传递给mProxy。明亮的非常感谢。