1.activity
package com.example.leftmenu;
import com.example.leftmenu.view.SlidMenu;
import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.ImageButton;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
final SlidMenu sm = (SlidMenu) findViewById(R.id.sm);
ImageButton ib_back = (ImageButton) sm.findViewById(R.id.ib_back);
ib_back.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
sm.switchState();
}
});
}
}
2.布局文件
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="${relativePackage}.${activityClass}" >
<com.example.leftmenu.view.SlidMenu
android:id="@+id/sm"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<include layout="@layout/item_diy_left" />
<include layout="@layout/item_diy_main" />
</com.example.leftmenu.view.SlidMenu>
</RelativeLayout>
item_diy_left.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="240dp"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="240dp"
android:layout_height="match_parent"
android:background="@drawable/menu_bg"
android:orientation="vertical" >
<TextView
style="@style/style_left_menu_item"
android:drawableLeft="@drawable/tab_news"
android:text="新闻" />
<TextView
style="@style/style_left_menu_item"
android:drawableLeft="@drawable/tab_read"
android:text="订阅" />
<TextView
style="@style/style_left_menu_item"
android:drawableLeft="@drawable/tab_local"
android:text="本地" />
<TextView
style="@style/style_left_menu_item"
android:drawableLeft="@drawable/tab_ties"
android:text="跟帖" />
<TextView
style="@style/style_left_menu_item"
android:drawableLeft="@drawable/tab_pics"
android:text="图片" />
<TextView
style="@style/style_left_menu_item"
android:drawableLeft="@drawable/tab_ugc"
android:text="话题" />
<TextView
style="@style/style_left_menu_item"
android:drawableLeft="@drawable/tab_vote"
android:text="投票" />
<TextView
style="@style/style_left_menu_item"
android:drawableLeft="@drawable/tab_focus"
android:text="聚合阅读" />
</LinearLayout>
</ScrollView>
item_diy_main.xml
<?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:background="#fff"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/top_bar_bg"
android:orientation="horizontal" >
<ImageButton
android:id="@+id/ib_back"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/main_back" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:background="@drawable/top_bar_divider" />
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:text="黑马新闻"
android:textColor="#fff"
android:textSize="26sp" />
</LinearLayout>
<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:text="信江嘛哪有"
android:textColor="#08e"
android:textSize="26sp" />
</LinearLayout>
三,自定义控件
package com.example.leftmenu.view;
import com.example.leftmenu.R;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageButton;
import android.widget.Scroller;
public class SlidMenu extends ViewGroup {
private float downX;
private float startX;
private float moveX;
private String tag = "SlidMenu";
private int leftWidth;
private int mainWidth;
private boolean isLeft = false;
private float endx;
private Scroller scroller;
private float downY;
private float moveY;
private float downX2;
private float downY2;
public SlidMenu(Context context) {
super(context);
init();
}
public SlidMenu(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public SlidMenu(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
/**
* 初始化控件
*/
private void init() {
scroller = new Scroller(getContext());
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// 得到子控件
View left_menu = getChildAt(0);
View main_view = getChildAt(1);
// 测量宽高
left_menu.measure(left_menu.getLayoutParams().width, heightMeasureSpec);
main_view.measure(widthMeasureSpec, heightMeasureSpec);
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
// 得到子控件
View left_menu = getChildAt(0);
View main_view = getChildAt(1);
leftWidth = left_menu.getMeasuredWidth();
mainWidth = main_view.getMeasuredWidth();
// 摆放(摆放完的布局,就是标准)
left_menu.layout(-leftWidth, t, 0, b);
main_view.layout(l, t, r, b);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = event.getX();
startX = downX;
break;
case MotionEvent.ACTION_MOVE:
moveX = event.getX();
// 得到这次移动的偏移量
int offset = (int) (startX - moveX);
int newScrollLength = getScrollX() + offset;
// 开始滑动
if (newScrollLength <= -leftWidth) {
scrollTo(-leftWidth, 0);
} else if (newScrollLength > 0) {
scrollTo(0, 0);
} else {
scrollBy(offset, 0);
}
startX = moveX;
break;
case MotionEvent.ACTION_UP:
int nowPlace = getScrollX();
if (nowPlace > -leftWidth / 2) {
isLeft = false;
} else {
isLeft = true;
}
updateState();
break;
}
return true;
}
/**
* 回归页面状态
*/
public void updateState() {
int startX = getScrollX();
int dx = 0;
if (isLeft) {
dx = -startX - leftWidth;
} else {
dx = -startX;
}
int duration = Math.abs(dx * 2);
scroller.startScroll(startX, 0, dx, 0, duration);
invalidate();
}
@Override
public void computeScroll() {
if (scroller.computeScrollOffset()) {
int offset = scroller.getCurrX();
scrollTo(offset, 0);
}
invalidate();
super.computeScroll();
}
/**
* 切换状态
*/
public void switchState() {
if (isLeft) {
close();
} else {
open();
}
}
private void close() {
isLeft = false;
updateState();
}
private void open() {
isLeft = true;
updateState();
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = ev.getX();
downY2 = ev.getY();
break;
case MotionEvent.ACTION_MOVE:
float moveX = ev.getX();
float moveY = ev.getY();
if (Math.abs(moveX - startX) > Math.abs(moveY - downY2)
&& Math.abs(moveX - startX) > 5) {
return true;
}
break;
default:
break;
}
return super.onInterceptTouchEvent(ev);
}
}