2017-07-05 3 views
1

Drawableを私のactionBarに拡張するカスタムDrawableを追加しようとしています。私は提供されたアイコンの上に描画したいので、これはカスタムdrawableである必要があります(しかしそれは問題ではありません)。アクションバーのカスタム描画可能メニューが中央に配置されていません

私はそうのように私の活動でメニューにアイコンを追加しました:

@Override 
public void draw(@NonNull Canvas canvas) { 
    canvas.drawBitmap(mIcon.getBitmap(), null, new Rect(0, 0, mWidth, mHeight), mIconPaint); 
} 
:私はその後、キャンバス上に描画アイコンのビットマップを取る BadgedIconDrawable

BadgedIconDrawable drawable = new BadgedIconDrawable(getContext()) 
    .setIcon(icon); 
mMenu.add(0, menuItemId, 0, "") 
    .setIcon(drawable) 
    .setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS); 

幅と高さが24dpでアイコンのサイズが正しいようです。

mMenusetIconに渡される通常のドロアブルとは異なり、問題は正しく整列していないようです。私はそれを中心に揃える方法を見つけることができません。下の画像はこの問題を示しています。中央のアイコンはBadgedIconDrawableで設定します。

Incorrectly aligned toolbar icon

答えて

0

EDIT

以下のスニペットが働いている間、私はすぐにこれが唯一のツールバーのために働くと考えました。通常の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); 
} 
関連する問題