Action Bar Android中徽标的中心位置

Abh*_*Dey 6 android android-appcompat android-actionbar

我想在Action Bar的中心显示徽标.这是我的自定义布局代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/ActionBarWrapper"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/logo"
        android:layout_centerInParent="true"
        android:padding="8dp"/>

</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

在onCreate()我用它作为:

getSupportActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM);
getSupportActionBar().setCustomView(R.layout.custom_logo);
getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.parseColor("#2A2A2A")));
Run Code Online (Sandbox Code Playgroud)

问题是它在正常的碎片和活动中显示正常,但在与导航抽屉一起使用时向右移动一点.这是图像:

  1. 错了一个:

显示错误

  1. 正确对象,真爱:

正确显示

我究竟做错了什么?谢谢.

小智 11

然后尝试ToolBar.试试这个代码

<android.support.v7.widget.Toolbar
android:id="@+id/toolbar_top"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:minHeight="?attr/actionBarSize" >


<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Toolbar Title"
    android:src="@drawable/logo"
    android:layout_gravity="center"
    android:id="@+id/toolbar_title" />


</android.support.v7.widget.Toolbar>
Run Code Online (Sandbox Code Playgroud)


Moc*_*yat 5

尝试使用线性布局,layout_gravity如下所示:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/ActionBarWrapper"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <ImageView
            android:id="@+id/icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/logo"
            android:layout_gravity="center"
            android:padding="8dp"/>

    </LinearLayout>
Run Code Online (Sandbox Code Playgroud)

希望它有所帮助


Ind*_*ana 5

添加app:contentInsetLeft="0dp"到您的android.support.v7.widget.Toolbar,因为带有菜单抽屉的工具栏将自动具有右边距。


Spe*_*o83 5

我使用 Drawable 作为操作栏的背景。通过这种方式,您可以在左侧和/或右侧使用不同的 MenuItem,并且徽标将每次都居中。当通过毕加索加载时,我还需要为徽标设置动画,结果如下:

通过带有淡入淡出动画的 Picasso 加载的操作栏徽标

我已经使用 LayerDrawable 将一个 Drawable(一个层)动画化到其中。这是代码,也许对某人有用:

getSupportActionBar().show();
getSupportActionBar().setDisplayShowCustomEnabled(true);
getSupportActionBar().setDisplayShowTitleEnabled(false);

showActionBarLogo(this, true);
Run Code Online (Sandbox Code Playgroud)

这是用于显示和隐藏操作栏徽标的 showActionBarLogo 函数:

public void showActionBarLogo(final Activity activity, boolean show) 
{
    if (show) 
    {
        // Calculate Action bar height
        int actionBarHeight = 200;
        TypedValue tv = new TypedValue();
        if (activity.getTheme().resolveAttribute(android.R.attr.actionBarSize, tv, true))
        {
            actionBarHeight = TypedValue.complexToDimensionPixelSize(tv.data,activity.getResources().getDisplayMetrics());
        }

        // Using action bar background drawable
        logoTarget = new Target() {
            @Override
            public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {

                Drawable[] layers = new Drawable[2];
                layers[0] = new ColorDrawable(Color.RED); // Background color of Action bar
                BitmapDrawable bd = new BitmapDrawable(activity.getResources(), bitmap);
                bd.setGravity(Gravity.CENTER);
                Drawable drawLogo = bd;
                layers[1] = drawLogo; // Bitmap logo of Action bar (loaded from Picasso)
                LayerDrawable layerDrawable = new LayerDrawable(layers);

                layers[1].setAlpha(0);

                ((AppCompatActivity) activity).getSupportActionBar().setBackgroundDrawable(layerDrawable);

                ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(layers[1], PropertyValuesHolder.ofInt("alpha", 255));
                animator.setTarget(layers[1]);
                animator.setDuration(2000);
                animator.start();
            }

            @Override public void onBitmapFailed(Drawable errorDrawable) { }
            @Override public void onPrepareLoad(Drawable placeHolderDrawable) { }
        };

        Picasso.with(activity).load("https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_120x44dp.png").resize(0, actionBarHeight).into(logoTarget);

    } else {
        ((AppCompatActivity) activity).getSupportActionBar().setBackgroundDrawable(new ColorDrawable(Color.RED));
    }
}
Run Code Online (Sandbox Code Playgroud)

我为 Action Bar 创建了一个 drawable:

  • 图层 (0) 是背景颜色和
  • 中间带有徽标的图层 (1)(带有淡入淡出动画)

我使用 Picasso 加载徽标,并且喜欢在加载时为其设置动画(位图 onBitmapLoaded 回调)。

请记住在 showActionBarLogo 函数之外声明 Picasso Target 以避免加载图像时出现垃圾问题:

private Target logoTarget;
Run Code Online (Sandbox Code Playgroud)

如果您不需要 Picasso 加载,您可以只使用代码进入onBitmapLoaded函数并使用 Drawable 而不是位图变量。

如果您不需要淡入淡出动画,则同样如此。您可以删除该layers[1].setAlpha(0);行以及所有ObjectAnimator行。

我已经从 Android 4.4 (api 19) 到 8.1 (api 27) 对它进行了测试,效果很好!

我希望这会有所帮助!