package com.linroid.filtermenu.library; import android.content.Context; import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.util.TypedValue; import android.view.ContextThemeWrapper; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.widget.ImageButton; import android.widget.PopupMenu; import java.util.ArrayList; import java.util.List; /** * Created by linroid on 15/3/8. */ public class FilterMenu implements IMenu{ private List<Item> items = new ArrayList<>(); private OnMenuChangeListener listener; private FilterMenuLayout layout; // /** // * add menu item to layout // * // * @param item // * @param listener // */ // public void addItem(Item item, View.OnClickListener listener) { // items.add(item); // } public List<Item> getItems() { return items; } public OnMenuChangeListener getListener() { return listener; } public void setListener(OnMenuChangeListener listener) { this.listener = listener; for (final Item item : getItems()) { item.getView().setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (getListener() != null) { if(layout!=null){ layout.collapse(true); } getListener().onMenuItemClick(item.getView(), item.getPosition()); } } }); } } @Override public void collapse(boolean animate) { layout.collapse(animate); } @Override public void expand(boolean animate) { layout.expand(animate); } @Override public void toggle(boolean animate) { layout.toggle(animate); } @Override public void setMenuLayout(FilterMenuLayout view) { this.layout = view; if(view==null){ return; } for (final Item item : getItems()){ layout.addView(item.getView()); } layout.setMenu(this); } public void setItems(List<Item> items) { this.items = items; } public static interface OnMenuChangeListener{ void onMenuItemClick(View view, int position); void onMenuCollapse(); void onMenuExpand(); } public static class Builder{ private List<Item> items = new ArrayList<>(); OnMenuChangeListener listener; private Context ctx; private LayoutInflater inflater; private FilterMenuLayout layout; public Builder(Context ctx) { this.ctx = ctx; this.inflater = LayoutInflater.from(ctx); } public Builder withListener(OnMenuChangeListener listener){ this.listener = listener; return this; } public Builder inflate(int menuResId) { PopupMenu popupMenu = new PopupMenu(ctx, null); popupMenu.inflate(menuResId); Menu menu = popupMenu.getMenu(); for (int i = 0; i < menu.size(); i++) { MenuItem item = menu.getItem(i); addItem(item.getIcon()); } menu.clear(); menu = null; popupMenu = null; return this; } public Builder addItem(Drawable icon){ ImageButton view = (ImageButton) inflater.inflate(R.layout.menu_item, null, false); view.setImageDrawable(icon); // TypedValue value = new TypedValue(); // ctx.getTheme().resolveAttribute(R.attr.selectableItemBackgroundBorderless, value, true); // view.setBackgroundResource(value.resourceId); addItem(view); return this; } public Builder addItem(int iconResId){ Drawable icon = ctx.getResources().getDrawable(iconResId); addItem(icon); return this; } public Builder addItem(View customView){ Item item = new Item(); item.setView(customView); item.setPosition(items.size()); item.getView().setTag(item); items.add(item); return this; } public Builder attach(FilterMenuLayout view){ this.layout = view; return this; } public FilterMenu build() { FilterMenu menu = new FilterMenu(); menu.setItems(items); menu.setListener(this.listener); menu.setMenuLayout(this.layout); return menu; } } public static class Item{ private View view; private int x; private int y; private int position; private Rect bounds = new Rect(0, 0, 0, 0); public View getView() { return view; } public void setView(View view) { this.view = view; view.setAlpha(0f); } public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } public int getPosition() { return position; } public void setPosition(int position) { this.position = position; } public void setBounds(Rect bounds) { this.bounds = bounds; } public void setBounds(int left, int top, int right, int bottom) { this.bounds.set(left, top, right, bottom); } public Rect getBounds() { return bounds; } } }