最新のAndroid SDKには、新しいCardViewがあり、古いCustomCardViewを新しいバージョンに置き換えましたが、古いバージョンのAndroid = state_pressed
&state_focused
はCardViewの上に表示される醜い正方形です...
新しいCardViewで以下をエミュレートする方法を知っている人はいますが、古いバージョンのAndroidを使用している場合に限りますか?
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:enterFadeDuration="150"
Android:exitFadeDuration="150" >
<item Android:state_pressed="true"
Android:drawable="@drawable/card_on_press"/>
<item Android:state_focused="true" Android:state_enabled="true"
Android:drawable="@drawable/card_on_focus"/>
<item Android:state_enabled="true"
Android:drawable="@drawable/card_default"/>
<item Android:state_enabled="false"
Android:drawable="@drawable/card_on_press"/>
</selector>
そして、ここに興味のある方のために、私が現在使用しているCardViewがあります。
<Android.support.v7.widget.CardView
xmlns:card_view="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/CardView"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_marginLeft="10dp"
Android:layout_marginRight="10dp"
Android:layout_marginTop="10dp"
Android:foreground="?android:attr/selectableItemBackground"
Android:onClick="RunSomeMethod"
card_view:cardCornerRadius="4dp"
Android:focusable="true"
Android:elevation="2dp">
<LinearLayout
Android:id="@+id/LinearLayout"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="horizontal"
Android:focusable="false"
Android:visibility="visible">
</LinearLayout>
</Android.support.v7.widget.CardView>
次のコードで修正されました:
値-v21\styles.xml:
<style name="CardViewStyle" parent="CardView.Light">
<item name="Android:foreground">?android:attr/selectableItemBackground</item>
</style>
values\styles.xml:
<style name="CardViewStyle" parent="Android:Widget.TextView">
<item name="Android:foreground">@drawable/card</item>
</style>
Layout\main_layout.xmlからのカード:
<Android.support.v7.widget.CardView
xmlns:card_view="http://schemas.Android.com/apk/res-auto"
Android:id="@+id/Card_View"
style="@style/CardViewStyle"
Android:layout_width="480dp"
Android:layout_height="wrap_content"
Android:layout_gravity="center_horizontal"
Android:layout_marginLeft="10dp"
Android:layout_marginRight="10dp"
Android:layout_marginTop="10dp"
card_view:cardCornerRadius="4dp"
Android:elevation="2dp">
これにより、v21 +でアニメーションを提供できるだけでなく、大きな青/灰色の正方形ではなく、v21より前の代替アニメーションを提供することもできます。
これが、興味のある人のためにドローアブルとして使用しているcard.xmlです。
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:enterFadeDuration="150"
Android:exitFadeDuration="150" >
<item Android:state_pressed="true"
Android:drawable="@drawable/card_on_press"/>
<item Android:state_focused="true" Android:state_enabled="true"
Android:drawable="@drawable/card_on_focus"/>
<item Android:state_enabled="true"
Android:drawable="@drawable/card_default"/>
<item Android:state_enabled="false"
Android:drawable="@drawable/card_on_press"/>
</selector>
注:CardViewはすべてのAndroidバージョンにデフォルトの背景を提供するため、描画可能なデフォルトは透明なアイテムとして問題ありません。
ライブラリが更新された可能性がありますが、以下を使用すると、古いバージョンのAndroidでは問題なく表示されます。
「CardView.Dark」と「CardView.Light」を使用できます(カードサポートライブラリで自動生成されます)
<style name="CardViewStyle.Light" parent="CardView.Light">
<item name="Android:foreground">?android:attr/selectableItemBackground</item>
</style>
<style name="CardViewStyle.Dark" parent="CardView.Dark">
<item name="Android:foreground">?android:attr/selectableItemBackground</item>
</style>
2つのレイアウトを作成します。1つは暗い用、もう1つは明るい用です。次のようなカードビューが含まれます。
<Android.support.v7.widget.CardView
Android:id="@+id/my_card_view"
style="@style/CardViewStyle.Light"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_gravity="center_horizontal"
Android:orientation="vertical"
Android:layout_marginLeft="8dp"
Android:layout_marginRight="8dp"
Android:layout_marginBottom="8dp"
app:cardCornerRadius="2dp"
Android:elevation="2dp">
... other layout stuff ...
</Android.support.v7.widget.CardView>
<Android.support.v7.widget.CardView
Android:id="@+id/my_card_view"
style="@style/CardViewStyle.Dark"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:layout_gravity="center_horizontal"
Android:orientation="vertical"
Android:layout_marginLeft="8dp"
Android:layout_marginRight="8dp"
Android:layout_marginBottom="8dp"
app:cardCornerRadius="2dp"
Android:elevation="2dp">
... other layout stuff ...
</Android.support.v7.widget.CardView>
各CardViewでスタイルを切り替えることに注意してください。
黒や白だけでなく、色をカスタマイズしたい場合は、次を使用できます。
CardViewドローアブルを取得するには、次を使用できます。
View cardView = findViewById(R.id.my_card_view);
Drawable cardViewDrawable cardView.getBackground();
convertIcon(setViewBackground(cardView, cardViewDrawable));
私の「convertIcon」は単純に次のとおりです。
/**
*
* @param drawable e.g. "getResources().getDrawable(R.drawable.my_drawable)"
* @param tint e.g. "Color.parseColor(lightTitlebarFg)"
* @return Drawable
*
*/
public static Drawable convertIcon(Drawable drawable, int tint) {
ColorFilter filter = new PorterDuffColorFilter(tint, PorterDuff.Mode.SRC_ATOP);
drawable.setColorFilter(filter);
return drawable;
}
私の「setViewBackground」は単純に次のとおりです。
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@SuppressWarnings("deprecation")
public static void setViewBackground(View view, Drawable drawable){
if (UIUtils.isJB()) {
view.setBackground(drawable);
} else {
view.setBackgroundDrawable(drawable);
}
}
プログラムでStateListDrawableを作成する場合は、次を使用できます。
StateListDrawable states = new StateListDrawable();
states.addState(new int[] { Android.R.attr.state_focused }, focusedDrawable);
states.addState(new int[] { Android.R.attr.state_activated }, activatedDrawable);
states.addState(new int[] { Android.R.attr.state_enabled }, defaultDrawable);
states.addState(new int[] {}, defaultDrawable);
プロジェクトのドローアブルフォルダーに保存されているcard_on_press.xmlファイルで使用したコードは次のとおりです。
<item>
<shape>
<padding
Android:bottom="0dp"
Android:left="0dp"
Android:right="0dp"
Android:top="0dp" />
<solid Android:color="@color/transparent" />
</shape>
</item>
<item>
<shape>
<padding
Android:bottom="0dp"
Android:left="0dp"
Android:right="0dp"
Android:top="0dp" />
<solid Android:color="@color/card_shadow_1_on_press" />
<corners Android:radius="8dp" />
</shape>
</item>
<item>
<shape>
<padding
Android:bottom="0dp"
Android:left="0dp"
Android:right="0dp"
Android:top="0dp" />
<solid Android:color="@color/card_shadow_2_on_press" />
<corners Android:radius="8dp" />
</shape>
</item>
<!-- Background -->
<item>
<shape>
<solid Android:color="@color/card_background_on_press" />
<corners Android:radius="8dp" />
</shape>
</item>