【问题标题】:Actionbar custom drawable menuIcon not centered操作栏自定义可绘制 menuIcon 未居中
【发布时间】:2017-07-05 13:25:00
【问题描述】:

我正在尝试添加一个自定义 Drawable,它将 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,这似乎是图标的正确尺寸。

问题在于,与传递给setIconmMenu 的常规drawable 不同,它似乎没有正确对齐。我找不到如何让它与中心对齐。下图说明了这个问题。中间的Icon是通过BadgedIconDrawable设置的。

【问题讨论】:

    标签: android android-drawable


    【解决方案1】:

    编辑

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-16
      • 1970-01-01
      相关资源
      最近更新 更多