操作栏自定义可绘制菜单图标未居中
Actionbar custom drawable menuIcon not centered
我正在尝试添加一个扩展 Drawable
到我的 actionBar 的自定义 Drawable。这需要是自定义可绘制对象,因为我想在提供的图标之上绘制(但这不是问题所在)。
我已将图标添加到 activity 的菜单中,如下所示:
BadgedIconDrawable drawable = new BadgedIconDrawable(getContext())
.setIcon(icon);
mMenu.add(0, menuItemId, 0, "")
.setIcon(drawable)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
在 BadgedIconDrawable
中,我为图标制作位图,然后在 canvas 上绘制:
@Override
public void draw(@NonNull Canvas canvas) {
canvas.drawBitmap(mIcon.getBitmap(), null, new Rect(0, 0, mWidth, mHeight), mIconPaint);
}
其中宽度和高度为 24dp,这似乎是图标的正确尺寸。
问题在于,与传递给 mMenu
的 setIcon
的常规可绘制对象不同,它似乎没有正确对齐。我找不到如何让它与中心对齐。下图说明了这个问题。中间的Icon是通过BadgedIconDrawable
.
设置的
编辑
虽然下面的代码片段有效,但我很快发现这只适用于工具栏。在常规 ImageView 中使用时不再使用。所以诀窍是使用 Rect
作为位图的绘制位置。这将具有常规边界,但是当它应该被翻译时,通过修改 Rect
告诉自定义 Drawable 这样做:
// On the fragment/activity create the Drawable, translate it and add to the menu.
public void addBadgedActionBarButton(Drawable icon, int color, String badgeLabel, int menuItemId) {
if (mMenu == null) {
throw new IllegalStateException("mMenu = null, Are you sure you are calling addActionBarButton from initMenu()?");
} else {
BadgedIconDrawable drawable = new BadgedIconDrawable(getContext());
drawable.translate(-drawable.getWidth() / 2, -drawable.getHeight() / 2, drawable.getWidth() / 2, drawable.getHeight() / 2)
.setIcon(icon);
mMenu.add(Menu.NONE, menuItemId, Menu.NONE, "")
.setIcon(drawable)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
}
}
// In the BadgedIconDrawable have a function that sets the mDstRect to the translated Rect.
public BadgedIconDrawable translate(int left, int top, int right, int bottom) {
mDstRect = new Rect(left, top, right, bottom);
return this;
}
// In the BadgedIconDrawable draw function use the mDstRect to draw on the correct position.
@Override
public void draw(@NonNull Canvas canvas) {
canvas.drawBitmap(mIcon.getBitmap(), null, mDstRect, mIconPaint);
}
经过一些疯狂的猜测,我设法添加了一个负的顶部和左侧,这似乎把它放在了正确的位置。这似乎可以解决问题。
@Override
public void draw(@NonNull Canvas canvas) {
int halfWidth = mWidth / 2;
int halfHeight = mHeight / 2;
canvas.drawBitmap(mIcon.getBitmap(), null, new Rect(-halfWidth, -halfHeight, halfWidth, halfHeight), mIconPaint);
}
我正在尝试添加一个扩展 Drawable
到我的 actionBar 的自定义 Drawable。这需要是自定义可绘制对象,因为我想在提供的图标之上绘制(但这不是问题所在)。
我已将图标添加到 activity 的菜单中,如下所示:
BadgedIconDrawable drawable = new BadgedIconDrawable(getContext())
.setIcon(icon);
mMenu.add(0, menuItemId, 0, "")
.setIcon(drawable)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
在 BadgedIconDrawable
中,我为图标制作位图,然后在 canvas 上绘制:
@Override
public void draw(@NonNull Canvas canvas) {
canvas.drawBitmap(mIcon.getBitmap(), null, new Rect(0, 0, mWidth, mHeight), mIconPaint);
}
其中宽度和高度为 24dp,这似乎是图标的正确尺寸。
问题在于,与传递给 mMenu
的 setIcon
的常规可绘制对象不同,它似乎没有正确对齐。我找不到如何让它与中心对齐。下图说明了这个问题。中间的Icon是通过BadgedIconDrawable
.
编辑
虽然下面的代码片段有效,但我很快发现这只适用于工具栏。在常规 ImageView 中使用时不再使用。所以诀窍是使用 Rect
作为位图的绘制位置。这将具有常规边界,但是当它应该被翻译时,通过修改 Rect
告诉自定义 Drawable 这样做:
// On the fragment/activity create the Drawable, translate it and add to the menu.
public void addBadgedActionBarButton(Drawable icon, int color, String badgeLabel, int menuItemId) {
if (mMenu == null) {
throw new IllegalStateException("mMenu = null, Are you sure you are calling addActionBarButton from initMenu()?");
} else {
BadgedIconDrawable drawable = new BadgedIconDrawable(getContext());
drawable.translate(-drawable.getWidth() / 2, -drawable.getHeight() / 2, drawable.getWidth() / 2, drawable.getHeight() / 2)
.setIcon(icon);
mMenu.add(Menu.NONE, menuItemId, Menu.NONE, "")
.setIcon(drawable)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
}
}
// In the BadgedIconDrawable have a function that sets the mDstRect to the translated Rect.
public BadgedIconDrawable translate(int left, int top, int right, int bottom) {
mDstRect = new Rect(left, top, right, bottom);
return this;
}
// In the BadgedIconDrawable draw function use the mDstRect to draw on the correct position.
@Override
public void draw(@NonNull Canvas canvas) {
canvas.drawBitmap(mIcon.getBitmap(), null, mDstRect, mIconPaint);
}
经过一些疯狂的猜测,我设法添加了一个负的顶部和左侧,这似乎把它放在了正确的位置。这似乎可以解决问题。
@Override
public void draw(@NonNull Canvas canvas) {
int halfWidth = mWidth / 2;
int halfHeight = mHeight / 2;
canvas.drawBitmap(mIcon.getBitmap(), null, new Rect(-halfWidth, -halfHeight, halfWidth, halfHeight), mIconPaint);
}