зеркало из https://github.com/mozilla/gecko-dev.git
Bug 940997: Show submenu indicator for MenuItemActionBar. [r=mfinkle]
This commit is contained in:
Родитель
b0775082df
Коммит
23bd5a736d
|
@ -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) {
|
||||
|
|
Двоичные данные
mobile/android/base/resources/drawable-hdpi/menu_item_more.png
Двоичные данные
mobile/android/base/resources/drawable-hdpi/menu_item_more.png
Двоичный файл не отображается.
До Ширина: | Высота: | Размер: 1.1 KiB После Ширина: | Высота: | Размер: 1.1 KiB |
Двоичные данные
mobile/android/base/resources/drawable-mdpi/menu_item_more.png
Двоичные данные
mobile/android/base/resources/drawable-mdpi/menu_item_more.png
Двоичный файл не отображается.
До Ширина: | Высота: | Размер: 1.0 KiB После Ширина: | Высота: | Размер: 1.0 KiB |
Двоичные данные
mobile/android/base/resources/drawable-xhdpi/menu_item_more.png
Двоичные данные
mobile/android/base/resources/drawable-xhdpi/menu_item_more.png
Двоичный файл не отображается.
До Ширина: | Высота: | Размер: 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>
|
||||
|
|
Загрузка…
Ссылка в новой задаче