Drawable詳細1
7172 ワード
Drawableには、オブジェクトを作成するための6つの静的メソッドと、ResourcesのgetDrawableメソッドがあります.getDrawableはよく使用されています.idを入力すればいいので、説明しません.
1.ローカルファイルのパスに基づいてDrawableオブジェクトを作成する
ここで返されるのは実質的にDrawableのサブクラスBitmapDrawableであり,ビットマップのみを解析できることがわかる.
2 Xmlファイルに基づいてDrawableオブジェクトを作成し、自分で属性を入力できる
xmlのラベルは、実際にはdrawableの実装サブクラスに対応しており、ラベルに基づいて特定のクラスを埋め込み、多重性の強い場所に適しています.また、AttributeSetパラメータが入力されているため、コードの中で属性を変更することができ、柔軟性が高く、次のパッケージよりも柔軟性があります.
3 Xmlファイルに基づいてDrawableオブジェクトを作成し、そのリソースをどこで呼び出しても同じ結果が表示されるはずです.プロパティは固定され、上記の方法のパッケージです.
4.ストリームに基づいてDrawableオブジェクトを作成し、Bitmapのパラメータオプションを入力
valueがリソースの属性を持つ
5.ストリームに基づいてDrawableオブジェクトを作成し、Bitmapのパラメータオブジェクトを転送しますが、bitmapのパラメータオプションを転送する必要はありません.上記の方法のパッケージです.
6.ストリームに基づいてDrawableオブジェクトを作成します.同様に4番目のメソッドのパッケージです.
1.ローカルファイルのパスに基づいてDrawableオブジェクトを作成する
public static Drawable createFromPath(String pathName) {
if (pathName == null) {
return null;
}
Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, pathName);
try {
Bitmap bm = BitmapFactory.decodeFile(pathName);
if (bm != null) {
return drawableFromBitmap(null, bm, null, null, null, pathName);
}
} finally {
Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);
}
return null;
}
ここで返されるのは実質的にDrawableのサブクラスBitmapDrawableであり,ビットマップのみを解析できることがわかる.
2 Xmlファイルに基づいてDrawableオブジェクトを作成し、自分で属性を入力できる
public static Drawable createFromXmlInner(Resources r, XmlPullParser parser, AttributeSet attrs)
throws XmlPullParserException, IOException {
Drawable drawable;
final String name = parser.getName();
if (name.equals("selector")) {
drawable = new StateListDrawable();
} else if (name.equals("level-list")) {
drawable = new LevelListDrawable();
} else if (name.equals("layer-list")) {
drawable = new LayerDrawable();
} else if (name.equals("transition")) {
drawable = new TransitionDrawable();
} else if (name.equals("color")) {
drawable = new ColorDrawable();
} else if (name.equals("shape")) {
drawable = new GradientDrawable();
} else if (name.equals("scale")) {
drawable = new ScaleDrawable();
} else if (name.equals("clip")) {
drawable = new ClipDrawable();
} else if (name.equals("rotate")) {
drawable = new RotateDrawable();
} else if (name.equals("animated-rotate")) {
drawable = new AnimatedRotateDrawable();
} else if (name.equals("animation-list")) {
drawable = new AnimationDrawable();
} else if (name.equals("inset")) {
drawable = new InsetDrawable();
} else if (name.equals("bitmap")) {
//noinspection deprecation
drawable = new BitmapDrawable(r);
if (r != null) {
((BitmapDrawable) drawable).setTargetDensity(r.getDisplayMetrics());
}
} else if (name.equals("nine-patch")) {
drawable = new NinePatchDrawable();
if (r != null) {
((NinePatchDrawable) drawable).setTargetDensity(r.getDisplayMetrics());
}
} else {
throw new XmlPullParserException(parser.getPositionDescription() +
": invalid drawable tag " + name);
}
drawable.inflate(r, parser, attrs);
return drawable;
}
xmlのラベルは、実際にはdrawableの実装サブクラスに対応しており、ラベルに基づいて特定のクラスを埋め込み、多重性の強い場所に適しています.また、AttributeSetパラメータが入力されているため、コードの中で属性を変更することができ、柔軟性が高く、次のパッケージよりも柔軟性があります.
3 Xmlファイルに基づいてDrawableオブジェクトを作成し、そのリソースをどこで呼び出しても同じ結果が表示されるはずです.プロパティは固定され、上記の方法のパッケージです.
public static Drawable createFromXml(Resources r, XmlPullParser parser)
throws XmlPullParserException, IOException {
AttributeSet attrs = Xml.asAttributeSet(parser);
int type;
while ((type=parser.next()) != XmlPullParser.START_TAG &&
type != XmlPullParser.END_DOCUMENT) {
// Empty loop
}
if (type != XmlPullParser.START_TAG) {
throw new XmlPullParserException("No start tag found");
}
Drawable drawable = createFromXmlInner(r, parser, attrs);
if (drawable == null) {
throw new RuntimeException("Unknown initial tag: " + parser.getName());
}
return drawable;
}
4.ストリームに基づいてDrawableオブジェクトを作成し、Bitmapのパラメータオプションを入力
public static Drawable createFromResourceStream(Resources res, TypedValue value,
InputStream is, String srcName, BitmapFactory.Options opts) {
if (is == null) {
return null;
}
/* ugh. The decodeStream contract is that we have already allocated
the pad rect, but if the bitmap does not had a ninepatch chunk,
then the pad will be ignored. If we could change this to lazily
alloc/assign the rect, we could avoid the GC churn of making new
Rects only to drop them on the floor.
*/
Rect pad = new Rect();
// Special stuff for compatibility mode: if the target density is not
// the same as the display density, but the resource -is- the same as
// the display density, then don't scale it down to the target density.
// This allows us to load the system's density-correct resources into
// an application in compatibility mode, without scaling those down
// to the compatibility density only to have them scaled back up when
// drawn to the screen.
if (opts == null) opts = new BitmapFactory.Options();
opts.inScreenDensity = res != null
? res.getDisplayMetrics().noncompatDensityDpi : DisplayMetrics.DENSITY_DEVICE;
Bitmap bm = BitmapFactory.decodeResourceStream(res, value, is, pad, opts);
if (bm != null) {
byte[] np = bm.getNinePatchChunk();
if (np == null || !NinePatch.isNinePatchChunk(np)) {
np = null;
pad = null;
}
int[] layoutBounds = bm.getLayoutBounds();
Rect layoutBoundsRect = null;
if (layoutBounds != null) {
layoutBoundsRect = new Rect(layoutBounds[0], layoutBounds[1],
layoutBounds[2], layoutBounds[3]);
}
return drawableFromBitmap(res, bm, np, pad, layoutBoundsRect, srcName);
}
return null;
}
valueがリソースの属性を持つ
5.ストリームに基づいてDrawableオブジェクトを作成し、Bitmapのパラメータオブジェクトを転送しますが、bitmapのパラメータオプションを転送する必要はありません.上記の方法のパッケージです.
public static Drawable createFromResourceStream(Resources res, TypedValue value,
InputStream is, String srcName) {
Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, srcName != null ? srcName : "Unknown drawable");
try {
return createFromResourceStream(res, value, is, srcName, null);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);
}
}
6.ストリームに基づいてDrawableオブジェクトを作成します.同様に4番目のメソッドのパッケージです.
public static Drawable createFromStream(InputStream is, String srcName) {
Trace.traceBegin(Trace.TRACE_TAG_RESOURCES, srcName != null ? srcName : "Unknown drawable");
try {
return createFromResourceStream(null, null, is, srcName, null);
} finally {
Trace.traceEnd(Trace.TRACE_TAG_RESOURCES);
}
}