Bug 940997: Show submenu indicator for MenuItemActionBar. [r=mfinkle]

This commit is contained in:
Sriram Ramasubramanian 2013-12-20 14:51:53 -08:00
Родитель b0775082df
Коммит 23bd5a736d
7 изменённых файлов: 84 добавлений и 33 удалений

Просмотреть файл

@ -7,6 +7,13 @@ package org.mozilla.gecko.menu;
import org.mozilla.gecko.R;
import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffColorFilter;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.ViewGroup;
@ -16,6 +23,15 @@ public class MenuItemActionBar extends ImageButton
implements GeckoMenuItem.Layout {
private static final String LOGTAG = "GeckoMenuItemActionBar";
private static Bitmap sMoreIcon;
private static float sHalfIconWidth;
private static float sMoreWidth;
private static int sMoreOffset;
private static Paint sDisabledPaint;
private Drawable mIcon;
private boolean mHasSubMenu = false;
public MenuItemActionBar(Context context) {
this(context, null);
}
@ -26,6 +42,55 @@ public class MenuItemActionBar extends ImageButton
public MenuItemActionBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
if (sMoreIcon == null) {
final Resources res = getResources();
BitmapDrawable drawable = (BitmapDrawable) res.getDrawable(R.drawable.menu_item_more);
sMoreIcon = drawable.getBitmap();
// The icon has some space on the right. Taking half the size feels better.
sMoreWidth = getResources().getDimensionPixelSize(R.dimen.menu_item_state_icon) / 2.0f;
sMoreOffset = res.getDimensionPixelSize(R.dimen.menu_item_more_offset);
final int rowHeight = res.getDimensionPixelSize(R.dimen.menu_item_row_height);
final int padding = getPaddingTop() + getPaddingBottom();
sHalfIconWidth = (rowHeight - padding) / 2.0f;
sDisabledPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
sDisabledPaint.setColorFilter(new PorterDuffColorFilter(0xFF999999, PorterDuff.Mode.SRC_ATOP));
}
}
@Override
protected void onDraw(Canvas canvas) {
if (!mHasSubMenu) {
super.onDraw(canvas);
return;
}
final int count = canvas.save();
final float halfWidth = getMeasuredWidth() / 2.0f;
final float halfHeight = getMeasuredHeight() / 2.0f;
// If the width is small, the more icon might be pushed to the edges.
// Instead translate the canvas, so that both the icon + more is centered as a whole.
final boolean needsTranslation = (halfWidth < 1.5 * halfHeight);
final float translateX = needsTranslation ? (sMoreOffset + sMoreWidth) / 2.0f : 0.0f;
canvas.translate(-translateX, 0);
super.onDraw(canvas);
final float left = halfWidth + sHalfIconWidth + sMoreOffset - translateX;
final float top = halfHeight - sMoreWidth;
canvas.drawBitmap(sMoreIcon, left, top, isEnabled() ? null : sDisabledPaint);
canvas.translate(translateX, 0);
canvas.restoreToCount(count);
}
@Override
@ -37,24 +102,22 @@ public class MenuItemActionBar extends ImageButton
setTitle(item.getTitle());
setEnabled(item.isEnabled());
setId(item.getItemId());
setSubMenuIndicator(item.hasSubMenu());
}
void setIcon(Drawable icon) {
if (icon != null) {
setImageDrawable(icon);
setVisibility(VISIBLE);
} else {
mIcon = icon;
if (icon == null) {
setVisibility(GONE);
} else {
setVisibility(VISIBLE);
setImageDrawable(icon);
}
}
void setIcon(int icon) {
if (icon != 0) {
setImageResource(icon);
setVisibility(VISIBLE);
} else {
setVisibility(GONE);
}
setIcon((icon == 0) ? null : getResources().getDrawable(icon));
}
void setTitle(CharSequence title) {
@ -72,4 +135,11 @@ public class MenuItemActionBar extends ImageButton
public void setShowIcon(boolean show) {
// Do nothing.
}
private void setSubMenuIndicator(boolean hasSubMenu) {
if (mHasSubMenu != hasSubMenu) {
mHasSubMenu = hasSubMenu;
invalidate();
}
}
}

Просмотреть файл

@ -68,26 +68,11 @@ public class MenuItemActionView extends LinearLayout
if (item == null)
return;
setTitle(item.getTitle());
setIcon(item.getIcon());
mMenuItem.initialize(item);
mMenuButton.initialize(item);
setEnabled(item.isEnabled());
}
private void setIcon(Drawable icon) {
mMenuItem.setIcon(icon);
mMenuButton.setIcon(icon);
}
private void setIcon(int icon) {
mMenuItem.setIcon(icon);
mMenuButton.setIcon(icon);
}
private void setTitle(CharSequence title) {
mMenuItem.setTitle(title);
mMenuButton.setTitle(title);
}
@Override
public void setEnabled(boolean enabled) {
super.setEnabled(enabled);

Просмотреть файл

@ -102,12 +102,7 @@ public class MenuItemDefault extends TextView
}
void setIcon(int icon) {
Drawable drawable = null;
if (icon != 0)
drawable = getResources().getDrawable(icon);
setIcon(drawable);
setIcon((icon == 0) ? null : getResources().getDrawable(icon));
}
void setTitle(CharSequence title) {

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 1.1 KiB

После

Ширина:  |  Высота:  |  Размер: 1.1 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 1.0 KiB

После

Ширина:  |  Высота:  |  Размер: 1.0 KiB

Двоичный файл не отображается.

До

Ширина:  |  Высота:  |  Размер: 1.1 KiB

После

Ширина:  |  Высота:  |  Размер: 1.1 KiB

Просмотреть файл

@ -49,6 +49,7 @@
<dimen name="menu_item_state_icon">18dp</dimen>
<dimen name="menu_item_row_height">44dp</dimen>
<dimen name="menu_item_row_width">240dp</dimen>
<dimen name="menu_item_more_offset">5dp</dimen>
<dimen name="menu_popup_arrow_margin">5dip</dimen>
<dimen name="menu_popup_arrow_width">40dip</dimen>
<dimen name="menu_popup_offset">8dp</dimen>