Floating Action Button
backgroundTintList color次のコードを使用して:
fab.setBackgroundTintList(ColorStateList.valueOf(mResources.getColor(R.color.fab_color)));
しかし、私はAPI 4.4.2で次のようになります。
API 21 <=ですべてが正常に見えますが、API 21以下では、FABにこの問題があります。
私はプログラムでFABを次のように作成しています:
FloatingActionButton fab = new FloatingActionButton(this);
CoordinatorLayout.LayoutParams layoutParams = new CoordinatorLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
fab.setLayoutParams(layoutParams);
layoutParams.rightMargin = mResources.getDimensionPixelSize(R.dimen.activity_horizontal_margin);
((CoordinatorLayout) findViewById(R.id.coordinatorLayout)).addView(fab);
CoordinatorLayout.LayoutParams p = (CoordinatorLayout.LayoutParams) fab.getLayoutParams();
p.setAnchorId(R.id.appBarLayout);
p.anchorGravity = Gravity.BOTTOM | Gravity.END;
fab.setLayoutParams(p);
fab.setVisibility(View.VISIBLE);
fab.setBackgroundTintList(ColorStateList.valueOf(mResources.getColor(R.color.fab_color)));
fab.setImageDrawable(getResources().getDrawable(R.drawable.ic_button));
たまたま、公式の ソースコード がFloatingActionButton
を実行していて、borderDrawableをインスタンス化していることがわかりました。
@Override
void setBackgroundDrawable(Drawable originalBackground, ColorStateList backgroundTint,
PorterDuff.Mode backgroundTintMode, int rippleColor, int borderWidth) {
// Now we need to tint the original background with the tint
mShapeDrawable = DrawableCompat.wrap(originalBackground.mutate());
DrawableCompat.setTintList(mShapeDrawable, backgroundTint);
if (backgroundTintMode != null) {
DrawableCompat.setTintMode(mShapeDrawable, backgroundTintMode);
}
final Drawable rippleContent;
if (borderWidth > 0) { // BORDER DRAWABLE RIGHT HERE!!
mBorderDrawable = createBorderDrawable(borderWidth, backgroundTint);
rippleContent = new LayerDrawable(new Drawable[]{mBorderDrawable, mShapeDrawable});
} else {
mBorderDrawable = null;
rippleContent = mShapeDrawable;
}
mRippleDrawable = new RippleDrawable(ColorStateList.valueOf(rippleColor),
rippleContent, null);
mShadowViewDelegate.setBackgroundDrawable(mRippleDrawable);
mShadowViewDelegate.setShadowPadding(0, 0, 0, 0);
}
追加を終了しました:
app:borderWidth="0dp"
これはborderDrawableを作成せず、境界線は表示されません。
スタイルファイルのcoloraccentを変更するだけです
<item name="colorAccent">@color/colorAccent</item>
fABの背景色として必要な色を追加します
編集:okk ..よくここにあなたができる代替案があります..あなたのxmlでこのFABを定義してください
<Android.support.design.widget.FloatingActionButton
Android:id="@+id/fab"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_gravity="bottom|end"
app:backgroundTint="@color/fab_color"
Android:layout_margin="@dimen/fab_margin"
Android:src="@Android:drawable/ic_dialog_email" />
変更が加えられるため、プログラムで行う必要はありません。
おそらく、プログラムで下位互換性のある方法で色を変更する必要があります。
DrawableCompat.setTintList(DrawableCompat.wrap(fab.getDrawable()), tintColor);
<-アイコン
DrawableCompat.setTintList(DrawableCompat.wrap(fab.getBackground()), backgroundTintColor);
<-背景
背景色を変更するには、app:backgroundTint="#4000FF00"
を使用します
例えば:
<Android.support.design.widget.FloatingActionButton
Android:id="@+id/fab"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_marginBottom="54dp"
Android:layout_marginRight="16dp"
Android:clickable="true"
Android:src="@drawable/ic_edit"
app:layout_anchor="@id/xxxx"
app:rippleColor="@Android:color/white"
app:backgroundTint="#00FF00"
app:layout_anchorGravity="bottom|end|right"
/>
ただし、透過的にしたい場合は、app:elevation
およびapp:pressedTranslationZ
プロパティを使用します。
例えば:
<Android.support.design.widget.FloatingActionButton
Android:id="@+id/fab"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_marginBottom="54dp"
Android:layout_marginRight="16dp"
Android:clickable="true"
Android:src="@drawable/ic_edit"
app:layout_anchor="@id/xxx"
app:borderWidth="0dp"
app:rippleColor="@Android:color/white"
app:backgroundTint="#4000FF00"
app:elevation="0dp"
app:pressedTranslationZ="0dp"
app:layout_anchorGravity="bottom|end|right"
/>
これらのプロパティは、ボタンのクリックと仰角にビュー効果を与えるために使用されます。