一个简单的侧滑,主要是重写了HorizontalScrollView,非常简单,我就不一一述说了,直接上代码,有不懂的可以留言,不过我得注释写的很清楚,大家应该都能看得懂,
下面就直接上代码,
重写HorizontalScrollView
import android.content.Context;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.MotionEvent;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
public class LeftMenu extends HorizontalScrollView {
Context context;
int width;// 屏幕的宽度
int left_width;// menu宽度
int scrolWidth;//滚动的宽度
boolean isOpen;//判断侧滑菜单是否显示
public LeftMenu(Context context) {
super(context);
this.context = context;
}
public LeftMenu(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
}
public LeftMenu(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
this.context = context;
}
//设置空间的大小
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//获取屏幕的宽度
WindowManager wm = (WindowManager) context.getSystemService(context.WINDOW_SERVICE);
DisplayMetrics outMetrics = new DisplayMetrics();
wm.getDefaultDisplay().getMetrics(outMetrics);
width = outMetrics.widthPixels;
left_width = (int) (width * 0.8);
scrolWidth = (int)(left_width/2);
LinearLayout wrapper = (LinearLayout) getChildAt(0);
ViewGroup leftmenu = (ViewGroup) wrapper.getChildAt(0);
ViewGroup content = (ViewGroup) wrapper.getChildAt(1);
leftmenu.getLayoutParams().width = left_width;//设置leftmenu的宽度
content.getLayoutParams().width = width;//设置正文的宽度
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
//设置控件的显示
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
if(changed){
this.scrollTo(left_width, 0);//隐藏leftmenu
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
int action = ev.getAction();
switch (action) {
case MotionEvent.ACTION_UP:
int scrollX = getScrollX();
//如果显示区域大于菜单宽度一半则完全显示,否则隐藏
if(scrollX >= scrolWidth){
this.smoothScrollTo(left_width, 0);
isOpen = false;
}else{
this.smoothScrollTo(0, 0);
isOpen = true;
}
break;
}
return super.onTouchEvent(ev);
}
//判断leftmenu的显示隐藏,主要用于外部按钮的设置menu的显示隐藏
public void openMenu() {
if(isOpen){
this.smoothScrollTo(left_width, 0);
isOpen = false;
}else{
this.smoothScrollTo(0, 0);
isOpen = true;
}
}
}
<LinearLayout 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" >
<com.example.ceshi.LeftMenu
android:id="@+id/main_hsv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="none" >
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal" >
<LinearLayout
android:id="@+id/main_menu"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#ff0000"
></LinearLayout>
<LinearLayout
android:id="@+id/main_centext"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#000000"
>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="打开"
android:id="@+id/main_btn"
/>
</LinearLayout>
</LinearLayout>
</com.example.ceshi.LeftMenu>
</LinearLayout>
Activity的实现
import android.os.Bundle;
import android.app.Activity;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.LinearLayout;
public class MainActivity extends Activity {
LeftMenu main_hsv;//滚动条
LinearLayout main_menu;//左侧菜单
LinearLayout main_centext;//正文
Button main_btn;//显示和隐藏menu的按钮
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initview();
//按钮点击事件,设置menu的显示隐藏
main_btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
main_hsv.openMenu();
}
});
}
//实例化控件
private void initview() {
main_hsv = (LeftMenu) this.findViewById(R.id.main_hsv);
main_menu = (LinearLayout) this.findViewById(R.id.main_menu);
main_centext = (LinearLayout) this.findViewById(R.id.main_centext);
main_btn = (Button) this.findViewById(R.id.main_btn);
}
}