標籤:android
一.左側功能表列:
下載了一份源碼,看見了這種效果,其實就是顯示隱藏,以後肯定能用的到,稍微改了一下,加了點注釋,所以記錄一下(要代碼的留下郵箱)。
:
主介面:
public class MainActivity extends Activity implementsMenuItemCallback {private MenuView rbmView;private Button button1;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button1 = (Button)findViewById(R.id.button1);rbmView = (MenuView) findViewById(R.id.ribbonMenuView1);rbmView.setMenuClickCallback(this);rbmView.setMenuItems(R.menu.ribbon_menu);button1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0) { Toast.makeText(MainActivity.this,"我只是個沒有用的按鈕!", Toast.LENGTH_SHORT).show();}}); //表徵圖可以點擊getActionBar().setDisplayHomeAsUpEnabled(true);} //點擊menu時調用@Overridepublic boolean onOptionsItemSelected(MenuItem item) {int id = item.getItemId();if (id == android.R.id.home) {rbmView.toggleMenu();return true;} else {return super.onOptionsItemSelected(item);}} @Overridepublic void MenuItemClick(int itemId) { Toast.makeText(this, "點擊",Toast.LENGTH_SHORT).show();}}MenuView:
public class MenuView extends LinearLayout {private ListView rbmListView;private View rbmOutsideView;private MenuItemCallback callback;private static ArrayList<RibbonMenuItem> menuItems;public MenuView(Context context) {super(context);load();}public MenuView(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_menu, this, true);} catch (Exception e) {}} //初始化uiprivate void initUi() {rbmListView = (ListView) findViewById(R.id.rbm_listview);rbmOutsideView = (View) findViewById(R.id.rbm_outside_view);// 點擊陰影處隱藏rbmOutsideView.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {hideMenu();}});// item點擊隱藏rbmListView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view,int position, long id) {//回調if (callback != null)callback.MenuItemClick(menuItems.get(position).id);hideMenu();}});}public void setMenuClickCallback(MenuItemCallback 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);rbmOutsideView.startAnimation(AnimationUtils.loadAnimation(getContext(),R.anim.menu_in_from_left));rbmListView.setVisibility(View.VISIBLE);rbmListView.startAnimation(AnimationUtils.loadAnimation(getContext(),R.anim.menu_in_from_left));}// 隱藏菜單public void hideMenu() {rbmOutsideView.setVisibility(View.GONE);rbmOutsideView.startAnimation(AnimationUtils.loadAnimation(getContext(),R.anim.menu_out_to_left));rbmListView.setVisibility(View.GONE);rbmListView.startAnimation(AnimationUtils.loadAnimation(getContext(),R.anim.menu_out_to_left));} //隱藏與顯示的交替public void toggleMenu() {if (rbmOutsideView.getVisibility() == View.GONE) {showMenu();} else {hideMenu();}}// 讀取xml檔案private void parseXml(int menu) {menuItems = new ArrayList<MenuView.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 text = 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");System.out.println(text + " " + iconId + " " + resId);RibbonMenuItem item = new RibbonMenuItem();// id值都是@id所以要去掉@item.id = Integer.valueOf(resId.replace("@", ""));System.out.println(item.id);item.text = resourceIdToString(text);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;}@Overrideprotected void onRestoreInstanceState(Parcelable state) {SavedState ss = (SavedState) state;super.onRestoreInstanceState(ss.getSuperState());if (ss.bShowMenu)showMenu();elsehideMenu();}// 儲存UI狀態@Overrideprotected 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);}@Overridepublic 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());}@Overridepublic int getCount() {return menuItems.size();}@Overridepublic Object getItem(int position) {return null;}@Overridepublic long getItemId(int position) {return 0;}@Overridepublic View getView(int position, View convertView, ViewGroup parent) {final ViewHolder holder;if (convertView == null || convertView instanceof TextView) {convertView = inflater.inflate(R.layout.activity_menu_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;}}}回調方法:
public interface MenuItemCallback {//點擊item時調用public void MenuItemClick(int itemId);}
主布局:
<?xml version="1.0" encoding="utf-8"?><FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:id="@+id/button1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="點擊左上方表徵圖左邊的箭頭,就能看到效果了!" /> <com.example.testtexiao7.MenuView android:id="@+id/ribbonMenuView1" android:layout_width="match_parent" android:layout_height="match_parent" /></FrameLayout>
menu布局:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <ListView android:id="@+id/rbm_listview" android:layout_width="@dimen/menu_width" android:layout_height="match_parent" android:background="@color/menu_background" android:visibility="gone" android:cacheColorHint="#00000000"> </ListView> <!-- 陰影 --> <View android:id="@+id/rbm_outside_view" android:layout_width="0dp" android:layout_height="match_parent" android:background="#e0000000" android:layout_weight="1" android:clickable="true" android:visibility="gone" /></LinearLayout>
item:
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="horizontal" > <ListView android:id="@+id/rbm_listview" android:layout_width="@dimen/menu_width" android:layout_height="match_parent" android:background="@color/menu_background" android:visibility="gone" android:cacheColorHint="#00000000"> </ListView> <!-- 陰影 --> <View android:id="@+id/rbm_outside_view" android:layout_width="0dp" android:layout_height="match_parent" android:background="#e0000000" android:layout_weight="1" android:clickable="true" android:visibility="gone" /></LinearLayout>
這是主要的部分代碼,其他的檔案就先不貼了。
android(10) 左側功能表列