AndroidResideMenu

先看看如何使用:
把项目源码下载下来导入工程,可以看到

ResideMenu为引用工程,再看看如何使用这个引用工程来构建出ResideMenu,
1.先new一个ResideMenu对象
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`resideMenu = ``new` `ResideMenu(``this``);`
</div>
</div>
</td>
</tr>
</table>
2.设置它的背景图片
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`resideMenu.setBackground(R.drawable.menu_background);`
</div>
</div>
</td>
</tr>
</table>
3.绑定当前Activity
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`resideMenu.attachToActivity(``this``);`
</div>
</div>
</td>
</tr>
</table>
4.设置监听
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`resideMenu.setMenuListener(menuListener);`
</div>
</div>
</td>
</tr>
</table>
可以监听菜单打开和关闭状态
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
<div class="line number3 index2 alt2">
3
</div>
<div class="line number4 index3 alt1">
4
</div>
<div class="line number5 index4 alt2">
5
</div>
<div class="line number6 index5 alt1">
6
</div>
<div class="line number7 index6 alt2">
7
</div>
<div class="line number8 index7 alt1">
8
</div>
<div class="line number9 index8 alt2">
9
</div>
<div class="line number10 index9 alt1">
10
</div>
<div class="line number11 index10 alt2">
11
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`private` `ResideMenu.OnMenuListener menuListener = ``new` `ResideMenu.OnMenuListener() {`
</div>
<div class="line number2 index1 alt1">
` ``@Override`
</div>
<div class="line number3 index2 alt2">
` ``public` `void` `openMenu() {`
</div>
<div class="line number4 index3 alt1">
` ``Toast.makeText(mContext, Menu is opened!, Toast.LENGTH_SHORT).show();`
</div>
<div class="line number5 index4 alt2">
` ``}`
</div>
<div class="line number6 index5 alt1">
</div>
<div class="line number7 index6 alt2">
` ``@Override`
</div>
<div class="line number8 index7 alt1">
` ``public` `void` `closeMenu() {`
</div>
<div class="line number9 index8 alt2">
` ``Toast.makeText(mContext, Menu is closed!, Toast.LENGTH_SHORT).show();`
</div>
<div class="line number10 index9 alt1">
` ``}`
</div>
<div class="line number11 index10 alt2">
`};`
</div>
</div>
</td>
</tr>
</table>
5.设置内容缩放比例(0.1~1f)
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`//valid scale factor is between 0.0f and 1.0f. leftmenu'width is 150dip. `
</div>
<div class="line number2 index1 alt1">
` ``resideMenu.setScaleValue(````.6f);`
</div>
</div>
</td>
</tr>
</table>
6.创建子菜单
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
<div class="line number3 index2 alt2">
3
</div>
<div class="line number4 index3 alt1">
4
</div>
<div class="line number5 index4 alt2">
5
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`// create menu items;`
</div>
<div class="line number2 index1 alt1">
` ``itemHome = ``new` `ResideMenuItem(``this``, R.drawable.icon_home, Home);`
</div>
<div class="line number3 index2 alt2">
` ``itemProfile = ``new` `ResideMenuItem(``this``, R.drawable.icon_profile, Profile);`
</div>
<div class="line number4 index3 alt1">
` ``itemCalendar = ``new` `ResideMenuItem(``this``, R.drawable.icon_calendar, Calendar);`
</div>
<div class="line number5 index4 alt2">
` ``itemSettings = ``new` `ResideMenuItem(``this``, R.drawable.icon_settings, Settings);`
</div>
</div>
</td>
</tr>
</table>
7.设置点击事件及将刚创建的子菜单添加到侧换菜单中(可以看到它是通过常量来控制子菜单的添加位置)
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
<div class="line number3 index2 alt2">
3
</div>
<div class="line number4 index3 alt1">
4
</div>
<div class="line number5 index4 alt2">
5
</div>
<div class="line number6 index5 alt1">
6
</div>
<div class="line number7 index6 alt2">
7
</div>
<div class="line number8 index7 alt1">
8
</div>
<div class="line number9 index8 alt2">
9
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`itemHome.setOnClickListener(``this``);`
</div>
<div class="line number2 index1 alt1">
` ``itemProfile.setOnClickListener(``this``);`
</div>
<div class="line number3 index2 alt2">
` ``itemCalendar.setOnClickListener(``this``);`
</div>
<div class="line number4 index3 alt1">
` ``itemSettings.setOnClickListener(``this``);`
</div>
<div class="line number5 index4 alt2">
</div>
<div class="line number6 index5 alt1">
` ``resideMenu.addMenuItem(itemHome, ResideMenu.DIRECTION_LEFT);`
</div>
<div class="line number7 index6 alt2">
` ``resideMenu.addMenuItem(itemProfile, ResideMenu.DIRECTION_LEFT);`
</div>
<div class="line number8 index7 alt1">
` ``resideMenu.addMenuItem(itemCalendar, ResideMenu.DIRECTION_RIGHT);`
</div>
<div class="line number9 index8 alt2">
` ``resideMenu.addMenuItem(itemSettings, ResideMenu.DIRECTION_RIGHT);`
</div>
</div>
</td>
</tr>
</table>
8.设置title按钮的点击事件,设置左右菜单的开关
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
<div class="line number3 index2 alt2">
3
</div>
<div class="line number4 index3 alt1">
4
</div>
<div class="line number5 index4 alt2">
5
</div>
<div class="line number6 index5 alt1">
6
</div>
<div class="line number7 index6 alt2">
7
</div>
<div class="line number8 index7 alt1">
8
</div>
<div class="line number9 index8 alt2">
9
</div>
<div class="line number10 index9 alt1">
10
</div>
<div class="line number11 index10 alt2">
11
</div>
<div class="line number12 index11 alt1">
12
</div>
<div class="line number13 index12 alt2">
13
</div>
<div class="line number14 index13 alt1">
14
</div>
<div class="line number15 index14 alt2">
15
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`// You can disable a direction by setting ->`
</div>
<div class="line number2 index1 alt1">
` ``// resideMenu.setSwipeDirectionDisable(ResideMenu.DIRECTION_RIGHT);`
</div>
<div class="line number3 index2 alt2">
</div>
<div class="line number4 index3 alt1">
` ``findViewById(R.id.title_bar_left_menu).setOnClickListener(``new` `View.OnClickListener() {`
</div>
<div class="line number5 index4 alt2">
` ``@Override`
</div>
<div class="line number6 index5 alt1">
` ``public` `void` `onClick(View view) {`
</div>
<div class="line number7 index6 alt2">
` ``resideMenu.openMenu(ResideMenu.DIRECTION_LEFT);`
</div>
<div class="line number8 index7 alt1">
` ``}`
</div>
<div class="line number9 index8 alt2">
` ``});`
</div>
<div class="line number10 index9 alt1">
` ``findViewById(R.id.title_bar_right_menu).setOnClickListener(``new` `View.OnClickListener() {`
</div>
<div class="line number11 index10 alt2">
` ``@Override`
</div>
<div class="line number12 index11 alt1">
` ``public` `void` `onClick(View view) {`
</div>
<div class="line number13 index12 alt2">
` ``resideMenu.openMenu(ResideMenu.DIRECTION_RIGHT);`
</div>
<div class="line number14 index13 alt1">
` ``}`
</div>
<div class="line number15 index14 alt2">
` ``});`
</div>
</div>
</td>
</tr>
</table>
9.还重写了dispatchTouchEvent
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
<div class="line number3 index2 alt2">
3
</div>
<div class="line number4 index3 alt1">
4
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`@Override`
</div>
<div class="line number2 index1 alt1">
` ``public` `boolean` `dispatchTouchEvent(MotionEvent ev) {`
</div>
<div class="line number3 index2 alt2">
` ``return` `resideMenu.dispatchTouchEvent(ev);`
</div>
<div class="line number4 index3 alt1">
` ``}`
</div>
</div>
</td>
</tr>
</table>
10.菜单关闭方法
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`resideMenu.closeMenu();`
</div>
</div>
</td>
</tr>
</table>
11.屏蔽菜单方法
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`// You can disable a direction by setting ->`
</div>
<div class="line number2 index1 alt1">
` ``// resideMenu.setSwipeDirectionDisable(ResideMenu.DIRECTION_RIGHT);`
</div>
</div>
</td>
</tr>
</table>
使用方法已经说完了,接下来,看看它的源码,先看看源码的项目结构。

很多人初学者都曾纠结,看源码,如何从何看起,我个人建议从上面使用的顺序看起,并且在看的时候要带个问题去看去思考,这样更容易理解。
上面的第一步是,创建ResideMenu对象,我们就看看ResideMenu的构造。
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
<div class="line number3 index2 alt2">
3
</div>
<div class="line number4 index3 alt1">
4
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`public` `ResideMenu(Context context) {`
</div>
<div class="line number2 index1 alt1">
` ``super``(context);`
</div>
<div class="line number3 index2 alt2">
` ``initViews(context);`
</div>
<div class="line number4 index3 alt1">
` ``}`
</div>
</div>
</td>
</tr>
</table>
从上面代码,看到构造里面就一个初始化view,思考问题:如何初始化view及初始化了什么view。
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
<div class="line number3 index2 alt2">
3
</div>
<div class="line number4 index3 alt1">
4
</div>
<div class="line number5 index4 alt2">
5
</div>
<div class="line number6 index5 alt1">
6
</div>
<div class="line number7 index6 alt2">
7
</div>
<div class="line number8 index7 alt1">
8
</div>
<div class="line number9 index8 alt2">
9
</div>
<div class="line number10 index9 alt1">
10
</div>
<div class="line number11 index10 alt2">
11
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`private` `void` `initViews(Context context){`
</div>
<div class="line number2 index1 alt1">
` ``LayoutInflater inflater = (LayoutInflater)`
</div>
<div class="line number3 index2 alt2">
` ``context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);`
</div>
<div class="line number4 index3 alt1">
` ``inflater.inflate(R.layout.residemenu, ``this``);`
</div>
<div class="line number5 index4 alt2">
` ``scrollViewLeftMenu = (ScrollView) findViewById(R.id.sv_left_menu);`
</div>
<div class="line number6 index5 alt1">
` ``scrollViewRightMenu = (ScrollView) findViewById(R.id.sv_right_menu);`
</div>
<div class="line number7 index6 alt2">
` ``imageViewShadow = (ImageView) findViewById(R.id.iv_shadow);`
</div>
<div class="line number8 index7 alt1">
` ``layoutLeftMenu = (LinearLayout) findViewById(R.id.layout_left_menu);`
</div>
<div class="line number9 index8 alt2">
` ``layoutRightMenu = (LinearLayout) findViewById(R.id.layout_right_menu);`
</div>
<div class="line number10 index9 alt1">
` ``imageViewBackground = (ImageView) findViewById(R.id.iv_background);`
</div>
<div class="line number11 index10 alt2">
` ``}`
</div>
</div>
</td>
</tr>
</table>
原理分析:从上面的代码可以看到,加载了一个residemenu的布局,先看布局
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
<div class="line number3 index2 alt2">
3
</div>
<div class="line number4 index3 alt1">
4
</div>
<div class="line number5 index4 alt2">
5
</div>
<div class="line number6 index5 alt1">
6
</div>
<div class="line number7 index6 alt2">
7
</div>
<div class="line number8 index7 alt1">
8
</div>
<div class="line number9 index8 alt2">
9
</div>
<div class="line number10 index9 alt1">
10
</div>
<div class="line number11 index10 alt2">
11
</div>
<div class="line number12 index11 alt1">
12
</div>
<div class="line number13 index12 alt2">
13
</div>
<div class="line number14 index13 alt1">
14
</div>
<div class="line number15 index14 alt2">
15
</div>
<div class="line number16 index15 alt1">
16
</div>
<div class="line number17 index16 alt2">
17
</div>
<div class="line number18 index17 alt1">
18
</div>
<div class="line number19 index18 alt2">
19
</div>
<div class="line number20 index19 alt1">
20
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`<!--?xml version=``1.0` `encoding=utf-``8``?-->`
</div>
<div class="line number2 index1 alt1">
</div>
<div class="line number3 index2 alt2">
`<framelayout android:layout_height=``"match_parent"` `android:layout_width=``"match_parent"` `xmlns:android=``"<a href="http://schemas.android.com/apk/res/android">http://schemas.android.com/apk/res/android</a>"``>`
</div>
<div class="line number4 index3 alt1">
` ``<imageview android:adjustviewbounds=``"true"` `android:id=``"@+id/iv_background"` `android:layout_height=``"match_parent/"` `android:layout_width=``"match_parent"` `android:scaletype=``"centerCrop"``>`
</div>
<div class="line number5 index4 alt2">
</div>
<div class="line number6 index5 alt1">
` ``<imageview android:background=``"@drawable/shadow"` `android:id=``"@+id/iv_shadow"` `android:layout_height=``"fill_parent"` `android:layout_width=``"fill_parent"` `android:scaletype=``"fitXY/"``>`
</div>
<div class="line number7 index6 alt2">
</div>
<div class="line number8 index7 alt1">
` ``<scrollview android:id=``"@+id/sv_left_menu"` `android:layout_height=``"fill_parent"` `android:layout_width=``"150dp"` `android:paddingleft=``"30dp"` `android:scrollbars=``"none"``>`
</div>
<div class="line number9 index8 alt2">
` ``<linearlayout android:id=``"@+id/layout_left_menu"` `android:layout_gravity=``"center_vertical"` `android:layout_height=``"wrap_content"` `android:layout_width=``"wrap_content"` `android:orientation=``"vertical"``>`
</div>
<div class="line number10 index9 alt1">
</div>
<div class="line number11 index10 alt2">
` ``</linearlayout>`
</div>
<div class="line number12 index11 alt1">
` ``</scrollview>`
</div>
<div class="line number13 index12 alt2">
</div>
<div class="line number14 index13 alt1">
` ``<scrollview android:id=``"@+id/sv_right_menu"` `android:layout_gravity=``"right"` `android:layout_height=``"fill_parent"` `android:layout_width=``"150dp"` `android:paddingright=``"30dp"` `android:scrollbars=``"none"``>`
</div>
<div class="line number15 index14 alt2">
` ``<linearlayout android:gravity=``"right"` `android:id=``"@+id/layout_right_menu"` `android:layout_gravity=``"center_vertical"` `android:layout_height=``"wrap_content"` `android:layout_width=``"wrap_content"` `android:orientation=``"vertical"``>`
</div>
<div class="line number16 index15 alt1">
</div>
<div class="line number17 index16 alt2">
` ``</linearlayout>`
</div>
<div class="line number18 index17 alt1">
` ``</scrollview>`
</div>
<div class="line number19 index18 alt2">
</div>
<div class="line number20 index19 alt1">
`</imageview></imageview></framelayout>`
</div>
</div>
</td>
</tr>
</table>
布局显示效果

从布局文件,以及显示效果我们可以看到,它是一个帧布局,第一个ImageView是背景,第二个ImageView是.9的阴影效果的图片(看下面的图),
两个(ScrollView包裹着一个LinerLayout),可以从上面图看到结构分别是左菜单和右菜单
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
</div>
</div>
</td>
</tr>
</table>

1.初始化布局以及布局文件分析完毕,2.接下来是设置背景图,初始化view的时候就已经拿到了背景控件,所以设置背景图也是非常好实现的事情了。
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
<div class="line number3 index2 alt2">
3
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`public` `void` `setBackground(``int` `imageResrouce){`
</div>
<div class="line number2 index1 alt1">
` ``imageViewBackground.setImageResource(imageResrouce);`
</div>
<div class="line number3 index2 alt2">
` ``}`
</div>
</div>
</td>
</tr>
</table>
3.绑定activity,思考问题:它做了什么?
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
<div class="line number3 index2 alt2">
3
</div>
<div class="line number4 index3 alt1">
4
</div>
<div class="line number5 index4 alt2">
5
</div>
<div class="line number6 index5 alt1">
6
</div>
<div class="line number7 index6 alt2">
7
</div>
<div class="line number8 index7 alt1">
8
</div>
<div class="line number9 index8 alt2">
9
</div>
<div class="line number10 index9 alt1">
10
</div>
<div class="line number11 index10 alt2">
11
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`/**`
</div>
<div class="line number2 index1 alt1">
` ``* use the method to set up the activity which residemenu need to show;`
</div>
<div class="line number3 index2 alt2">
` ``*`
</div>
<div class="line number4 index3 alt1">
` ``* @param activity`
</div>
<div class="line number5 index4 alt2">
` ``*/`
</div>
<div class="line number6 index5 alt1">
` ``public` `void` `attachToActivity(Activity activity){`
</div>
<div class="line number7 index6 alt2">
` ``initValue(activity);`
</div>
<div class="line number8 index7 alt1">
` ``setShadowAdjustScaleXByOrientation();`
</div>
<div class="line number9 index8 alt2">
` ``viewDecor.addView(``this``, ````);`
</div>
<div class="line number10 index9 alt1">
` ``setViewPadding();`
</div>
<div class="line number11 index10 alt2">
` ``}`
</div>
</div>
</td>
</tr>
</table>
</div>
原理分析:绑定activity做了4件事情,分别是:
1.初始化参数:
<div>
<div id="highlighter_491650" class="syntaxhighlighter java">
<div class="toolbar">
[?](http://www.2cto.com/kf/201409/332224.html#)
</div>
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
<div class="line number3 index2 alt2">
3
</div>
<div class="line number4 index3 alt1">
4
</div>
<div class="line number5 index4 alt2">
5
</div>
<div class="line number6 index5 alt1">
6
</div>
<div class="line number7 index6 alt2">
7
</div>
<div class="line number8 index7 alt1">
8
</div>
<div class="line number9 index8 alt2">
9
</div>
<div class="line number10 index9 alt1">
10
</div>
<div class="line number11 index10 alt2">
11
</div>
<div class="line number12 index11 alt1">
12
</div>
<div class="line number13 index12 alt2">
13
</div>
<div class="line number14 index13 alt1">
14
</div>
<div class="line number15 index14 alt2">
15
</div>
<div class="line number16 index15 alt1">
16
</div>
<div class="line number17 index16 alt2">
17
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`private` `void` `initValue(Activity activity){`
</div>
<div class="line number2 index1 alt1">
` ``this``.activity = activity;`
</div>
<div class="line number3 index2 alt2">
` ``leftMenuItems = ``new` `ArrayList<residemenuitem>();`
</div>
<div class="line number4 index3 alt1">
` ``rightMenuItems = ``new` `ArrayList<residemenuitem>();`
</div>
<div class="line number5 index4 alt2">
` ``ignoredViews = ``new` `ArrayList<view>();`
</div>
<div class="line number6 index5 alt1">
` ``viewDecor = (ViewGroup) activity.getWindow().getDecorView();`
</div>
<div class="line number7 index6 alt2">
` ``viewActivity = ``new` `TouchDisableView(``this``.activity);`
</div>
<div class="line number8 index7 alt1">
</div>
<div class="line number9 index8 alt2">
` ``View mContent = viewDecor.getChildAt(````);`
</div>
<div class="line number10 index9 alt1">
` ``viewDecor.removeViewAt(````);`
</div>
<div class="line number11 index10 alt2">
` ``viewActivity.setContent(mContent);`
</div>
<div class="line number12 index11 alt1">
` ``addView(viewActivity);`
</div>
<div class="line number13 index12 alt2">
</div>
<div class="line number14 index13 alt1">
` ``ViewGroup parent = (ViewGroup) scrollViewLeftMenu.getParent();`
</div>
<div class="line number15 index14 alt2">
` ``parent.removeView(scrollViewLeftMenu);`
</div>
<div class="line number16 index15 alt1">
` ``parent.removeView(scrollViewRightMenu);`
</div>
<div class="line number17 index16 alt2">
`}</view></residemenuitem></residemenuitem>`
</div>
</div>
</td>
</tr>
</table>
</div>
</div>
2.正对横竖屏缩放比例进行调整
<div>
<div id="highlighter_875164" class="syntaxhighlighter java">
<div class="toolbar">
[?](http://www.2cto.com/kf/201409/332224.html#)
</div>
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
<div class="line number3 index2 alt2">
3
</div>
<div class="line number4 index3 alt1">
4
</div>
<div class="line number5 index4 alt2">
5
</div>
<div class="line number6 index5 alt1">
6
</div>
<div class="line number7 index6 alt2">
7
</div>
<div class="line number8 index7 alt1">
8
</div>
<div class="line number9 index8 alt2">
9
</div>
<div class="line number10 index9 alt1">
10
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`private` `void` `setShadowAdjustScaleXByOrientation(){`
</div>
<div class="line number2 index1 alt1">
` ``int` `orientation = getResources().getConfiguration().orientation;`
</div>
<div class="line number3 index2 alt2">
` ``if` `(orientation == Configuration.ORIENTATION_LANDSCAPE) {`
</div>
<div class="line number4 index3 alt1">
` ``shadowAdjustScaleX = ````.034f;`
</div>
<div class="line number5 index4 alt2">
` ``shadowAdjustScaleY = ````.12f;`
</div>
<div class="line number6 index5 alt1">
` ``} ``else` `if` `(orientation == Configuration.ORIENTATION_PORTRAIT) {`
</div>
<div class="line number7 index6 alt2">
` ``shadowAdjustScaleX = ````.06f;`
</div>
<div class="line number8 index7 alt1">
` ``shadowAdjustScaleY = ````.07f;`
</div>
<div class="line number9 index8 alt2">
` ``}`
</div>
<div class="line number10 index9 alt1">
` ``}`
</div>
</div>
</td>
</tr>
</table>
</div>
</div>
3.添加当前view
<div>
<div id="highlighter_800309" class="syntaxhighlighter java">
<div class="toolbar">
[?](http://www.2cto.com/kf/201409/332224.html#)
</div>
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`viewDecor.addView(``this``, ````);`
</div>
</div>
</td>
</tr>
</table>
</div>
</div>
4.设置view边距
<div>
<div id="highlighter_276247" class="syntaxhighlighter java">
<div class="toolbar">
[?](http://www.2cto.com/kf/201409/332224.html#)
</div>
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
<div class="line number3 index2 alt2">
3
</div>
<div class="line number4 index3 alt1">
4
</div>
<div class="line number5 index4 alt2">
5
</div>
<div class="line number6 index5 alt1">
6
</div>
<div class="line number7 index6 alt2">
7
</div>
<div class="line number8 index7 alt1">
8
</div>
<div class="line number9 index8 alt2">
9
</div>
<div class="line number10 index9 alt1">
10
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`/**`
</div>
<div class="line number2 index1 alt1">
` ``* we need the call the method before the menu show, because the`
</div>
<div class="line number3 index2 alt2">
` ``* padding of activity can't get at the moment of onCreateView();`
</div>
<div class="line number4 index3 alt1">
` ``*/`
</div>
<div class="line number5 index4 alt2">
` ``private` `void` `setViewPadding(){`
</div>
<div class="line number6 index5 alt1">
` ``this``.setPadding(viewActivity.getPaddingLeft(),`
</div>
<div class="line number7 index6 alt2">
` ``viewActivity.getPaddingTop(),`
</div>
<div class="line number8 index7 alt1">
` ``viewActivity.getPaddingRight(),`
</div>
<div class="line number9 index8 alt2">
` ``viewActivity.getPaddingBottom());`
</div>
<div class="line number10 index9 alt1">
` ``}`
</div>
</div>
</td>
</tr>
</table>
</div>
</div>
4.设置监听,思考问题:它什么时候调用监听,原理分析:动画监听开始执行动画掉哦那个openMenu动画结束调用closeMenu,从此我们可以想到,但它调用openMenu(int direction)和closeMenu()都会设置这个监听。
<div>
<div id="highlighter_50179" class="syntaxhighlighter java">
<div class="toolbar">
[?](http://www.2cto.com/kf/201409/332224.html#)
</div>
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
<div class="line number3 index2 alt2">
3
</div>
<div class="line number4 index3 alt1">
4
</div>
<div class="line number5 index4 alt2">
5
</div>
<div class="line number6 index5 alt1">
6
</div>
<div class="line number7 index6 alt2">
7
</div>
<div class="line number8 index7 alt1">
8
</div>
<div class="line number9 index8 alt2">
9
</div>
<div class="line number10 index9 alt1">
10
</div>
<div class="line number11 index10 alt2">
11
</div>
<div class="line number12 index11 alt1">
12
</div>
<div class="line number13 index12 alt2">
13
</div>
<div class="line number14 index13 alt1">
14
</div>
<div class="line number15 index14 alt2">
15
</div>
<div class="line number16 index15 alt1">
16
</div>
<div class="line number17 index16 alt2">
17
</div>
<div class="line number18 index17 alt1">
18
</div>
<div class="line number19 index18 alt2">
19
</div>
<div class="line number20 index19 alt1">
20
</div>
<div class="line number21 index20 alt2">
21
</div>
<div class="line number22 index21 alt1">
22
</div>
<div class="line number23 index22 alt2">
23
</div>
<div class="line number24 index23 alt1">
24
</div>
<div class="line number25 index24 alt2">
25
</div>
<div class="line number26 index25 alt1">
26
</div>
<div class="line number27 index26 alt2">
27
</div>
<div class="line number28 index27 alt1">
28
</div>
<div class="line number29 index28 alt2">
29
</div>
<div class="line number30 index29 alt1">
30
</div>
<div class="line number31 index30 alt2">
31
</div>
<div class="line number32 index31 alt1">
32
</div>
<div class="line number33 index32 alt2">
33
</div>
<div class="line number34 index33 alt1">
34
</div>
<div class="line number35 index34 alt2">
35
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`private` `Animator.AnimatorListener animationListener = ``new` `Animator.AnimatorListener() {`
</div>
<div class="line number2 index1 alt1">
` ``@Override`
</div>
<div class="line number3 index2 alt2">
` ``public` `void` `onAnimationStart(Animator animation) {`
</div>
<div class="line number4 index3 alt1">
` ``if` `(isOpened()){`
</div>
<div class="line number5 index4 alt2">
` ``showScrollViewMenu();`
</div>
<div class="line number6 index5 alt1">
` ``if` `(menuListener != ``null``)`
</div>
<div class="line number7 index6 alt2">
` ``menuListener.openMenu();`
</div>
<div class="line number8 index7 alt1">
` ``}`
</div>
<div class="line number9 index8 alt2">
` ``}`
</div>
<div class="line number10 index9 alt1">
</div>
<div class="line number11 index10 alt2">
` ``@Override`
</div>
<div class="line number12 index11 alt1">
` ``public` `void` `onAnimationEnd(Animator animation) {`
</div>
<div class="line number13 index12 alt2">
` ``// reset the view;`
</div>
<div class="line number14 index13 alt1">
` ``if``(isOpened()){`
</div>
<div class="line number15 index14 alt2">
` ``viewActivity.setTouchDisable(``true``);`
</div>
<div class="line number16 index15 alt1">
` ``viewActivity.setOnClickListener(viewActivityOnClickListener);`
</div>
<div class="line number17 index16 alt2">
` ``}``else``{`
</div>
<div class="line number18 index17 alt1">
` ``viewActivity.setTouchDisable(``false``);`
</div>
<div class="line number19 index18 alt2">
` ``viewActivity.setOnClickListener(``null``);`
</div>
<div class="line number20 index19 alt1">
` ``hideScrollViewMenu();`
</div>
<div class="line number21 index20 alt2">
` ``if` `(menuListener != ``null``)`
</div>
<div class="line number22 index21 alt1">
` ``menuListener.closeMenu();`
</div>
<div class="line number23 index22 alt2">
` ``}`
</div>
<div class="line number24 index23 alt1">
` ``}`
</div>
<div class="line number25 index24 alt2">
</div>
<div class="line number26 index25 alt1">
` ``@Override`
</div>
<div class="line number27 index26 alt2">
` ``public` `void` `onAnimationCancel(Animator animation) {`
</div>
<div class="line number28 index27 alt1">
</div>
<div class="line number29 index28 alt2">
` ``}`
</div>
<div class="line number30 index29 alt1">
</div>
<div class="line number31 index30 alt2">
` ``@Override`
</div>
<div class="line number32 index31 alt1">
` ``public` `void` `onAnimationRepeat(Animator animation) {`
</div>
<div class="line number33 index32 alt2">
</div>
<div class="line number34 index33 alt1">
` ``}`
</div>
<div class="line number35 index34 alt2">
` ``};`
</div>
</div>
</td>
</tr>
</table>
</div>
</div>
5.设置内容缩放比例(0.1~1f),细心的同学会发现在当缩完成后还可以在往里面拉到更小,有种弹性的感觉,挺有趣的。但是有些人的需求不想要有这种弹性效果,我们可以通过修改源码修改这个弹性效果,找到getTargetScale这个方法,修改下面0.5这个数值。使用时设置了0.6的缩放比例,默认下面的弹性参数是0.5所以我们当缩完成后还可以在往里面拉0.1的比例。
<div>
<div id="highlighter_849856" class="syntaxhighlighter java">
<div class="toolbar">
[?](http://www.2cto.com/kf/201409/332224.html#)
</div>
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
<div class="line number3 index2 alt2">
3
</div>
<div class="line number4 index3 alt1">
4
</div>
<div class="line number5 index4 alt2">
5
</div>
<div class="line number6 index5 alt1">
6
</div>
<div class="line number7 index6 alt2">
7
</div>
<div class="line number8 index7 alt1">
8
</div>
<div class="line number9 index8 alt2">
9
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`private` `float` `getTargetScale(``float` `currentRawX){`
</div>
<div class="line number2 index1 alt1">
` ``float` `scaleFloatX = ((currentRawX - lastRawX) / getScreenWidth()) * ````.75f;`
</div>
<div class="line number3 index2 alt2">
` ``scaleFloatX = scaleDirection == DIRECTION_RIGHT ? - scaleFloatX : scaleFloatX;`
</div>
<div class="line number4 index3 alt1">
</div>
<div class="line number5 index4 alt2">
` ``float` `targetScale = ViewHelper.getScaleX(viewActivity) - scaleFloatX;`
</div>
<div class="line number6 index5 alt1">
` ``targetScale = targetScale > ``1``.0f ? ``1``.0f : targetScale;`
</div>
<div class="line number7 index6 alt2">
` ``targetScale = targetScale < ````.5f ? ````.5f : targetScale;`
</div>
<div class="line number8 index7 alt1">
` ``return` `targetScale;`
</div>
<div class="line number9 index8 alt2">
`}`
</div>
</div>
</td>
</tr>
</table>
</div>
</div>
默认缩放比例:
<div>
<div id="highlighter_387269" class="syntaxhighlighter java">
<div class="toolbar">
[?](http://www.2cto.com/kf/201409/332224.html#)
</div>
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`//valid scale factor is between 0.0f and 1.0f.`
</div>
<div class="line number2 index1 alt1">
` ``private` `float` `mScaleValue = ````.5f;`
</div>
</div>
</td>
</tr>
</table>
</div>
</div>
<div>
<div id="highlighter_786345" class="syntaxhighlighter java">
<div class="toolbar">
[?](http://www.2cto.com/kf/201409/332224.html#)
</div>
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`AnimatorSet scaleDown_activity = buildScaleDownAnimation(viewActivity, mScaleValue, mScaleValue);`
</div>
</div>
</td>
</tr>
</table>
</div>
</div>
<div>
<div id="highlighter_737569" class="syntaxhighlighter java">
<div class="toolbar">
[?](http://www.2cto.com/kf/201409/332224.html#)
</div>
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
<div class="line number3 index2 alt2">
3
</div>
<div class="line number4 index3 alt1">
4
</div>
<div class="line number5 index4 alt2">
5
</div>
<div class="line number6 index5 alt1">
6
</div>
<div class="line number7 index6 alt2">
7
</div>
<div class="line number8 index7 alt1">
8
</div>
<div class="line number9 index8 alt2">
9
</div>
<div class="line number10 index9 alt1">
10
</div>
<div class="line number11 index10 alt2">
11
</div>
<div class="line number12 index11 alt1">
12
</div>
<div class="line number13 index12 alt2">
13
</div>
<div class="line number14 index13 alt1">
14
</div>
<div class="line number15 index14 alt2">
15
</div>
<div class="line number16 index15 alt1">
16
</div>
<div class="line number17 index16 alt2">
17
</div>
<div class="line number18 index17 alt1">
18
</div>
<div class="line number19 index18 alt2">
19
</div>
<div class="line number20 index19 alt1">
20
</div>
<div class="line number21 index20 alt2">
21
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`/**`
</div>
<div class="line number2 index1 alt1">
` ``* a helper method to build scale down animation;`
</div>
<div class="line number3 index2 alt2">
` ``*`
</div>
<div class="line number4 index3 alt1">
` ``* @param target`
</div>
<div class="line number5 index4 alt2">
` ``* @param targetScaleX`
</div>
<div class="line number6 index5 alt1">
` ``* @param targetScaleY`
</div>
<div class="line number7 index6 alt2">
` ``* @return`
</div>
<div class="line number8 index7 alt1">
` ``*/`
</div>
<div class="line number9 index8 alt2">
` ``private` `AnimatorSet buildScaleDownAnimation(View target,``float` `targetScaleX,``float` `targetScaleY){`
</div>
<div class="line number10 index9 alt1">
</div>
<div class="line number11 index10 alt2">
` ``AnimatorSet scaleDown = ``new` `AnimatorSet();`
</div>
<div class="line number12 index11 alt1">
` ``scaleDown.playTogether(`
</div>
<div class="line number13 index12 alt2">
` ``ObjectAnimator.ofFloat(target, scaleX, targetScaleX),`
</div>
<div class="line number14 index13 alt1">
` ``ObjectAnimator.ofFloat(target, scaleY, targetScaleY)`
</div>
<div class="line number15 index14 alt2">
` ``);`
</div>
<div class="line number16 index15 alt1">
</div>
<div class="line number17 index16 alt2">
` ``scaleDown.setInterpolator(AnimationUtils.loadInterpolator(activity,`
</div>
<div class="line number18 index17 alt1">
` ``android.R.anim.decelerate_interpolator));`
</div>
<div class="line number19 index18 alt2">
` ``scaleDown.setDuration(``250``);`
</div>
<div class="line number20 index19 alt1">
` ``return` `scaleDown;`
</div>
<div class="line number21 index20 alt2">
` ``}`
</div>
</div>
</td>
</tr>
</table>
</div>
</div>
6.创建子菜单,看下子菜单的构造,我们通过上面的学习,原理分析:我们可以猜测到,无非就是加载布局设置内容
<div>
<div id="highlighter_727811" class="syntaxhighlighter java">
<div class="toolbar">
[?](http://www.2cto.com/kf/201409/332224.html#)
</div>
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
<div class="line number3 index2 alt2">
3
</div>
<div class="line number4 index3 alt1">
4
</div>
<div class="line number5 index4 alt2">
5
</div>
<div class="line number6 index5 alt1">
6
</div>
<div class="line number7 index6 alt2">
7
</div>
<div class="line number8 index7 alt1">
8
</div>
<div class="line number9 index8 alt2">
9
</div>
<div class="line number10 index9 alt1">
10
</div>
<div class="line number11 index10 alt2">
11
</div>
<div class="line number12 index11 alt1">
12
</div>
<div class="line number13 index12 alt2">
13
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`public` `ResideMenuItem(Context context, ``int` `icon, String title) {`
</div>
<div class="line number2 index1 alt1">
` ``super``(context);`
</div>
<div class="line number3 index2 alt2">
` ``initViews(context);`
</div>
<div class="line number4 index3 alt1">
` ``iv_icon.setImageResource(icon);`
</div>
<div class="line number5 index4 alt2">
` ``tv_title.setText(title);`
</div>
<div class="line number6 index5 alt1">
` ``}`
</div>
<div class="line number7 index6 alt2">
</div>
<div class="line number8 index7 alt1">
` ``private` `void` `initViews(Context context){`
</div>
<div class="line number9 index8 alt2">
` ``LayoutInflater inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);`
</div>
<div class="line number10 index9 alt1">
` ``inflater.inflate(R.layout.residemenu_item, ``this``);`
</div>
<div class="line number11 index10 alt2">
` ``iv_icon = (ImageView) findViewById(R.id.iv_icon);`
</div>
<div class="line number12 index11 alt1">
` ``tv_title = (TextView) findViewById(R.id.tv_title);`
</div>
<div class="line number13 index12 alt2">
` ``}`
</div>
</div>
</td>
</tr>
</table>
</div>
</div>
布局文件:
<div>
<div id="highlighter_266937" class="syntaxhighlighter java">
<div class="toolbar">
[?](http://www.2cto.com/kf/201409/332224.html#)
</div>
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
<div class="line number3 index2 alt2">
3
</div>
<div class="line number4 index3 alt1">
4
</div>
<div class="line number5 index4 alt2">
5
</div>
<div class="line number6 index5 alt1">
6
</div>
<div class="line number7 index6 alt2">
7
</div>
<div class="line number8 index7 alt1">
8
</div>
<div class="line number9 index8 alt2">
9
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`<!--?xml version=``1.0` `encoding=utf-``8``?-->`
</div>
<div class="line number2 index1 alt1">
</div>
<div class="line number3 index2 alt2">
`<linearlayout android:gravity=``"center_vertical"` `android:layout_height=``"wrap_content"` `android:layout_width=``"match_parent"` `android:orientation=``"horizontal"` `android:paddingtop=``"30dp"` `xmlns:android=``"<a href="http://schemas.android.com/apk/res/android">http://schemas.android.com/apk/res/android</a>"``>`
</div>
<div class="line number4 index3 alt1">
</div>
<div class="line number5 index4 alt2">
` ``<imageview android:id=``"@+id/iv_icon/"` `android:layout_height=``"30dp"` `android:layout_width=``"30dp"` `android:scaletype=``"centerCrop"``>`
</div>
<div class="line number6 index5 alt1">
</div>
<div class="line number7 index6 alt2">
` ``<textview android:id=``"@+id/tv_title/"` `android:layout_height=``"wrap_content"` `android:layout_marginleft=``"10dp"` `android:layout_width=``"match_parent"` `android:textcolor=``"@android:color/white"` `android:textsize=``"18sp"``>`
</div>
<div class="line number8 index7 alt1">
</div>
<div class="line number9 index8 alt2">
`</textview></imageview></linearlayout>`
</div>
</div>
</td>
</tr>
</table>
</div>
</div>
显示效果图:

7.子菜单添加到侧换菜单中(可以看到它是通过常量来控制子菜单的添加位置)原理分析:根据不同的常量来区分添加不同菜单的子菜单
<div>
<div id="highlighter_947418" class="syntaxhighlighter java">
<div class="toolbar">
[?](http://www.2cto.com/kf/201409/332224.html#)
</div>
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
<div class="line number3 index2 alt2">
3
</div>
<div class="line number4 index3 alt1">
4
</div>
<div class="line number5 index4 alt2">
5
</div>
<div class="line number6 index5 alt1">
6
</div>
<div class="line number7 index6 alt2">
7
</div>
<div class="line number8 index7 alt1">
8
</div>
<div class="line number9 index8 alt2">
9
</div>
<div class="line number10 index9 alt1">
10
</div>
<div class="line number11 index10 alt2">
11
</div>
<div class="line number12 index11 alt1">
12
</div>
<div class="line number13 index12 alt2">
13
</div>
<div class="line number14 index13 alt1">
14
</div>
<div class="line number15 index14 alt2">
15
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`/**`
</div>
<div class="line number2 index1 alt1">
` ``* add a single items;`
</div>
<div class="line number3 index2 alt2">
` ``*`
</div>
<div class="line number4 index3 alt1">
` ``* @param menuItem`
</div>
<div class="line number5 index4 alt2">
` ``* @param direction`
</div>
<div class="line number6 index5 alt1">
` ``*/`
</div>
<div class="line number7 index6 alt2">
` ``public` `void` `addMenuItem(ResideMenuItem menuItem, ``int` `direction){`
</div>
<div class="line number8 index7 alt1">
` ``if` `(direction == DIRECTION_LEFT){`
</div>
<div class="line number9 index8 alt2">
` ``this``.leftMenuItems.add(menuItem);`
</div>
<div class="line number10 index9 alt1">
` ``layoutLeftMenu.addView(menuItem);`
</div>
<div class="line number11 index10 alt2">
` ``}``else``{`
</div>
<div class="line number12 index11 alt1">
` ``this``.rightMenuItems.add(menuItem);`
</div>
<div class="line number13 index12 alt2">
` ``layoutRightMenu.addView(menuItem);`
</div>
<div class="line number14 index13 alt1">
` ``}`
</div>
<div class="line number15 index14 alt2">
` ``}`
</div>
</div>
</td>
</tr>
</table>
</div>
</div>
8.设置title按钮的点击事件,设置左右菜单的开关,原理分析:先设置了缩放方向然后在设置动画,正如我们上面想的一样还设置了动画监听。
<div>
<div id="highlighter_968606" class="syntaxhighlighter java">
<div class="toolbar">
[?](http://www.2cto.com/kf/201409/332224.html#)
</div>
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
<div class="line number3 index2 alt2">
3
</div>
<div class="line number4 index3 alt1">
4
</div>
<div class="line number5 index4 alt2">
5
</div>
<div class="line number6 index5 alt1">
6
</div>
<div class="line number7 index6 alt2">
7
</div>
<div class="line number8 index7 alt1">
8
</div>
<div class="line number9 index8 alt2">
9
</div>
<div class="line number10 index9 alt1">
10
</div>
<div class="line number11 index10 alt2">
11
</div>
<div class="line number12 index11 alt1">
12
</div>
<div class="line number13 index12 alt2">
13
</div>
<div class="line number14 index13 alt1">
14
</div>
<div class="line number15 index14 alt2">
15
</div>
<div class="line number16 index15 alt1">
16
</div>
<div class="line number17 index16 alt2">
17
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`/**`
</div>
<div class="line number2 index1 alt1">
` ``* show the reside menu;`
</div>
<div class="line number3 index2 alt2">
` ``*/`
</div>
<div class="line number4 index3 alt1">
`public` `void` `openMenu(``int` `direction){`
</div>
<div class="line number5 index4 alt2">
</div>
<div class="line number6 index5 alt1">
` ``setScaleDirection(direction);`
</div>
<div class="line number7 index6 alt2">
</div>
<div class="line number8 index7 alt1">
` ``isOpened = ``true``;`
</div>
<div class="line number9 index8 alt2">
` ``AnimatorSet scaleDown_activity = buildScaleDownAnimation(viewActivity, mScaleValue, mScaleValue);`
</div>
<div class="line number10 index9 alt1">
` ``AnimatorSet scaleDown_shadow = buildScaleDownAnimation(imageViewShadow,`
</div>
<div class="line number11 index10 alt2">
` ``mScaleValue + shadowAdjustScaleX, mScaleValue + shadowAdjustScaleY);`
</div>
<div class="line number12 index11 alt1">
` ``AnimatorSet alpha_menu = buildMenuAnimation(scrollViewMenu, ``1``.0f);`
</div>
<div class="line number13 index12 alt2">
` ``scaleDown_shadow.addListener(animationListener);`
</div>
<div class="line number14 index13 alt1">
` ``scaleDown_activity.playTogether(scaleDown_shadow);`
</div>
<div class="line number15 index14 alt2">
` ``scaleDown_activity.playTogether(alpha_menu);`
</div>
<div class="line number16 index15 alt1">
` ``scaleDown_activity.start();`
</div>
<div class="line number17 index16 alt2">
`}`
</div>
</div>
</td>
</tr>
</table>
</div>
</div>
设置缩放方向及计算x,y轴位置。
<div>
<div id="highlighter_444663" class="syntaxhighlighter java">
<div class="toolbar">
[?](http://www.2cto.com/kf/201409/332224.html#)
</div>
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
<div class="line number3 index2 alt2">
3
</div>
<div class="line number4 index3 alt1">
4
</div>
<div class="line number5 index4 alt2">
5
</div>
<div class="line number6 index5 alt1">
6
</div>
<div class="line number7 index6 alt2">
7
</div>
<div class="line number8 index7 alt1">
8
</div>
<div class="line number9 index8 alt2">
9
</div>
<div class="line number10 index9 alt1">
10
</div>
<div class="line number11 index10 alt2">
11
</div>
<div class="line number12 index11 alt1">
12
</div>
<div class="line number13 index12 alt2">
13
</div>
<div class="line number14 index13 alt1">
14
</div>
<div class="line number15 index14 alt2">
15
</div>
<div class="line number16 index15 alt1">
16
</div>
<div class="line number17 index16 alt2">
17
</div>
<div class="line number18 index17 alt1">
18
</div>
<div class="line number19 index18 alt2">
19
</div>
<div class="line number20 index19 alt1">
20
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`private` `void` `setScaleDirection(``int` `direction){`
</div>
<div class="line number2 index1 alt1">
</div>
<div class="line number3 index2 alt2">
` ``int` `screenWidth = getScreenWidth();`
</div>
<div class="line number4 index3 alt1">
` ``float` `pivotX;`
</div>
<div class="line number5 index4 alt2">
` ``float` `pivotY = getScreenHeight() * ````.5f;`
</div>
<div class="line number6 index5 alt1">
</div>
<div class="line number7 index6 alt2">
` ``if` `(direction == DIRECTION_LEFT){`
</div>
<div class="line number8 index7 alt1">
` ``scrollViewMenu = scrollViewLeftMenu;`
</div>
<div class="line number9 index8 alt2">
` ``pivotX = screenWidth * ``1``.5f;`
</div>
<div class="line number10 index9 alt1">
` ``}``else``{`
</div>
<div class="line number11 index10 alt2">
` ``scrollViewMenu = scrollViewRightMenu;`
</div>
<div class="line number12 index11 alt1">
` ``pivotX = screenWidth * -````.5f;`
</div>
<div class="line number13 index12 alt2">
` ``}`
</div>
<div class="line number14 index13 alt1">
</div>
<div class="line number15 index14 alt2">
` ``ViewHelper.setPivotX(viewActivity, pivotX);`
</div>
<div class="line number16 index15 alt1">
` ``ViewHelper.setPivotY(viewActivity, pivotY);`
</div>
<div class="line number17 index16 alt2">
` ``ViewHelper.setPivotX(imageViewShadow, pivotX);`
</div>
<div class="line number18 index17 alt1">
` ``ViewHelper.setPivotY(imageViewShadow, pivotY);`
</div>
<div class="line number19 index18 alt2">
` ``scaleDirection = direction;`
</div>
<div class="line number20 index19 alt1">
`}`
</div>
</div>
</td>
</tr>
</table>
</div>
</div>
9.重写dispatchTouchEvent,问题思考:如何到根据手指滑动自动缩放
如果还不了解,dispatchTouchEvent这个函数如何调用?什么时候调用?请先看看http://blog.csdn.net/cym492224103/article/details/39179311
<div>
<div id="highlighter_475966" class="syntaxhighlighter java">
<div class="toolbar">
[?](http://www.2cto.com/kf/201409/332224.html#)
</div>
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
<div class="line number3 index2 alt2">
3
</div>
<div class="line number4 index3 alt1">
4
</div>
<div class="line number5 index4 alt2">
5
</div>
<div class="line number6 index5 alt1">
6
</div>
<div class="line number7 index6 alt2">
7
</div>
<div class="line number8 index7 alt1">
8
</div>
<div class="line number9 index8 alt2">
9
</div>
<div class="line number10 index9 alt1">
10
</div>
<div class="line number11 index10 alt2">
11
</div>
<div class="line number12 index11 alt1">
12
</div>
<div class="line number13 index12 alt2">
13
</div>
<div class="line number14 index13 alt1">
14
</div>
<div class="line number15 index14 alt2">
15
</div>
<div class="line number16 index15 alt1">
16
</div>
<div class="line number17 index16 alt2">
17
</div>
<div class="line number18 index17 alt1">
18
</div>
<div class="line number19 index18 alt2">
19
</div>
<div class="line number20 index19 alt1">
20
</div>
<div class="line number21 index20 alt2">
21
</div>
<div class="line number22 index21 alt1">
22
</div>
<div class="line number23 index22 alt2">
23
</div>
<div class="line number24 index23 alt1">
24
</div>
<div class="line number25 index24 alt2">
25
</div>
<div class="line number26 index25 alt1">
26
</div>
<div class="line number27 index26 alt2">
27
</div>
<div class="line number28 index27 alt1">
28
</div>
<div class="line number29 index28 alt2">
29
</div>
<div class="line number30 index29 alt1">
30
</div>
<div class="line number31 index30 alt2">
31
</div>
<div class="line number32 index31 alt1">
32
</div>
<div class="line number33 index32 alt2">
33
</div>
<div class="line number34 index33 alt1">
34
</div>
<div class="line number35 index34 alt2">
35
</div>
<div class="line number36 index35 alt1">
36
</div>
<div class="line number37 index36 alt2">
37
</div>
<div class="line number38 index37 alt1">
38
</div>
<div class="line number39 index38 alt2">
39
</div>
<div class="line number40 index39 alt1">
40
</div>
<div class="line number41 index40 alt2">
41
</div>
<div class="line number42 index41 alt1">
42
</div>
<div class="line number43 index42 alt2">
43
</div>
<div class="line number44 index43 alt1">
44
</div>
<div class="line number45 index44 alt2">
45
</div>
<div class="line number46 index45 alt1">
46
</div>
<div class="line number47 index46 alt2">
47
</div>
<div class="line number48 index47 alt1">
48
</div>
<div class="line number49 index48 alt2">
49
</div>
<div class="line number50 index49 alt1">
50
</div>
<div class="line number51 index50 alt2">
51
</div>
<div class="line number52 index51 alt1">
52
</div>
<div class="line number53 index52 alt2">
53
</div>
<div class="line number54 index53 alt1">
54
</div>
<div class="line number55 index54 alt2">
55
</div>
<div class="line number56 index55 alt1">
56
</div>
<div class="line number57 index56 alt2">
57
</div>
<div class="line number58 index57 alt1">
58
</div>
<div class="line number59 index58 alt2">
59
</div>
<div class="line number60 index59 alt1">
60
</div>
<div class="line number61 index60 alt2">
61
</div>
<div class="line number62 index61 alt1">
62
</div>
<div class="line number63 index62 alt2">
63
</div>
<div class="line number64 index63 alt1">
64
</div>
<div class="line number65 index64 alt2">
65
</div>
<div class="line number66 index65 alt1">
66
</div>
<div class="line number67 index66 alt2">
67
</div>
<div class="line number68 index67 alt1">
68
</div>
<div class="line number69 index68 alt2">
69
</div>
<div class="line number70 index69 alt1">
70
</div>
<div class="line number71 index70 alt2">
71
</div>
<div class="line number72 index71 alt1">
72
</div>
<div class="line number73 index72 alt2">
73
</div>
<div class="line number74 index73 alt1">
74
</div>
<div class="line number75 index74 alt2">
75
</div>
<div class="line number76 index75 alt1">
76
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`@Override`
</div>
<div class="line number2 index1 alt1">
`public` `boolean` `dispatchTouchEvent(MotionEvent ev) {`
</div>
<div class="line number3 index2 alt2">
` ``float` `currentActivityScaleX = ViewHelper.getScaleX(viewActivity);`
</div>
<div class="line number4 index3 alt1">
` ``if` `(currentActivityScaleX == ``1``.0f)`
</div>
<div class="line number5 index4 alt2">
` ``setScaleDirectionByRawX(ev.getRawX());`
</div>
<div class="line number6 index5 alt1">
</div>
<div class="line number7 index6 alt2">
` ``switch` `(ev.getAction()){`
</div>
<div class="line number8 index7 alt1">
` ``case` `MotionEvent.ACTION_DOWN:`
</div>
<div class="line number9 index8 alt2">
` ``lastActionDownX = ev.getX();`
</div>
<div class="line number10 index9 alt1">
` ``lastActionDownY = ev.getY();`
</div>
<div class="line number11 index10 alt2">
` ``isInIgnoredView = isInIgnoredView(ev) && !isOpened();`
</div>
<div class="line number12 index11 alt1">
` ``pressedState = PRESSED_DOWN;`
</div>
<div class="line number13 index12 alt2">
` ``break``;`
</div>
<div class="line number14 index13 alt1">
</div>
<div class="line number15 index14 alt2">
` ``case` `MotionEvent.ACTION_MOVE:`
</div>
<div class="line number16 index15 alt1">
` ``if` `(isInIgnoredView || isInDisableDirection(scaleDirection))`
</div>
<div class="line number17 index16 alt2">
` ``break``;`
</div>
<div class="line number18 index17 alt1">
</div>
<div class="line number19 index18 alt2">
` ``if``(pressedState != PRESSED_DOWN &&`
</div>
<div class="line number20 index19 alt1">
` ``pressedState != PRESSED_MOVE_HORIZANTAL)`
</div>
<div class="line number21 index20 alt2">
` ``break``;`
</div>
<div class="line number22 index21 alt1">
</div>
<div class="line number23 index22 alt2">
` ``int` `xOffset = (``int``) (ev.getX() - lastActionDownX);`
</div>
<div class="line number24 index23 alt1">
` ``int` `yOffset = (``int``) (ev.getY() - lastActionDownY);`
</div>
<div class="line number25 index24 alt2">
</div>
<div class="line number26 index25 alt1">
` ``if``(pressedState == PRESSED_DOWN) {`
</div>
<div class="line number27 index26 alt2">
` ``if``(yOffset > ``25` `|| yOffset < -``25``) {`
</div>
<div class="line number28 index27 alt1">
` ``pressedState = PRESSED_MOVE_VERTICAL;`
</div>
<div class="line number29 index28 alt2">
` ``break``;`
</div>
<div class="line number30 index29 alt1">
` ``}`
</div>
<div class="line number31 index30 alt2">
` ``if``(xOffset < -``50` `|| xOffset > ``50``) {`
</div>
<div class="line number32 index31 alt1">
` ``pressedState = PRESSED_MOVE_HORIZANTAL;`
</div>
<div class="line number33 index32 alt2">
` ``ev.setAction(MotionEvent.ACTION_CANCEL);`
</div>
<div class="line number34 index33 alt1">
` ``}`
</div>
<div class="line number35 index34 alt2">
` ``} ``else` `if``(pressedState == PRESSED_MOVE_HORIZANTAL) {`
</div>
<div class="line number36 index35 alt1">
` ``if` `(currentActivityScaleX < ``0.95``)`
</div>
<div class="line number37 index36 alt2">
` ``showScrollViewMenu();`
</div>
<div class="line number38 index37 alt1">
</div>
<div class="line number39 index38 alt2">
` ``float` `targetScale = getTargetScale(ev.getRawX());`
</div>
<div class="line number40 index39 alt1">
` ``ViewHelper.setScaleX(viewActivity, targetScale);`
</div>
<div class="line number41 index40 alt2">
` ``ViewHelper.setScaleY(viewActivity, targetScale);`
</div>
<div class="line number42 index41 alt1">
` ``ViewHelper.setScaleX(imageViewShadow, targetScale + shadowAdjustScaleX);`
</div>
<div class="line number43 index42 alt2">
` ``ViewHelper.setScaleY(imageViewShadow, targetScale + shadowAdjustScaleY);`
</div>
<div class="line number44 index43 alt1">
` ``ViewHelper.setAlpha(scrollViewMenu, (``1` `- targetScale) * ``2``.0f);`
</div>
<div class="line number45 index44 alt2">
</div>
<div class="line number46 index45 alt1">
` ``lastRawX = ev.getRawX();`
</div>
<div class="line number47 index46 alt2">
` ``return` `true``;`
</div>
<div class="line number48 index47 alt1">
` ``}`
</div>
<div class="line number49 index48 alt2">
</div>
<div class="line number50 index49 alt1">
` ``break``;`
</div>
<div class="line number51 index50 alt2">
</div>
<div class="line number52 index51 alt1">
` ``case` `MotionEvent.ACTION_UP:`
</div>
<div class="line number53 index52 alt2">
</div>
<div class="line number54 index53 alt1">
` ``if` `(isInIgnoredView) ``break``;`
</div>
<div class="line number55 index54 alt2">
` ``if` `(pressedState != PRESSED_MOVE_HORIZANTAL) ``break``;`
</div>
<div class="line number56 index55 alt1">
</div>
<div class="line number57 index56 alt2">
` ``pressedState = PRESSED_DONE;`
</div>
<div class="line number58 index57 alt1">
` ``if` `(isOpened()){`
</div>
<div class="line number59 index58 alt2">
` ``if` `(currentActivityScaleX > ````.56f)`
</div>
<div class="line number60 index59 alt1">
` ``closeMenu();`
</div>
<div class="line number61 index60 alt2">
` ``else`
</div>
<div class="line number62 index61 alt1">
` ``openMenu(scaleDirection);`
</div>
<div class="line number63 index62 alt2">
` ``}``else``{`
</div>
<div class="line number64 index63 alt1">
` ``if` `(currentActivityScaleX < ````.94f){`
</div>
<div class="line number65 index64 alt2">
` ``openMenu(scaleDirection);`
</div>
<div class="line number66 index65 alt1">
` ``}``else``{`
</div>
<div class="line number67 index66 alt2">
` ``closeMenu();`
</div>
<div class="line number68 index67 alt1">
` ``}`
</div>
<div class="line number69 index68 alt2">
` ``}`
</div>
<div class="line number70 index69 alt1">
</div>
<div class="line number71 index70 alt2">
` ``break``;`
</div>
<div class="line number72 index71 alt1">
</div>
<div class="line number73 index72 alt2">
` ``}`
</div>
<div class="line number74 index73 alt1">
` ``lastRawX = ev.getRawX();`
</div>
<div class="line number75 index74 alt2">
` ``return` `super``.dispatchTouchEvent(ev);`
</div>
<div class="line number76 index75 alt1">
`}`
</div>
</div>
</td>
</tr>
</table>
</div>
</div>
上面代码量有点多,看上去有点晕,接下来我们来分别从按下、移动、放开、来原理分析:
MotionEvent.ACTION_DOWN:
记录了X,Y轴的坐标点,判断是否打开,设置了按下的状态为PRESSED_DOWN
MotionEvent.ACTION_MOVE:
拿到当前X,Y减去DOWN下记录下来的X,Y,这样得到了移动的X,Y,
然后判断如果如果移动的X,Y大于25或者小于-25就改变按下状态为PRESSED_MOVE_VERTICAL
如果移动的X,Y大于50或者小于-50就改变状态为PRESSED_MOVE_HORIZANTAL
状态为PRESSED_MOVE_HORIZANTAL就改变菜单主视图内容以及阴影图片大小,在改变的同时还设置了当前菜单的透明度。
MotionEvent.ACTION_UP:
判断是否菜单是否打开状态,在获取当前缩放的X比例,
判断比例小于0.56f,则关闭菜单,反正开启菜单。
看完后,我们在回去看看代码,就会发现其实也不过如此~!
10.菜单关闭方法,同样也设置了动画监听之前的想法也是成立的。
<div>
<div id="highlighter_197589" class="syntaxhighlighter java">
<div class="toolbar">
[?](http://www.2cto.com/kf/201409/332224.html#)
</div>
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
<div class="line number3 index2 alt2">
3
</div>
<div class="line number4 index3 alt1">
4
</div>
<div class="line number5 index4 alt2">
5
</div>
<div class="line number6 index5 alt1">
6
</div>
<div class="line number7 index6 alt2">
7
</div>
<div class="line number8 index7 alt1">
8
</div>
<div class="line number9 index8 alt2">
9
</div>
<div class="line number10 index9 alt1">
10
</div>
<div class="line number11 index10 alt2">
11
</div>
<div class="line number12 index11 alt1">
12
</div>
<div class="line number13 index12 alt2">
13
</div>
<div class="line number14 index13 alt1">
14
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`/**`
</div>
<div class="line number2 index1 alt1">
` ``* close the reslide menu;`
</div>
<div class="line number3 index2 alt2">
` ``*/`
</div>
<div class="line number4 index3 alt1">
` ``public` `void` `closeMenu(){`
</div>
<div class="line number5 index4 alt2">
</div>
<div class="line number6 index5 alt1">
` ``isOpened = ``false``;`
</div>
<div class="line number7 index6 alt2">
` ``AnimatorSet scaleUp_activity = buildScaleUpAnimation(viewActivity, ``1``.0f, ``1``.0f);`
</div>
<div class="line number8 index7 alt1">
` ``AnimatorSet scaleUp_shadow = buildScaleUpAnimation(imageViewShadow, ``1``.0f, ``1``.0f);`
</div>
<div class="line number9 index8 alt2">
` ``AnimatorSet alpha_menu = buildMenuAnimation(scrollViewMenu, ````.0f);`
</div>
<div class="line number10 index9 alt1">
` ``scaleUp_activity.addListener(animationListener);`
</div>
<div class="line number11 index10 alt2">
` ``scaleUp_activity.playTogether(scaleUp_shadow);`
</div>
<div class="line number12 index11 alt1">
` ``scaleUp_activity.playTogether(alpha_menu);`
</div>
<div class="line number13 index12 alt2">
` ``scaleUp_activity.start();`
</div>
<div class="line number14 index13 alt1">
` ``}`
</div>
</div>
</td>
</tr>
</table>
</div>
</div>
11.屏蔽菜单方法
<div>
<div id="highlighter_622781" class="syntaxhighlighter java">
<div class="toolbar">
[?](http://www.2cto.com/kf/201409/332224.html#)
</div>
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
<div class="line number3 index2 alt2">
3
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`public` `void` `setSwipeDirectionDisable(``int` `direction){`
</div>
<div class="line number2 index1 alt1">
` ``disabledSwipeDirection.add(direction);`
</div>
<div class="line number3 index2 alt2">
` ``}`
</div>
</div>
</td>
</tr>
</table>
</div>
</div>
<div>
<div id="highlighter_971803" class="syntaxhighlighter java">
<div class="toolbar">
[?](http://www.2cto.com/kf/201409/332224.html#)
</div>
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
<div class="line number3 index2 alt2">
3
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`private` `boolean` `isInDisableDirection(``int` `direction){`
</div>
<div class="line number2 index1 alt1">
` ``return` `disabledSwipeDirection.contains(direction);`
</div>
<div class="line number3 index2 alt2">
` ``}`
</div>
</div>
</td>
</tr>
</table>
</div>
</div>
原理分析:在重写dispatchTouchEvent的时候,细心的同学应该会看到,ACTION_MOVE下面有个判断
<div>
<div id="highlighter_907157" class="syntaxhighlighter java">
<div class="toolbar">
[?](http://www.2cto.com/kf/201409/332224.html#)
</div>
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`if` `(isInIgnoredView || isInDisableDirection(scaleDirection))`
</div>
</div>
</td>
</tr>
</table>
</div>
</div>
如果这个方向的菜单被屏蔽了,就滑不出来了。
最后我们会发现我们一直都没说到TouchDisableView,其实initValue的时候就初始化了,它就是viewActivity,是我们的内容视图。

我们来看看它做了什么?
<div>
<div id="highlighter_627811" class="syntaxhighlighter java">
<div class="toolbar">
[?](http://www.2cto.com/kf/201409/332224.html#)
</div>
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td class="gutter">
<div class="line number1 index0 alt2">
1
</div>
<div class="line number2 index1 alt1">
2
</div>
<div class="line number3 index2 alt2">
3
</div>
<div class="line number4 index3 alt1">
4
</div>
<div class="line number5 index4 alt2">
5
</div>
<div class="line number6 index5 alt1">
6
</div>
<div class="line number7 index6 alt2">
7
</div>
<div class="line number8 index7 alt1">
8
</div>
<div class="line number9 index8 alt2">
9
</div>
<div class="line number10 index9 alt1">
10
</div>
<div class="line number11 index10 alt2">
11
</div>
<div class="line number12 index11 alt1">
12
</div>
<div class="line number13 index12 alt2">
13
</div>
<div class="line number14 index13 alt1">
14
</div>
<div class="line number15 index14 alt2">
15
</div>
<div class="line number16 index15 alt1">
16
</div>
<div class="line number17 index16 alt2">
17
</div>
<div class="line number18 index17 alt1">
18
</div>
<div class="line number19 index18 alt2">
19
</div>
<div class="line number20 index19 alt1">
20
</div>
<div class="line number21 index20 alt2">
21
</div>
<div class="line number22 index21 alt1">
22
</div>
<div class="line number23 index22 alt2">
23
</div>
<div class="line number24 index23 alt1">
24
</div>
<div class="line number25 index24 alt2">
25
</div>
<div class="line number26 index25 alt1">
26
</div>
<div class="line number27 index26 alt2">
27
</div>
<div class="line number28 index27 alt1">
28
</div>
<div class="line number29 index28 alt2">
29
</div>
<div class="line number30 index29 alt1">
30
</div>
<div class="line number31 index30 alt2">
31
</div>
</td>
<td class="code">
<div class="container">
<div class="line number1 index0 alt2">
`@Override`
</div>
<div class="line number2 index1 alt1">
` ``protected` `void` `onMeasure(``int` `widthMeasureSpec, ``int` `heightMeasureSpec) {`
</div>
<div class="line number3 index2 alt2">
</div>
<div class="line number4 index3 alt1">
` ``int` `width = getDefaultSize(````, widthMeasureSpec);`
</div>
<div class="line number5 index4 alt2">
` ``int` `height = getDefaultSize(````, heightMeasureSpec);`
</div>
<div class="line number6 index5 alt1">
` ``setMeasuredDimension(width, height);`
</div>
<div class="line number7 index6 alt2">
</div>
<div class="line number8 index7 alt1">
` ``final` `int` `contentWidth = getChildMeasureSpec(widthMeasureSpec, ````, width);`
</div>
<div class="line number9 index8 alt2">
` ``final` `int` `contentHeight = getChildMeasureSpec(heightMeasureSpec, ````, height);`
</div>
<div class="line number10 index9 alt1">
` ``mContent.measure(contentWidth, contentHeight);`
</div>
<div class="line number11 index10 alt2">
` ``}`
</div>
<div class="line number12 index11 alt1">
</div>
<div class="line number13 index12 alt2">
` ``@Override`
</div>
<div class="line number14 index13 alt1">
` ``protected` `void` `onLayout(``boolean` `changed, ``int` `l, ``int` `t, ``int` `r, ``int` `b) {`
</div>
<div class="line number15 index14 alt2">
` ``final` `int` `width = r - l;`
</div>
<div class="line number16 index15 alt1">
` ``final` `int` `height = b - t;`
</div>
<div class="line number17 index16 alt2">
` ``mContent.layout(````, ````, width, height);`
</div>
<div class="line number18 index17 alt1">
` ``}`
</div>
<div class="line number19 index18 alt2">
</div>
<div class="line number20 index19 alt1">
` ``@Override`
</div>
<div class="line number21 index20 alt2">
` ``public` `boolean` `onInterceptTouchEvent(MotionEvent ev) {`
</div>
<div class="line number22 index21 alt1">
` ``return` `mTouchDisabled;`
</div>
<div class="line number23 index22 alt2">
` ``}`
</div>
<div class="line number24 index23 alt1">
</div>
<div class="line number25 index24 alt2">
` ``void` `setTouchDisable(``boolean` `disableTouch) {`
</div>
<div class="line number26 index25 alt1">
` ``mTouchDisabled = disableTouch;`
</div>
<div class="line number27 index26 alt2">
` ``}`
</div>
<div class="line number28 index27 alt1">
</div>
<div class="line number29 index28 alt2">
` ``boolean` `isTouchDisabled() {`
</div>
<div class="line number30 index29 alt1">
` ``return` `mTouchDisabled;`
</div>
<div class="line number31 index30 alt2">
` ``}`
</div>
</div>
</td>
</tr>
</table>
</div>
</div>
动态设置宽高,设置事件是否传递下去的flag。
💬 评论