侧滑UI

时间:2023-03-08 18:26:06

1、视图

activity_main.xml

 <com.zyhui.cehua.SlidingMenu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:id="@+id/menu"
android:background="#ffffff"
android:scrollbars="none"
android:fadingEdge="none"
> <LinearLayout
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<include layout="@layout/menu" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#0000ff"
> </LinearLayout>
</LinearLayout> </com.zyhui.cehua.SlidingMenu>

menu.xml

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#00ff00"
android:orientation="vertical" >
<Button
android:id="@+id/btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="abc"
/> </LinearLayout>

2、清单文件

 <?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.zyhui.cehua"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="16" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.zyhui.cehua.MainActivity"
android:label="@string/app_name"
android:theme="@android:style/Theme.NoTitleBar"
>
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>

3、MainActivity

 package com.zyhui.cehua;

 import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.app.Activity; public class MainActivity extends Activity {
private SlidingMenu sdMenu;
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); sdMenu = (SlidingMenu) findViewById(R.id.menu);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
sdMenu.goLeft();
}
});
} }

4、SlidingMenu

 package com.zyhui.cehua;

 import android.content.Context;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.MotionEvent;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;

  

//===================================================
//自定义控件的一般套路:
//1、重新父类的构造器
//2、视情况重写onMeasure、onLayout、onDraw和onTouchEvent方法
// onMeasure方法:测试自身及子控件尺寸的.它会调用setMeasureDimension方法
// onLayout方法:对自身及子控件进行布局是调用.它会调用layout方法
//===================================================

 //HorizontalScrollView可以参考这个http://www.xuebuyuan.com/2162142.html地址
public class SlidingMenu extends HorizontalScrollView {
private ViewGroup mMenu;
private ViewGroup mMain;
private int mRightPadding = 0;
private int mScreenWidth;
private int mMenuWidth;
private float downX;
    //为什么要第二个参数的构造器?因为需要xml文件的属性设置载入
public SlidingMenu(Context context, AttributeSet attrs) {
super(context, attrs); WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
DisplayMetrics outMetrics = new DisplayMetrics();
display.getMetrics(outMetrics); //屏幕宽
mScreenWidth = outMetrics.widthPixels;
} //此方法是可以设置控件的宽高
    //什么时候会调用该方法?答:当控件的父元素正要放置该控件时调用.父元素会问子控件一个问题,“你想要用多大地方啊?”
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
LinearLayout wrapper = (LinearLayout) getChildAt(0);
mMenu = (ViewGroup) wrapper.getChildAt(0);
mMain = (ViewGroup) wrapper.getChildAt(1); //菜单宽度
mMenuWidth = mScreenWidth - mRightPadding;
mMenu.getLayoutParams().width = mMenuWidth;//设置菜单宽度 //主界面宽度
mMain.getLayoutParams().width = mScreenWidth; super.onMeasure(widthMeasureSpec, heightMeasureSpec);
} @Override
public boolean onTouchEvent(MotionEvent ev) {
switch(ev.getAction()){
case MotionEvent.ACTION_DOWN:
downX = ev.getX();
break;
case MotionEvent.ACTION_UP:
int d = (int) (ev.getX() - downX);
//往左
if(d < 0){
this.smoothScrollTo(mMenuWidth, 0);
}else{//往右
this.smoothScrollTo(0, 0);
}
break;
default:
break;
}
return true;
} //决定视图的摆放位置
    //onLayout叫做布局方法;它是在调用onMeasure后调用,可以看这个链接的开头:http://blog.****.net/yhb5566/article/details/7327075
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
this.scrollBy(mMenuWidth, 0);
} public void goLeft(){
this.smoothScrollTo(mMenuWidth, 0);
} }

更加完善的效果可以参考此人博客:http://www.cnblogs.com/lichenwei/p/4111252.html?utm_source=tuicool&utm_medium=referral