概要: 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;
}
}
}