0

概要: Drawable を拡張するクラスを作ろうとしています。テスト アプリが期待どおりに動作しません。画面いっぱいに画像が表示されるはずなのに、画像が表示されません。

詳細:他の Drawables をパラメーターとして取り、必要に応じて操作するカスタム Drawables を作成する方法を理解しようとしています。LayerDrawable や LevelListDrawable などの明らかな既存の例のソース コードを読み、全体的に理解した後、ProxyDrawableクラスでこの概念の非常に簡素化されたバージョンに出くわしました。

私が理解しているように、基本的には;

  • Drawable のゲッターをオーバーライドして、コンストラクターに渡された 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