このようなデザインに合わせてみました。
「選択されたタブの色合い」は青ですが、中央のタブのアイコンは常に中央に白い時計のある緑色の円である必要があります。
私は多くのことを試しました。最初に、緑の円と時計のPNGリソースがあり、まったく機能しなかったレイヤーリストのXMLリソースを使用して、プログラムでそれを実行しようとしました。それから私はデザイナーに私に完全なアイコン(時計と緑の円)を与えてもらいました、しかし今私はこの問題に遭遇しています。
(未選択)
(選択)
これを修正するためにGoogleで検索する正しい用語を見つけることができません。
最後に、選択したタブの色を青にする必要がありますが、中央のタブアイコンは常に追加の色付けのない実際のアイコンにする必要があります(基本的には、.pngのように見える必要があります)。
PS:私はXamarin.Forms、FreshMvvm、FreshTabbedFONavigationContainerを使用しています。ただし、レンダラーを介して、BottomNavigationViewおよびその他すべてのネイティブAndroidコンポーネントに直接アクセスできます。したがって、ソリューションはXamarinソリューションである必要はありません。java / kotlinソリューションも機能し、Xamarinに変換できます。
======================
編集:
======================
したがって、以下のAndres Castroコードをさらに使用しましたが、以前と同じ問題がまだあります。以下のAndresのコードを使用して、アイコンにFontAwesomeを使用するように切り替えました(これはうまく機能します)が、そのためには、LayerDrawable
を使用して円/アイコンの中央のタブアイコンを作成する必要がありました。
これがこれまでのところです。
選択されていない中央のアイコン
選択された中央のアイコン
ご覧のように、中央のアイコンは、選択されていないときはまだ灰色で、選択されているときは青です(他の4つのアイコンの適切な選択/非選択の色)。
これが、中央のアイコンに関連するコードです。
UpdateTabbedIcons
private void UpdateTabbedIcons()
{
for (var i = 0; i < Element.Children.Count; i++) {
var tab = _bottomNavigationView.Menu.GetItem(i);
var element = Element.Children[i];
if (element is NavigationPage navigationPage) {
//if the child page is a navigation page get its root page
element = navigationPage.RootPage;
}
UpdateTabIcon(tab, element);
}
}
UpdateTabIcon
public void UpdateTabIcon(IMenuItem menuItem, Page page)
{
var icon = page?.Icon;
if (icon == null) return;
var drawable = new IconDrawable(Context, icon, "fa-regular-pro-400.ttf");
var element = Element.CurrentPage;
if (element is NavigationPage navigationPage) {
//if the child page is a navigation page get its root page
element = navigationPage.RootPage;
}
if (page is DoNowTabPage) { //Page for center icon
drawable.Color(Helpers.Resources.White.ToAndroid());
var finalDrawable = GetCombinedDrawable(drawable);
menuItem.SetIcon(finalDrawable);
return;
} else if (element == page) {
drawable.Color(BarSelectedItemColor.ToAndroid());
} else {
drawable.Color(BarItemColor.ToAndroid());
}
menuItem.SetIcon(drawable);
}
GetCombinedDrawable
private Drawable GetCombinedDrawable(IconDrawable iconDrawable)
{
var displayMetrics = Resources.DisplayMetrics;
GradientDrawable circleDrawable = new GradientDrawable();
circleDrawable.SetColor(Helpers.Resources.Green.ToAndroid());
circleDrawable.SetShape(ShapeType.Oval);
circleDrawable.SetSize((int)TypedValue.ApplyDimension(ComplexUnitType.Dip, 500, displayMetrics), (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, 500, displayMetrics));
circleDrawable.Alpha = 1;
var inset = (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, 140, displayMetrics);
var bottomInset = (int)TypedValue.ApplyDimension(ComplexUnitType.Dip, 40, displayMetrics);
LayerDrawable finalDrawable = new LayerDrawable(new Drawable[] { circleDrawable, iconDrawable });
finalDrawable.SetLayerHeight(1, iconDrawable.IntrinsicHeight);
finalDrawable.SetLayerWidth(1, iconDrawable.IntrinsicWidth);
finalDrawable.SetLayerInset(1, inset, inset, inset, inset + bottomInset);
finalDrawable.SetLayerInsetBottom(0, bottomInset);
finalDrawable.ClearColorFilter();
return finalDrawable;
}
ご覧のGradientDrawable
ように、サークル用に作成しているので、色を緑に設定しています(Android Resources
クラスではなく、Resourcesというカスタムクラスがあります)。
だから私は立ち往生しています。描画可能なサークルを緑色に設定していますが、BottomNavigationViewに入ると、その色は常に他のアイコンの選択されていない/選択されている色と一致します。
この最後の問題を乗り越えたいと思っています。助けてくれてありがとう。
_bottomNavigationView.ItemIconTintList = null;