私はこれに似た記事があることを知っていますが、どれにも私の答えが見つかりませんでした。だから、私はこの描画可能なXMLを持っています:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_enabled="true">
<bitmap
Android:src="@drawable/bm_btn_background"
Android:tileMode="repeat"
Android:gravity="center" />
</item>
<item Android:state_enabled="true">
<shape Android:shape="rectangle">
<gradient
Android:startColor="#a0e0b071"
Android:endColor="#a0a67637"
Android:angle="270" />
<stroke
Android:width="1dp"
Android:color="#5c3708" />
<corners
Android:radius="5dp" />
<padding
Android:left="10dp"
Android:top="10dp"
Android:right="10dp"
Android:bottom="10dp" />
</shape>
</item>
<item Android:state_pressed="true" >
<shape>
<gradient
Android:startColor="#a0a67637"
Android:endColor="#a0e0b071"
Android:angle="270" />
<stroke
Android:width="1dp"
Android:color="#5c3708" />
<corners
Android:radius="5dp" />
<padding
Android:left="10dp"
Android:top="10dp"
Android:right="10dp"
Android:bottom="10dp" />
</shape>
</item>
背景として繰り返される画像とそれに適用されたグラデーションを持つボタンを作成しようとしています。このコードでは、グラデーションや境界線、丸みを帯びた角ではなく、背景画像のみが表示されます。また、ボタンをクリックしても変化しません(グラデーションが変化するはずです)。このコードの何が問題なのかわかりませんか?セレクターの代わりにレイヤーリストを使用すると、目的の結果が得られますが、ボタンを押しても変化しません。ご協力いただきありがとうございます!
次の理由により、セレクターのコードが間違っています。
同じ状態の2つの要素があり、セレクターがBitmap
要素の最初の状態(state_enabled
)に遭遇すると、そこで停止し、グラデーションが表示されません(このため、アイテムとしてを持つlayer-list
を使用する必要がありますBitmap
と上部のグラデーション)
セレクタは状態を順番に照合します。 Button
を押すと、セレクターが最初の要素にあるstate_pressed
と最初に一致するため、state_enabled
がアクティブになることはありません(これには、state_pressed
のコードをstate_enabled要素の上に移動する必要があります)。
実際、state_enabled
を削除して、Bitmap
+ gradient
をButton
のデフォルト値にするだけです。ベローはあなたのセレクタです(私はあなたが画像のグラデーションを変更したいだけだと仮定しました(しかし、これが望まれる動作でない場合、画像は押された状態でも表示されるはずですstate_pressed
のグラデーションのみを残します)):
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_pressed="true">
<layer-list>
<item>
<bitmap Android:gravity="center" Android:src="@drawable/bm_btn_background" Android:tileMode="repeat" />
</item>
<item>
<shape>
<gradient Android:angle="270" Android:endColor="#a0e0b071" Android:startColor="#a0a67637" />
<stroke Android:width="1dp" Android:color="#5c3708" />
<corners Android:radius="5dp" />
<padding Android:bottom="10dp" Android:left="10dp" Android:right="10dp" Android:top="10dp" />
</shape>
</item>
</layer-list>
</item>
<item Android:state_enabled="true">
<layer-list>
<item>
<bitmap Android:gravity="center" Android:src="@drawable/bm_btn_background" Android:tileMode="repeat" />
</item>
<item>
<shape Android:shape="rectangle">
<gradient Android:angle="270" Android:endColor="#a0a67637" Android:startColor="#a0e0b071" />
<stroke Android:width="1dp" Android:color="#5c3708" />
<corners Android:radius="5dp" />
<padding Android:bottom="10dp" Android:left="10dp" Android:right="10dp" Android:top="10dp" />
</shape>
</item>
</layer-list>
</item>
</selector>
私の場合、これを使用しています。それを試してみてください
<item Android:state_pressed="true">
<shape>
<solid Android:color="@color/mediumGray" />
<stroke
Android:width="1px"
Android:color="@color/darkGray" />
<padding
Android:bottom="2dp"
Android:left="1dp"
Android:right="1dp"
Android:top="2dp" />
<corners
Android:bottomLeftRadius="7sp"
Android:bottomRightRadius="7sp"
Android:topLeftRadius="7sp"
Android:topRightRadius="7sp" />
</shape>
</item>
<item Android:state_focused="true">
<shape>
<solid Android:color="@color/mediumGray" />
<stroke
Android:width="1px"
Android:color="@color/darkGray" />
<padding
Android:bottom="2dp"
Android:left="1dp"
Android:right="1dp"
Android:top="2dp" />
<corners
Android:bottomLeftRadius="7sp"
Android:bottomRightRadius="7sp"
Android:topLeftRadius="7sp"
Android:topRightRadius="7sp" />
</shape>
</item>
<item>
<shape>
<solid Android:color="@color/lightGray" />
<stroke
Android:width="1px"
Android:color="@color/blackTransparent" />
<padding
Android:bottom="2dp"
Android:left="1dp"
Android:right="1dp"
Android:top="2dp" />
<corners
Android:bottomLeftRadius="7sp"
Android:bottomRightRadius="7sp"
Android:topLeftRadius="7sp"
Android:topRightRadius="7sp" />
</shape>
</item>
状態属性を確認してください
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<!-- Non focused states -->
<item Android:drawable="@drawable/nicebuttonround" Android:state_focused="false" Android:state_pressed="false" Android:state_selected="false"/>
<item Android:drawable="@drawable/nicebuttonround" Android:state_focused="false" Android:state_pressed="false" Android:state_selected="true"/>
<!-- Focused states -->
<item Android:drawable="@drawable/nicebuttonroundi" Android:state_focused="true" Android:state_pressed="false" Android:state_selected="false"/>
<item Android:drawable="@drawable/nicebuttonroundi" Android:state_focused="true" Android:state_pressed="false" Android:state_selected="true"/>
<!-- Pressed -->
<item Android:drawable="@drawable/nicebuttonroundi" Android:state_pressed="true" Android:state_selected="true"/>
<item Android:drawable="@drawable/Nice22i" Android:state_pressed="true"/>
</selector>
画像として背景を繰り返すには、9ピッチの画像を作成する必要があります。