前面有写过一篇文章使用DrawerLayout实现Android仿网易客户端抽屉模式,昨天从群里看一哥们问抽屉式拖拉,从主界面的下方出现,而使用DrawerLayout实现的是覆盖掉主界面,今天我们就来实现一下主界面下方脱出菜单界面,先上图,方便观看


啊哦,图片好大,开始今天的实现


1.继承HorizontalScrollView,实现自定义控件

package com.sdufe.thea.guo.view;import com.nineoldandroids.view.ViewHelper;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;public class SlidingMenu extends HorizontalScrollView {private LinearLayout mWapper;private ViewGroup mMenu;private ViewGroup mContent;/** * 屏幕宽度 */private int mSreenWidth;/** * 菜单距离右侧的宽度,单位dp */private int mMenuRightPadding=100;/** * 菜单宽度 */private int mMenuWidth;/** * 确定onMeasure只绘制一次 */private boolean once;public SlidingMenu(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);WindowManager windowManager = (WindowManager) context.getSystemService(context.WINDOW_SERVICE);DisplayMetrics outMetrics=new DisplayMetrics();windowManager.getDefaultDisplay().getMetrics(outMetrics);mSreenWidth=outMetrics.widthPixels;/** * 把dp转化成px */mMenuRightPadding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 100, getResources().getDisplayMetrics());}public SlidingMenu(Context context, AttributeSet attrs) {this(context, attrs, 0);}public SlidingMenu(Context context) {this(context, null);}/** * 确定宽高 */@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);if (!once) {mWapper=(LinearLayout) getChildAt(0);mMenu=(ViewGroup) mWapper.getChildAt(0);mContent=(ViewGroup) mWapper.getChildAt(1);/** * 菜单设置宽度 */mMenuWidth=mMenu.getLayoutParams().width=mSreenWidth-mMenuRightPadding;/** * 内容设置宽度 */mContent.getLayoutParams().width=mSreenWidth;once=true;}}/** * 设置偏移量,隐藏menu */@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);}}@Overridepublic boolean onTouchEvent(MotionEvent ev) {switch (ev.getAction()) {case MotionEvent.ACTION_UP:/** * 隐藏部分宽度 */int scroll=getScrollX();if (scroll>mMenuWidth/2) {/** * 动画实现隐藏 */smoothScrollTo(mMenuWidth, 0);}else {/** * 动画实现显示 */smoothScrollTo(0, 0);}return true;}return super.onTouchEvent(ev);}/** * 通过onScrollChanged实现抽屉式滑动 */@Overrideprotected void onScrollChanged(int l, int t, int oldl, int oldt) {super.onScrollChanged(l, t, oldl, oldt);ViewHelper.setTranslationX(mMenu, l);}}

在构造函数中获得屏幕的宽度以及将dp为单位的mMenuRightPadding转化为px

onMeasure中给宽高赋值

onLayout中确定位置

onTouch中控制手势

onScrollChanged实现抽屉式动画,这里引用了nineold动画包,兼容3.0一下版本

剩余的部分代码中注释都说的很清楚了,这里就不在扯淡了,到此差不多就实现了,下面就是使用了,

                                

ok,结束,以上代码修改自鸿洋的qq侧滑,略有不同而已


代码下载地址:http://download.csdn.net/detail/elinavampire/8276537


更多相关文章

  1. TextView 相关属性
  2. 如何判断是否可以使用某个Intent
  3. 含有过滤功能的android流式布局
  4. TextView一行显示一个文字效果
  5. Android(安卓)ViewPager的简单使用
  6. 《Android(安卓)Dev Guide》系列教程9:用户界面之声明布局
  7. Android(安卓)UI界面目前做的最好的一个:索尼爱立信Xperia X10
  8. Android:LiveData postValue导致数据丢失问题,及其原因
  9. Android(安卓)MVP设计模式的最佳实现

随机推荐

  1. MySQL 全文索引使用指南
  2. 52条SQL语句教你性能优化
  3. 简单了解 MySQL 中相关的锁
  4. mysql在项目中怎么选事务隔离级别
  5. .Net Core导入千万级数据至Mysql的步骤
  6. MySQL大小写敏感的注意事项
  7. MySQL 使用事件(Events)完成计划任务
  8. MySQL触发器的使用
  9. Oracle更换为MySQL遇到的问题及解决
  10. MySQL 重命名表的操作方法及注意事项