Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Actionbar自定义可绘制菜单图标未居中_Android_Android Drawable - Fatal编程技术网

Android Actionbar自定义可绘制菜单图标未居中

Android Actionbar自定义可绘制菜单图标未居中,android,android-drawable,Android,Android Drawable,我正在尝试添加一个自定义绘图,它将Drawable扩展到我的actionBar。这需要是一个自定义绘图,因为我想在提供的图标上绘图(但这不是问题) 我已将图标添加到活动的菜单中,如下所示: BadgedIconDrawable drawable = new BadgedIconDrawable(getContext()) .setIcon(icon); mMenu.add(0, menuItemId, 0, "") .setIcon(drawable) .setShowA

我正在尝试添加一个自定义绘图,它将
Drawable
扩展到我的actionBar。这需要是一个自定义绘图,因为我想在提供的图标上绘图(但这不是问题)

我已将图标添加到活动的菜单中,如下所示:

BadgedIconDrawable drawable = new BadgedIconDrawable(getContext())
    .setIcon(icon);
mMenu.add(0, menuItemId, 0, "")
    .setIcon(drawable)
    .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
BadgedIconDrawable
中,我为图标绘制位图,然后在画布上绘制:

@Override
public void draw(@NonNull Canvas canvas) {
    canvas.drawBitmap(mIcon.getBitmap(), null, new Rect(0, 0, mWidth, mHeight), mIconPaint);
}
其中宽度和高度为24dp,这似乎是图标的正确大小

问题在于,与传递给
mMenu
setIcon
的常规绘图不同,它似乎没有正确对齐。我找不到如何使它与中心对齐。下图说明了这个问题。中间图标通过
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);
}
编辑

虽然下面的代码片段有效,但我很快发现这只适用于工具栏。在常规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);
}