自定义SlidingMenu组件
来源:互联网 发布:windows api 绘图 编辑:程序博客网 时间:2024/06/04 00:55
在网上学习了自定义slidingmenu组件,这里记录下其中的关键点。
SlidingMenu其实是一个HorizontalScrollView,里面有两个布局,通过重写几个方法达到侧滑的效果。
首先原理是在LinearLayout外嵌套了HorizontalScrollView,SlidingMenu继承HorizontalScrollView。
重写onMeasure(int widthMeasureSpec, int heightMeasureSpec),onLayout(boolean changed, int l, int t, int r, int b),onTouchEvent(MotionEvent ev)方法
下面是代码
package com.example.slidingmenudemo.widget;import android.content.Context;import android.content.res.TypedArray;import android.util.AttributeSet;import android.view.MotionEvent;import android.view.ViewGroup;import android.widget.HorizontalScrollView;import android.widget.LinearLayout;import com.example.slidingmenudemo.R;import com.example.slidingmenudemo.utils.ScreenUtils;import com.nineoldandroids.view.ViewHelper;public class SlidingMenu extends HorizontalScrollView {// 屏幕的宽度private int mScreenWidth;// 菜单的宽度private int mMenuWidth;// 一半菜单的宽度private int mHalfMenuWidth;// 菜单距离右侧的宽度(像素)private int mMenuRightPadding;// 菜单距离右侧的宽度(dp)private float mDefaultMenuRightPaddingDp = 150f;// 是否第一次加载private boolean firstIn = true;private boolean isOpen = false;private ViewGroup menu;private ViewGroup content;public SlidingMenu(Context context, AttributeSet attrs) {super(context, attrs);mScreenWidth = ScreenUtils.getScreenWidth(context);TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.SlidingMenu);int n = typedArray.getIndexCount();for (int i = 0; i < n; i++) {int attr = typedArray.getIndex(i);switch (attr) {case R.styleable.SlidingMenu_rightPadding:mMenuRightPadding = typedArray.getDimensionPixelOffset(attr,ScreenUtils.dp2px(context, mDefaultMenuRightPaddingDp));break;}}}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {// 如果是第一次加载,要对每个布局(Menu,Content)的宽度重新设定(注意都是像素为单位)if (firstIn) {LinearLayout wrapper = (LinearLayout) getChildAt(0);menu = (ViewGroup) wrapper.getChildAt(0);content = (ViewGroup) wrapper.getChildAt(1);mMenuWidth = mScreenWidth - mMenuRightPadding;mHalfMenuWidth = mMenuWidth / 2;menu.getLayoutParams().width = mMenuWidth;content.getLayoutParams().width = mScreenWidth;}super.onMeasure(widthMeasureSpec, heightMeasureSpec);}@Overrideprotected void onLayout(boolean changed, int l, int t, int r, int b) {super.onLayout(changed, l, t, r, b);if (changed) {// 将菜单隐藏this.scrollTo(mMenuWidth, 0);firstIn = false;}}@Overridepublic boolean onTouchEvent(MotionEvent ev) {ev.getAction();switch (ev.getAction()) {case MotionEvent.ACTION_UP:if (getScrollX() > mHalfMenuWidth) {// 打开菜单this.smoothScrollTo(mMenuWidth, 0);isOpen = true;} else {// 关闭菜单this.smoothScrollTo(0, 0);isOpen = false;}return true;}return super.onTouchEvent(ev);}// 打开Menupublic void openMenu() {if (!isOpen) {this.smoothScrollTo(0, 0);isOpen = true;}}// 打开Menupublic void closeMenu() {if (isOpen) {this.smoothScrollTo(mMenuWidth, 0);isOpen = false;}}// 切换菜单状态public void toggle() {if (isOpen) {this.smoothScrollTo(mMenuWidth, 0);isOpen = false;} else {this.smoothScrollTo(0, 0);isOpen = true;}}}
attrs.xml
<?xml version="1.0" encoding="utf-8"?><resources> <declare-styleable name="SlidingMenu"> <attr name="rightPadding" format="dimension"></attr> </declare-styleable></resources>
布局main.xml
<com.example.slidingmenudemo.widget.SlidingMenu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:menu="http://schemas.android.com/apk/res/com.example.slidingmenudemo" android:id="@+id/menu" android:layout_width="wrap_content" android:layout_height="fill_parent" android:scrollbars="none" menu:rightPadding="150dp" > <LinearLayout android:layout_width="wrap_content" android:layout_height="fill_parent" android:orientation="horizontal" > <include layout="@layout/layout_menu" /> <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@drawable/qq" > </LinearLayout> </LinearLayout></com.example.slidingmenudemo.widget.SlidingMenu>
要注意的几点:
1.代码的操作都是用的px,所以要把dp转成像素进行计算,这里谢了
2.HorizontalScrollView的smoothScrollTo(mMenuWidth, 0)方法跳到开始content布局中
3.重写onMeasure()中对menu和content布局的宽度都进行了重新的设定,这里menu距离右侧距离是一个自定义属性
创建自定义组件的步骤:
一.写布局
二写java类,一般名字就是自定义组件的名字,在这里写对布局中一些东西操作
三.如果需要自定义属性,先在attr.xml中声明一个类似这种的属性参数,写清楚每个属性的名字和类型
<declare-styleable name="SlidingMenu"> <attr name="rightPadding" format="dimension"></attr> </declare-styleable>四.在自定义组件中获取布局文件中写的自定义属性
<pre name="code" class="java">TypedArray typedArray = context.obtainStyledAttributes(attrs,R.styleable.SlidingMenu);int n = typedArray.getIndexCount();for (int i = 0; i < n; i++) {int attr = typedArray.getIndex(i);switch (attr) {case R.styleable.SlidingMenu_rightPadding:mMenuRightPadding = typedArray.getDimensionPixelOffset(attr,ScreenUtils.dp2px(context, mDefaultMenuRightPaddingDp));break;}}
这个代码很固定,记住吧,或者慢慢来。
四.布局中记得加上自定义属性的命名空间
xmlns:menu="http://schemas.android.com/apk/res/com.example.slidingmenudemo"
源代码基本上都在上面了,有过有需要项目代码的,请留下邮箱,我看到后会发过去。
0 0
- 自定义SlidingMenu组件
- Android自定义控件 开源组件SlidingMenu的项目集成
- 自定义SlidingMenu
- Android自定义控件——开源组件SlidingMenu的项目集成
- Android自定义控件——开源组件SlidingMenu的项目集成
- Android自定义控件——开源组件SlidingMenu的项目集成
- 自定义View实现SlidingMenu
- 自定义滑动菜单SlidingMenu
- 学习篇---自定义SlidingMenu
- Android自定义SlidingMenu
- 新手 自定义SlidingMenu控件
- 项目实战①—高仿知乎日报(2)—>使用pullrefesh+Slidingmenu+自定义组件写主布局
- 项目实战①—高仿知乎日报(2)—>使用pullrefesh+Slidingmenu+自定义组件写主布局2
- 自定义侧滑菜单SlidingMenu
- Android打造专属自定义SlidingMenu
- Android自定义控件之SlidingMenu
- 仿QQ slidingmenu 自定义属性 自定义控件
- Android开源组件介绍:SlidingMenu
- 引入微课优化高职高专英语阅读教学
- 小白学phoneGap《构建跨平台APP:phoneGap移动应用实战》连载二(生命周期)
- OGNL表达式语言
- 后台执行shell脚本
- 【Android】Android屏幕适配建议
- 自定义SlidingMenu组件
- 已经添加到版本库,如何让git忽略?
- windows环境下搭建ffmpeg开发环境
- 常用.jshintrc备忘
- 我们如何解释他人——归因
- Struts2+JQuery.uploadify插件实现带进度的多文件上传示例【也可以设置去掉进度条的显示】
- 常用正则表达式,我自己写的,不求强大,但求精简,更新中
- Java final用法小结
- github添加ssh key之后push还要输入账号密码的解决方法