效果图:

SlidingMenu.java
-
package cn.com.xiebiao.horizontalscrollviewtest;
-
-
import android.content.Context;
-
import android.util.AttributeSet;
-
import android.util.DisplayMetrics;
-
import android.util.TypedValue;
-
import android.view.MotionEvent;
-
import android.view.ViewGroup;
-
import android.view.WindowManager;
-
import android.widget.HorizontalScrollView;
-
import android.widget.LinearLayout;
-
-
import com.nineoldandroids.view.ViewHelper;
-
-
/**
-
* Created by vibexie on 3/25/15.
-
*/
-
public class SlidingMenu extends HorizontalScrollView {
-
private LinearLayout mWapper;
-
private ViewGroup mMenu;
-
private ViewGroup mContent;
-
-
//屏幕宽度
-
private int mScreenWidth;
-
//显示menu时,主界面在右边显示的宽度
-
private int mMenuRightPadding;
-
-
//设置menu和主界面的宽度
-
private int mMenuWidth;
-
//onMeasure方法调用一次
-
private boolean once=false;
-
//menu是否开启
-
private boolean isMenuOpen=false;
-
-
//未使用自定义属性时,调用构造方法
-
public SlidingMenu(Context context,AttributeSet attributeSet){
-
super(context,attributeSet);
-
-
WindowManager windowManager=(WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
-
DisplayMetrics displayMetrics=new DisplayMetrics();
-
windowManager.getDefaultDisplay().getMetrics(displayMetrics);
-
-
//获得屏幕宽度
-
mScreenWidth=displayMetrics.widthPixels;
-
-
//100转化为一个像素值px
-
mMenuRightPadding=(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,100,context.getResources().getDisplayMetrics());
-
}
-
-
//设置子view的宽和高
-
@Override
-
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
-
//调用一次
-
if(!once){
-
//内部的第一个view是linearLayout
-
mWapper=(LinearLayout)getChildAt(0);
-
//linearLayout内部的第一个view是leftmenu
-
mMenu=(ViewGroup)mWapper.getChildAt(0);
-
//linearLayout内部的第二个view是LinearLayout
-
mContent=(ViewGroup)mWapper.getChildAt(1);
-
-
//设置menu的宽度
-
mMenuWidth=mMenu.getLayoutParams().width=mScreenWidth-mMenuRightPadding;
-
-
//设置主界面的宽度
-
mContent.getLayoutParams().width=mScreenWidth;
-
-
once=true;
-
}
-
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
-
}
-
-
//通过设置偏移里量,将menu隐藏,changed表示是否发生改变
-
@Override
-
protected void onLayout(boolean changed, int l, int t, int r, int b) {
-
super.onLayout(changed, l, t, r, b);
-
//将整个界面右移menu的宽度,以显示主界面
-
if(changed) {
-
this.scrollTo(mMenuWidth, 0);
-
}
-
}
-
-
@Override
-
public boolean onTouchEvent(MotionEvent ev) {
-
int action=ev.getAction();
-
switch (action){
-
case MotionEvent.ACTION_UP:
-
//menu向右移动的宽度,大于屏幕的1/2则切换到menu,否则回到主界面
-
//getScrollX()获取当前屏幕左上角相对于整个HorizontalScrollView左上角和x方向距离,单位px
-
int scrollX=getScrollX();
-
if(scrollX>=(mMenuWidth/2)){
-
this.smoothScrollTo(mMenuWidth,0);
-
-
}else {
-
this.smoothScrollTo(0,0);
-
isMenuOpen=true;
-
}
-
return true;
-
}
-
return super.onTouchEvent(ev);
-
}
-
-
//menu和主界面互相请切换的方法
-
public void toggle(){
-
if(isMenuOpen){
-
this.smoothScrollTo(mMenuWidth,0);
-
isMenuOpen=false;
-
}else {
-
this.smoothScrollTo(0,0);
-
isMenuOpen=true;
-
}
-
}
-
-
//l为getScrollX,t为getScrollY,old顾名思意为之前的值
-
@Override
-
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
-
//ViewHelper需添加nineoldandroids.jar包,以兼容android3.0以下版本
-
//menu旋转效果
-
//ViewHelper.setRotationX(mMenu,l/10);
-
//menu抽屉效果
-
//ViewHelper.setTranslationX(mMenu,l);
-
-
float scale=(float)(l/(mMenuWidth*1.0));
-
//右滑,主界面的缩放效果,从1放到0.8
-
float mContentScale=(float)(0.8+0.2*scale);
-
ViewHelper.setPivotX(mContent,l);
-
ViewHelper.setPivotY(mContent,mContent.getHeight()/2);
-
ViewHelper.setScaleX(mContent,mContentScale);
-
ViewHelper.setScaleY(mContent,mContentScale);
-
-
//右滑,menu的缩放效果,从0.7放到1
-
float mMenuScale=(float)(0.7+0.4*(1-scale));
-
ViewHelper.setScaleX(mMenu,mMenuScale);
-
ViewHelper.setScaleY(mMenu,mMenuScale);
-
ViewHelper.setAlpha(mMenu,mMenuScale);
-
//menu向右滑出
-
ViewHelper.setTranslationX(mMenu,l*scale*0.9f);
-
super.onScrollChanged(l, t, oldl, oldt);
-
}
- }
left_menu.xml
-
<?xml version="1.0" encoding="utf-8"?>
-
<RelativeLayout xmlns:android=""
-
android:layout_width="360dp"
-
android:layout_height="match_parent">
-
-
<LinearLayout
-
android:layout_width="match_parent"
-
android:layout_height="wrap_content"
-
android:orientation="vertical"
-
android:layout_centerInParent="true">
-
-
<RelativeLayout
-
android:layout_width="match_parent"
-
android:layout_height="wrap_content">
-
<ImageView
-
android:layout_width="wrap_content"
-
android:layout_height="wrap_content"
-
android:id="@+id/image1"
-
android:src="@drawable/photo1"
-
android:layout_marginLeft="20dp"
-
android:layout_marginTop="20dp"/>
-
<TextView
-
android:layout_width="wrap_content"
-
android:layout_height="wrap_content"
-
android:id="@+id/text1"
-
android:text="第一个Item"
-
android:textSize="30sp"
-
android:layout_toRightOf="@+id/image1"
-
android:layout_marginLeft="20dp"
-
android:layout_centerHorizontal="true"
-
android:layout_marginTop="20dp"/>
-
</RelativeLayout>
-
-
-
-
<RelativeLayout
-
android:layout_width="wrap_content"
-
android:layout_height="wrap_content">
-
<ImageView
-
android:layout_width="wrap_content"
-
android:layout_height="wrap_content"
-
android:id="@+id/image2"
-
android:src="@drawable/photo2"
-
android:layout_marginLeft="20dp"
-
android:layout_marginTop="20dp"/>
-
<TextView
-
android:layout_width="wrap_content"
-
android:layout_height="wrap_content"
-
android:id="@+id/text2"
-
android:text="第二个Item"
-
android:textSize="30sp"
-
android:layout_toRightOf="@+id/image2"
-
android:layout_marginLeft="20dp"
-
android:layout_centerHorizontal="true"
-
android:layout_marginTop="20dp"/>
-
</RelativeLayout>
-
-
-
<RelativeLayout
-
android:layout_width="wrap_content"
-
android:layout_height="wrap_content">
-
<ImageView
-
android:layout_width="wrap_content"
-
android:layout_height="wrap_content"
-
android:id="@+id/image3"
-
android:src="@drawable/photo3"
-
android:layout_marginLeft="20dp"
-
android:layout_marginTop="20dp"/>
-
<TextView
-
android:layout_width="wrap_content"
-
android:layout_height="wrap_content"
-
android:id="@+id/text3"
-
android:text="第三个Item"
-
android:textSize="30sp"
-
android:layout_toRightOf="@+id/image3"
-
android:layout_marginLeft="20dp"
-
android:layout_centerHorizontal="true"
-
android:layout_marginTop="20dp"/>
-
</RelativeLayout>
-
-
-
<RelativeLayout
-
android:layout_width="wrap_content"
-
android:layout_height="wrap_content">
-
<ImageView
-
android:layout_width="wrap_content"
-
android:layout_height="wrap_content"
-
android:id="@+id/image4"
-
android:src="@drawable/photo4"
-
android:layout_marginLeft="20dp"
-
android:layout_marginTop="20dp"/>
-
<TextView
-
android:layout_width="wrap_content"
-
android:layout_height="wrap_content"
-
android:id="@+id/text4"
-
android:text="第四个Item"
-
android:textSize="30sp"
-
android:layout_toRightOf="@+id/image4"
-
android:layout_marginLeft="20dp"
-
android:layout_centerHorizontal="true"
-
android:layout_marginTop="20dp"/>
-
</RelativeLayout>
-
-
</LinearLayout>
-
-
- </RelativeLayout>
activity_main.xml
-
<RelativeLayout xmlns:android=""
-
xmlns:tools="" android:layout_width="match_parent"
-
android:layout_height="match_parent"
-
android:background="@drawable/menu">
-
<cn.com.xiebiao.horizontalscrollviewtest.SlidingMenu
-
android:layout_width="match_parent"
-
android:layout_height="match_parent"
-
android:id="@+id/id_menu">
-
-
<LinearLayout
-
android:layout_width="wrap_content"
-
android:layout_height="match_parent"
-
android:orientation="horizontal">
-
<include layout="@layout/left_menu"></include>
-
<LinearLayout
-
android:layout_width="360dp"
-
android:layout_height="match_parent"
-
android:background="@drawable/qq"
-
android:paddingTop="25dp">
-
-
<Button
-
android:layout_width="wrap_content"
-
android:layout_height="wrap_content"
-
android:id="@+id/toggle"
-
android:onClick="toggleMenu"
-
android:text="《menu"/>
-
-
</LinearLayout>
-
</LinearLayout>
-
-
</cn.com.xiebiao.horizontalscrollviewtest.SlidingMenu>
-
- </RelativeLayout>
MainActivity.java
-
package cn.com.xiebiao.horizontalscrollviewtest;
-
-
import android.app.Activity;
-
import android.os.Bundle;
-
import android.view.Menu;
-
import android.view.MenuItem;
-
import android.view.View;
-
-
-
public class MainActivity extends Activity {
-
private SlidingMenu slidingMenu;
-
@Override
-
protected void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
setContentView(R.layout.activity_main);
-
slidingMenu=(SlidingMenu)this.findViewById(R.id.id_menu);
-
}
-
-
public void toggleMenu(View view){
-
slidingMenu.toggle();
-
}
-
-
-
@Override
-
public boolean onCreateOptionsMenu(Menu menu) {
-
// Inflate the menu; this adds items to the action bar if it is present.
-
getMenuInflater().inflate(R.menu.menu_main, menu);
-
return true;
-
}
-
-
@Override
-
public boolean onOptionsItemSelected(MenuItem item) {
-
// Handle action bar item clicks here. The action bar will
-
// automatically handle clicks on the Home/Up button, so long
-
// as you specify a parent activity in AndroidManifest.xml.
-
int id = item.getItemId();
-
-
//noinspection SimplifiableIfStatement
-
if (id == R.id.action_settings) {
-
return true;
-
}
-
return super.onOptionsItemSelected(item);
-
}
- }
AndroidMainfest.java
-
<?xml version="1.0" encoding="utf-8"?>
-
<manifest xmlns:android=""
-
package="cn.com.xiebiao.horizontalscrollviewtest" >
-
-
<application
-
android:allowBackup="true"
-
android:icon="@mipmap/ic_launcher"
-
android:label="@string/app_name"
-
android:theme="@android:style/Theme.NoTitleBar" >
-
<activity
-
android:name=".MainActivity"
-
android:label="@string/app_name" >
-
<intent-filter>
-
<action android:name="android.intent.action.MAIN" />
-
-
<category android:name="android.intent.category.LAUNCHER" />
-
</intent-filter>
-
</activity>
-
</application>
-
- </manifest>