package com.duguang.baseanimation.ui.customview.ribbomenu;
import java.util.ArrayList;
import org.xmlpull.v1.XmlPullParser;
import android.content.Context;
import android.content.res.XmlResourceParser;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnimationUtils;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;
import com.duguang.baseanimation.R;
public class RibbonMenuView extends LinearLayout {
private ListView rbmListView;
private View rbmOutsideView;
private iRibbonMenuCallback callback;
private static ArrayList<RibbonMenuItem> menuItems;
public RibbonMenuView(Context context) {
super(context);
load();
}
public RibbonMenuView(Context context, AttributeSet attrs) {
super(context, attrs);
load();
}
private void load() {
if (isInEditMode())
return;
inflateLayout();
initUi();
}
private void inflateLayout() {
try {
LayoutInflater.from(getContext()).inflate(R.layout.activity_custom_ribbon_menu, this,
true);
} catch (Exception e) {
}
}
private void initUi() {
rbmListView = (ListView) findViewById(R.id.rbm_listview);
rbmOutsideView = (View) findViewById(R.id.rbm_outside_view);
rbmOutsideView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
hideMenu();
}
});
rbmListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
if (callback != null)
callback.RibbonMenuItemClick(menuItems.get(position).id);
hideMenu();
}
});
}
public void setMenuClickCallback(iRibbonMenuCallback callback) {
this.callback = callback;
}
public void setMenuItems(int menu) {
parseXml(menu);
if (menuItems != null && menuItems.size() > 0) {
rbmListView.setAdapter(new Adapter());
}
}
public void setBackgroundResource(int resource) {
rbmListView.setBackgroundResource(resource);
}
public void showMenu() {
rbmOutsideView.setVisibility(View.VISIBLE);
rbmListView.setVisibility(View.VISIBLE);
rbmListView.startAnimation(AnimationUtils.loadAnimation(getContext(),
R.anim.rbm_in_from_left));
}
public void hideMenu() {
rbmOutsideView.setVisibility(View.GONE);
rbmListView.setVisibility(View.GONE);
rbmListView.startAnimation(AnimationUtils.loadAnimation(getContext(),
R.anim.rbm_out_to_left));
}
public void toggleMenu() {
if (rbmOutsideView.getVisibility() == View.GONE) {
showMenu();
} else {
hideMenu();
}
}
private void parseXml(int menu) {
menuItems = new ArrayList<RibbonMenuView.RibbonMenuItem>();
try {
XmlResourceParser xpp = getResources().getXml(menu);
xpp.next();
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
String elemName = xpp.getName();
if (elemName.equals("item")) {
String textId = xpp.getAttributeValue(
"http://schemas.android.com/apk/res/android",
"title");
String iconId = xpp.getAttributeValue(
"http://schemas.android.com/apk/res/android",
"icon");
String resId = xpp.getAttributeValue(
"http://schemas.android.com/apk/res/android",
"id");
RibbonMenuItem item = new RibbonMenuItem();
item.id = Integer.valueOf(resId.replace("@", ""));
item.text = resourceIdToString(textId);
item.icon = Integer.valueOf(iconId.replace("@", ""));
menuItems.add(item);
}
}
eventType = xpp.next();
}
} catch (Exception e) {
e.printStackTrace();
}
}
private String resourceIdToString(String text) {
if (!text.contains("@")) {
return text;
} else {
String id = text.replace("@", "");
return getResources().getString(Integer.valueOf(id));
}
}
public boolean isMenuVisible() {
return rbmOutsideView.getVisibility() == View.VISIBLE;
}
@Override
protected void onRestoreInstanceState(Parcelable state) {
SavedState ss = (SavedState) state;
super.onRestoreInstanceState(ss.getSuperState());
if (ss.bShowMenu)
showMenu();
else
hideMenu();
}
@Override
protected Parcelable onSaveInstanceState() {
Parcelable superState = super.onSaveInstanceState();
SavedState ss = new SavedState(superState);
ss.bShowMenu = isMenuVisible();
return ss;
}
static class SavedState extends BaseSavedState {
boolean bShowMenu;
SavedState(Parcelable superState) {
super(superState);
}
private SavedState(Parcel in) {
super(in);
bShowMenu = (in.readInt() == 1);
}
@Override
public void writeToParcel(Parcel out, int flags) {
super.writeToParcel(out, flags);
out.writeInt(bShowMenu ? 1 : 0);
}
public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() {
public SavedState createFromParcel(Parcel in) {
return new SavedState(in);
}
public SavedState[] newArray(int size) {
return new SavedState[size];
}
};
}
class RibbonMenuItem {
int id;
String text;
int icon;
}
private class Adapter extends BaseAdapter {
private LayoutInflater inflater;
public Adapter() {
inflater = LayoutInflater.from(getContext());
}
@Override
public int getCount() {
return menuItems.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null || convertView instanceof TextView) {
convertView = inflater.inflate(R.layout.activity_custom_ribbon_item, null);
holder = new ViewHolder();
holder.image = (ImageView) convertView
.findViewById(R.id.rbm_item_icon);
holder.text = (TextView) convertView
.findViewById(R.id.rbm_item_text);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.image.setImageResource(menuItems.get(position).icon);
holder.text.setText(menuItems.get(position).text);
return convertView;
}
class ViewHolder {
TextView text;
ImageView image;
}
}
}