仿QQ侧边栏滑动的实现
来源:互联网 发布:闵行php开发培训学校 编辑:程序博客网 时间:2024/06/01 08:31
视频来源:http://www.imooc.com/video/4386
实现过程:主要是实现一个继承于HorizontalScrollView
的控件SlideMenu
,大致步骤:
- 重写
OnMeasure
方法来定义子View
的大小 - 重写
onLayout
方法来初始化子View
的位置 - 重写
onTouchEvent
方法来设置滑动事件 重写
onScrollChanged
方法来设置滑动动画,以达到菜单栏左端固定于屏幕左侧出现(而不是菜单栏从右侧开始慢慢出现),以及相应的缩放、透明度设置。这里需要引入NineOldAndroid包代码如下:
class SlideMenu:HorizontalScrollView { var mWapper:LinearLayout?=null var mMenu:ViewGroup?=null var mContent:ViewGroup?=null var mScreenWidth:Int=0 var once=0 //dp var mMenuRightPadding=0 constructor(context: Context,attributeSet: AttributeSet) : super(context,attributeSet){ val wm:WindowManager= context.getSystemService(Context.WINDOW_SERVICE) as WindowManager val outMetrics:DisplayMetrics= DisplayMetrics() wm.defaultDisplay.getMetrics(outMetrics) mScreenWidth=outMetrics.widthPixels //把dp、sp转化为px mMenuRightPadding= TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50F,context.resources.displayMetrics ).toInt() } override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { if (once==0) { mWapper= getChildAt(0) as LinearLayout? mMenu= mWapper?.getChildAt(0) as ViewGroup? mContent= mWapper?.getChildAt(1) as ViewGroup? mMenu?.layoutParams?.width=mScreenWidth-mMenuRightPadding mContent?.layoutParams?.width=mScreenWidth once=1 } super.onMeasure(widthMeasureSpec, heightMeasureSpec) }// 设置偏移量将menu隐藏 override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) { super.onLayout(changed, l, t, r, b) if (changed) { scrollTo(mMenu?.layoutParams?.width!!,0) } } override fun onTouchEvent(ev: MotionEvent?): Boolean { val action=ev?.action when (action) { MotionEvent.ACTION_UP->{ //隐藏部分大于菜单栏一般 if (scrollX >= (mMenu?.layoutParams?.width!! /2)) { smoothScrollTo(mMenu?.layoutParams?.width!!,0) } else { smoothScrollTo(0,0) } return true } } return super.onTouchEvent(ev) } override fun onScrollChanged(l: Int, t: Int, oldl: Int, oldt: Int) { super.onScrollChanged(l, t, oldl, oldt) val scale=l.toFloat()/mMenu?.layoutParams?.width!! ViewHelper.setTranslationX(mMenu, scale*mMenu?.layoutParams?.width!!*0.7f) val rightScale=0.7f+0.3f*scale ViewHelper.setScaleX(mContent,rightScale) ViewHelper.setScaleY(mContent,rightScale) ViewHelper.setPivotX(mContent, 0f) ViewHelper.setPivotY(mContent, (mContent?.height!! /2).toFloat()) val leftScale=1.0f-scale*0.3f ViewHelper.setScaleX(mMenu,leftScale) ViewHelper.setScaleY(mMenu,leftScale) ViewHelper.setAlpha(mMenu,leftScale) ViewHelper.setPivotX(mMenu, 0f) ViewHelper.setPivotY(mMenu, (mMenu?.height!! /2).toFloat()) }}
效果如图:
阅读全文
0 0
- 仿QQ侧边栏滑动的实现
- Android实现仿qq侧边栏效果
- Android实现仿qq侧边栏效果
- iOS-仿QQ侧边栏
- iOS-仿QQ侧边栏
- Android开发--滑动侧边栏的实现
- android 仿人人网滑动侧边栏
- 仿人人网侧边栏滑动效果
- android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检索
- 自定义View之仿通讯录侧边栏滑动,实现A-Z字母检索
- android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检索
- android自定义View之仿通讯录侧边栏滑动,实现A-Z字母检索
- 仿qq左侧滑动的功能功能实现
- 上下滑动的侧边栏
- Android侧边栏的自定义滑动实现(附源码)
- 类似于qq的侧边栏
- Android 仿QQ侧边栏,自定义view的学习 <Garry进阶(三)>
- Android仿QQ实现ListView滑动删除
- QT可重入与线程安全
- iOS多线程之NSOperation
- CentOS7 tcpdump安装与使用
- 第三篇:JAVA动态(可变)参数
- 一劳永逸的搞定 flex 布局 (赞)
- 仿QQ侧边栏滑动的实现
- SpringMVC @RequestBody接收Json对象字符串
- 1043. 输出PATest(20)
- 在OpenCV某一个算子中考察某该算子的一个参数对图像处理的影响,通过循环从而选择最佳参数的方法
- 函数fseek() 用法
- 《数字图像处理》第三版笔记(七)快速傅立叶变换
- git pull 错误
- 多态的四种实现
- XSS漏洞自动化攻击工具XSSer