抽象出Share SDK里面的侧滑效果

在使用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








抽象出Share SDK里面的侧滑效果

上一篇:精美素材:10套最新出炉的免费扁平图标下载


下一篇:Java 8即将正式发布