在使用share SDK时,发现里面的侧滑效果还可以,现在把它单独抽象出来,唯一有个缺陷就是每次启动时会闪一下,而它给出的DEMO也有这个现象,这个问题后面再解决。
MainActivity:
package com.home.testslidingmenu; import m.framework.ui.widget.slidingmenu.SlidingMenu; import android.app.Activity; import android.content.res.Configuration; import android.os.Bundle; import android.view.KeyEvent; import android.view.Window; public class MainActivity extends Activity { private SlidingMenu menu; private int orientation; @Override protected void onCreate(Bundle savedInstanceState) { requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCreate(savedInstanceState); orientation = getResources().getConfiguration().orientation; menu = new SlidingMenu(this); menu.setMenuItemBackground(R.color.sliding_menu_item_down, R.color.sliding_menu_item_release); menu.setMenuBackground(R.color.sliding_menu_background); menu.setTtleHeight(cn.sharesdk.framework.utils.R.dipToPx(this, 44)); menu.setBodyBackground(R.color.sliding_menu_body_background); menu.setShadowRes(R.drawable.sliding_menu_right_shadow); menu.setMenuDivider(R.drawable.sliding_menu_sep); menu.setAdapter(new MainAdapter(menu)); menu.triggerItem(MainAdapter.GROUP_1, MainAdapter.ITEM_1); setContentView(menu); } /** * 屏幕旋转后,此方法会被调用,以刷新侧栏的布局 */ @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (orientation != newConfig.orientation) { orientation = newConfig.orientation; menu.refresh(); } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN && !menu.isMenuShown()) { menu.showMenu(); return true; } return super.onKeyDown(keyCode, event); } }
MainAdapter:
package com.home.testslidingmenu; import android.content.Context; import android.util.TypedValue; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.ScrollView; import android.widget.TextView; import android.widget.Toast; import android.widget.FrameLayout.LayoutParams; import m.framework.ui.widget.slidingmenu.MenuAdapter; import m.framework.ui.widget.slidingmenu.SlidingMenu; import m.framework.ui.widget.slidingmenu.SlidingMenuItem; /** * 侧栏实际逻辑类。负责完成侧栏目录的展示、事件的监听、页面主体的显示和切换等等业务。 */ public class MainAdapter extends MenuAdapter { /** 第一组 */ public static final int GROUP_1 = 1; /** 第二组 */ public static final int GROUP_2 = 2; /** 第一项 */ public static final int ITEM_1 = 1; /** 第二项 */ public static final int ITEM_2 = 2; /** 第三项 */ public static final int ITEM_3 = 3; /** 第四项 */ public static final int ITEM_4 = 4; /** 第五项 */ public static final int ITEM_5 = 5; /** 第六项 */ public static final int ITEM_6 = 6; /** 第七项 */ public static final int ITEM_7 = 7; /** 第八项 */ public static final int ITEM_8 = 8; /** 第九项 */ public static final int ITEM_9 = 9; /** 第十项 */ public static final int ITEM_10 = 10; private SlidingMenu menu; private SlidingMenuItem curItem; public MainAdapter(SlidingMenu menu) { super(menu); this.menu = menu; initData(); } private void initData() { setGroup(GROUP_1, ""); setGroup(GROUP_2, "更多"); SlidingMenuItem item = new SlidingMenuItem(); item.id = ITEM_1; item.body = "Item1"; setItem(GROUP_1, item); item = new SlidingMenuItem(); item.id = ITEM_2; item.body = "Item2"; setItem(GROUP_1, item); item = new SlidingMenuItem(); item.id = ITEM_3; item.body = "Item3"; setItem(GROUP_1, item); item = new SlidingMenuItem(); item.id = ITEM_4; item.body = "Item4"; setItem(GROUP_1, item); item = new SlidingMenuItem(); item.id = ITEM_5; item.body = "Item5"; setItem(GROUP_1, item); item = new SlidingMenuItem(); item.id = ITEM_6; item.body = "Item6"; setItem(GROUP_2, item); item = new SlidingMenuItem(); item.id = ITEM_7; item.body = "Item7"; setItem(GROUP_2, item); item = new SlidingMenuItem(); item.id = ITEM_8; item.body = "Item8"; setItem(GROUP_2, item); item = new SlidingMenuItem(); item.id = ITEM_9; item.body = "Item9"; setItem(GROUP_2, item); item = new SlidingMenuItem(); item.id = ITEM_10; item.body = "Item10"; setItem(GROUP_2, item); } /** * dp转换成px * * @param context * @param dip * @return */ private int dipToPx(Context context, int dip) { return (int) (dip * context.getResources().getDisplayMetrics().density + 0.5f); } /** * 当菜单项被点击的时候,此方法会被触发。用于处理菜单项的业务逻辑 并加载对应的页面主体。 */ public boolean onItemTrigger(SlidingMenuItem item) { if (curItem != null && curItem.equals(item) && item.group == GROUP_1) { return false; } curItem = item; switch (item.group) { case GROUP_1: { SlidingMenuPage page = null; switch (item.id) { case ITEM_1: { page = new Page1(menu); } break; case ITEM_2: { page = new Page2(menu); } break; case ITEM_3: { Toast.makeText(menu.getContext(), "3", Toast.LENGTH_SHORT) .show(); } break; case ITEM_4: { Toast.makeText(menu.getContext(), "4", Toast.LENGTH_SHORT) .show(); } break; case ITEM_5: { Toast.makeText(menu.getContext(), "5", Toast.LENGTH_SHORT) .show(); } break; } if (page != null) { menu.setBodyView(page.getPage()); } } break; case GROUP_2: { switch (item.id) { case ITEM_6: { Toast.makeText(menu.getContext(), "6", Toast.LENGTH_SHORT) .show(); } break; case ITEM_7: { Toast.makeText(menu.getContext(), "7", Toast.LENGTH_SHORT) .show(); } break; case ITEM_8: { Toast.makeText(menu.getContext(), "8", Toast.LENGTH_SHORT) .show(); } break; case ITEM_9: { Toast.makeText(menu.getContext(), "9", Toast.LENGTH_SHORT) .show(); } break; case ITEM_10: { Toast.makeText(menu.getContext(), "10", Toast.LENGTH_SHORT) .show(); } break; } break; } } return false; } /** * 造“组”标题 */ @Override public View getGroupView(int position, ViewGroup menu) { String text = getTitle(position); if (text == null || text.length() <= 0) { return new LinearLayout(menu.getContext()); } TextView tvTitle = new TextView(menu.getContext()); tvTitle.setBackgroundResource(R.drawable.sidebar_titlt_back); int dp_13 = dipToPx(menu.getContext(), 13); int dp_5 = dipToPx(menu.getContext(), 3); tvTitle.setPadding(dp_13, dp_5, dp_13, dp_5); tvTitle.setText(text); tvTitle.setGravity(Gravity.CENTER_VERTICAL); tvTitle.setTextColor(0xff999999); tvTitle.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13); tvTitle.setLayoutParams(new ScrollView.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); return tvTitle; } /** * 造“菜单项” */ @Override public View getItemView(SlidingMenuItem item, ViewGroup menu) { TextView tvItem = new TextView(menu.getContext()); tvItem.setGravity(Gravity.CENTER_VERTICAL); tvItem.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 18); tvItem.setTextColor(tvItem.getResources().getColorStateList( R.color.normal_gray_pressed_white)); tvItem.setText(String.valueOf(item.body)); tvItem.setCompoundDrawablesWithIntrinsicBounds(0, 0, R.drawable.pointer, 0); int dp_13 = dipToPx(menu.getContext(), 13); tvItem.setCompoundDrawablePadding(dp_13); tvItem.setPadding(dp_13, 0, dp_13, 0); int dp_52 = dipToPx(menu.getContext(), 52); tvItem.setLayoutParams(new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, dp_52)); return tvItem; } }
Page1:
package com.home.testslidingmenu; import m.framework.ui.widget.slidingmenu.SlidingMenu; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; public class Page1 extends SlidingMenuPage implements OnClickListener { private ImageView backView; public Page1(final SlidingMenu menu) { super(menu); View pageView = getPage(); backView = (ImageView) pageView.findViewById(R.id.page1_iv_back); backView.setOnClickListener(this); } @Override protected View initPage() { return LayoutInflater.from(menu.getContext()).inflate(R.layout.page1, null); } @Override public void onClick(View v) { if (v == backView) { if (menu.isMenuShown()) { menu.hideMenu(); } else { menu.showMenu(); } } } }
Page2:
package com.home.testslidingmenu; import m.framework.ui.widget.slidingmenu.SlidingMenu; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; public class Page2 extends SlidingMenuPage implements OnClickListener { private ImageView backView; public Page2(final SlidingMenu menu) { super(menu); View pageView = getPage(); backView = (ImageView) pageView.findViewById(R.id.page2_iv_back); backView.setOnClickListener(this); } @Override protected View initPage() { return LayoutInflater.from(menu.getContext()).inflate(R.layout.page2, null); } @Override public void onClick(View v) { if (v == backView) { if (menu.isMenuShown()) { menu.hideMenu(); } else { menu.showMenu(); } } } }
SlidingMenuPage:
package com.home.testslidingmenu; import android.view.View; import m.framework.ui.widget.slidingmenu.SlidingMenu; /** 所有侧栏页面的父类 */ public abstract class SlidingMenuPage { protected SlidingMenu menu; private View pageView; public SlidingMenuPage(SlidingMenu menu) { this.menu = menu; pageView = initPage(); } protected abstract View initPage(); /** * 获取页面的View实例 * * @return */ public View getPage() { return pageView; } }
page1.xml:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <RelativeLayout android:layout_width="match_parent" android:layout_height="50dp" android:background="@drawable/auth_title_back" > <ImageView android:id="@+id/page1_iv_back" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:background="@drawable/image_back" /> <TextView android:id="@+id/page1_tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="Item1" android:textColor="#FFF" android:textSize="20sp" /> </RelativeLayout> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:gravity="center" android:text="This is the first page" /> </RelativeLayout>
page2.xml:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <RelativeLayout android:layout_width="match_parent" android:layout_height="50dp" android:background="@drawable/auth_title_back" > <ImageView android:id="@+id/page2_iv_back" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_centerVertical="true" android:background="@drawable/image_back" /> <TextView android:id="@+id/page2_tv_title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:text="Item2" android:textColor="#FFF" android:textSize="20sp" /> </RelativeLayout> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_centerInParent="true" android:gravity="center" android:text="This is the second page" /> </RelativeLayout>
colors.xml:
<?xml version="1.0" encoding="utf-8"?> <resources> <color name="sliding_menu_item_down">#ff39393b</color> <color name="sliding_menu_item_release">#00000000</color> <color name="sliding_menu_background">#ff2c2c2e</color> <color name="sliding_menu_body_background">#fff5f5f5</color> </resources>
drawable中image_back.xml:
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@drawable/returnback_normal" android:state_pressed="false"/> <item android:drawable="@drawable/returnback_press" android:state_pressed="true"/> </selector>
color中normal_gray_pressed_white.xml:
<?xml version="1.0" encoding="UTF-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:color="#ffffffff" /> <item android:state_focused="true" android:color="#ffffffff" /> <item android:color="#ffb1b1b1" /> </selector>
需要使用到的jar:mframework.jar和ShareSDK-Core-2.3.2.jar