4

カスタム UI ウィジェットに を使用しようとしていLayerDrawableて、1 つのレイヤーを他のレイヤーとは異なる境界で描画しようとしていますが、機能していないようです。基本的に、私のコードはこれを行います:

int left, top, right, bottom;
/*... do some math ... */
Drawable d = mDrawable.findDrawableByLayerId(R.id.some_specific_layer);
d.setBounds(left, top, right, bottom);

一方、xml は次のようになります。

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

<item>
    <shape android:shape="rectangle" >
        <solid android:color="#ff999999" />
    </shape>
</item>
<item
    android:id="@id/some_specific_layer"
    android:drawable="@drawable/some_drawable"/>

したがって、理想的には、境界計算の結果に応じて後ろから表示される灰色の量で、灰色の四角形の上に some_drawable が表示されます。しかし、灰色のレイヤーはまったく表示されません。これは、境界が何らかの形で設定されているためと思われます。

編集

これは、望ましい結果と期待される結果を視覚的に表したものです。 ここに画像の説明を入力

一番上の画像は私が達成したいものです。灰色は最初のレイヤーに対応し、グラデーションは定義済みの 2 番目のレイヤーに対応しidます。実際の結果は決して灰色を示しません。

LayerDrawable他のレイヤーに影響を与えずに、あるレイヤーの境界を設定できるかどうかは誰にもわかりませんか?

4

2 に答える 2

1

Android Developers Google Group からいくつかの回答がありました。基本的に、LayerDrawableすべての子の状態を管理するため、これを行う信頼できる方法はありませんDrawables。それ以来、代わりに 2 つの別個のドローアブルを使用するアプローチを採用しており、満足のいく結果が得られています。参照用のディスカッションスレッドは次のとおりです。

https://groups.google.com/d/topic/android-developers/fUxtJstdkBM/discussion

于 2012-07-31T21:19:56.057 に答える
0

LayerDrawable を使用して、このコードで同様のことを行うことができました。

// create first shape
ShapeDrawable shape1 = new ShapeDrawable(new OvalShape());
shape1.getPaint().setColor(0xFFFFFF00);
shape1.setIntrinsicWidth(50);
shape1.setIntrinsicHeight(50);
shape1.invalidateSelf();

// create second shape
ShapeDrawable shape2 = new ShapeDrawable(new OvalShape());
shape2.getPaint().setColor(0xFFFFB400);
shape2.setIntrinsicWidth(20);
shape2.setIntrinsicHeight(50);
shape2.invalidateSelf();

// create layerDrawable (layer-list in xml)
// it containt our 2 shapes and the order in wich they will be drawn (shape2 is on top).
LayerDrawable layerDrawable = new LayerDrawable(new Drawable[]{shape1, shape2});

// ajust position shape1 and shape2
layerDrawable.setLayerInset(0, 0,0,0,0);
layerDrawable.setLayerInset(1, 15,0,15,0);

結果は次のとおりです (黒の背景)。

于 2015-11-16T12:22:18.690 に答える