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)
问题是它在正常的碎片和活动中显示正常,但在与导航抽屉一起使用时向右移动一点.这是图像:
我究竟做错了什么?谢谢.
小智 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)
尝试使用线性布局,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)
希望它有所帮助
我使用 Drawable 作为操作栏的背景。通过这种方式,您可以在左侧和/或右侧使用不同的 MenuItem,并且徽标将每次都居中。当通过毕加索加载时,我还需要为徽标设置动画,结果如下:

我已经使用 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:
我使用 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) 对它进行了测试,效果很好!
我希望这会有所帮助!
| 归档时间: |
|
| 查看次数: |
14216 次 |
| 最近记录: |