Action Bar Android中徽标的中心位置

时间:2015-09-30 03:46:43

标签: android android-actionbar android-appcompat

我想在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>

onCreate()我用它作为:

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

问题是它在正常碎片和活动中显示正常但在与导航抽屉一起使用时稍微向右移动。以下是图片:

  1. 错误的一个:
  2. Wrong Display

    1. 右一:
    2. Right Display

      我做错了什么?感谢。

5 个答案:

答案 0 :(得分:10)

然后尝试使用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>

答案 1 :(得分: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>

希望有所帮助

答案 2 :(得分:4)

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

答案 3 :(得分:3)

我使用Drawable作为Action Bar的背景。通过这种方式,您可以在左侧和/或右侧使用不同的MenuItem,徽标将每次居中。 我需要在通过毕加索加载徽标时制作动画,这就是结果:

Action bar logo loaded through Picasso with fade animation

我已经使用LayerDrawable为其中的一个Drawable(一个图层)制作动画。 这是代码,可能对某人有用:

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

showActionBarLogo(this, true);

这是showActionBarLogo函数,用于显示和隐藏Action bar徽标:

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));
    }
}

我已经为Action Bar创建了一个drawable:

  • 作为背景颜色和
  • 的层(0)
  • 一层(1) 中间的徽标(带淡化动画)

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

请记住在showActionBarLogo函数中声明毕加索目标以避免加载图像时出现垃圾问题:

private Target logoTarget;

如果您不需要加载Picasso,则只能将代码用于onBitmapLoaded函数并使用Drawable而不是位图变量。

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

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

我希望这可以提供帮助!

答案 4 :(得分:0)

<?xml version="1.0" encoding="utf-8"?>
<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:layout_gravity="clip_horizontal" // change from center attribute
    android:contentDescription="@string/logo"
    android:padding="2dp"
    android:src="@drawable/tap1" />

</LinearLayout>

使用clip_horizo​​ntal属性为我做了诀窍。

android:layout_gravity="clip_horizontal"