我遇到了类似的问题。我尝试使用Blueberry建议的layer-list方法,但是一旦我放入一个高分辨率的标志性资产,解决方案就不再起作用了。在layer-list中,位图存在一个错误:它会将较小的图像放大以适应空间,但不会缩小较大的图像。因此,只要您愿意使用看起来有颗粒感/像素化的微小图像,当它们被放大时,layer-list就可以正常工作。
为了解决这个问题并获得一个居中的高分辨率标志,我完全从Toolbar中删除了android:background属性,将android:background="?attr/colorPrimary"添加到我的AppBarLayout父级中,然后将这个可怕的代码扔进了我的Activity的onCreate方法中:
final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
ActionBar ab = getSupportActionBar();
if (ab != null && toolbar != null)
{
ab.setDisplayShowTitleEnabled(false);
toolbar.addOnLayoutChangeListener(new View.OnLayoutChangeListener()
{
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom)
{
ActionBar ab = getSupportActionBar();
if (ab != null)
{
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.logo);
Bitmap bmp2 = Bitmap.createBitmap(toolbar.getWidth(), toolbar.getHeight(), bmp.getConfig());
Bitmap bmp3 = Bitmap.createScaledBitmap(bmp, bmp.getWidth() * toolbar.getHeight() / bmp.getHeight(), toolbar.getHeight(), true);
Canvas canvas = new Canvas(bmp2);
canvas.drawBitmap(bmp3, (toolbar.getWidth() / 2) - (bmp3.getWidth() / 2), 0, null);
BitmapDrawable background = new BitmapDrawable(getResources(), bmp2);
ab.setBackgroundDrawable(background);
}
}
});
}
它的工作原理是创建一个与工具栏大小相同的画布和一个按比例缩放的标志版本,在画布中心绘制新调整大小的标志,最后将正在绘制的位图设置为操作栏的背景。优点是该方法允许您完全控制位置、大小等,而不仅限于 XML 中能做的内容。但是它会被频繁调用,这意味着存在性能影响。如果设计团队要求你使用背景标志并浪费五个小时寻找上述解决方案,那就没有关于性能的问题了-你只是想让它工作。上面的代码有很强的不确定性气息。我会让比我更擅长Android开发的人指出“我做错了”的地方,并修复上述代码中存在的任何性能问题/错误。这并不改变层列表位图损坏的事实,这是一种应该不存在的 hack(也不应该存在)来解决 Android 中愚蠢的 bug。