在Android 开发中 由于手机大小的限制,必定很多时候都会遇到需要自定义 滑动来展示所有内容, 如使用自带控件 ListView scrollview 属性动画等
首先 简单的介绍下 正常情况下在Android 中 实现滑动的几种方法
1.layout LayoutParams
上面这两种方法使用比较类似 都是在在onTouchEvent 中 获取 手指的偏移量 (假定为moveX moveY) 重新设置view的坐标来实现的
layout 方法 :
layout(getLeft()+moveX ,
getTop()+moveY ,
getRight()+moveX ,
getBottom+moveY
)
layoutParams 方法
ViewGroup.MarginLayoutParams layoutParas =(ViewGroup.MarginLayoutParams)getLayoutParams();
layoutParams.leftMargin=getLeft()+moveX;
layoutParams.topMargin=getTop()+moveY;
setLayoutParams(layoutParams);
2.offsetLeftAndRight() 和 offsetTopAndBottom()
这种方法使用非常简单,就像方法名字一样 直接设置偏移量即可
示例:
offsetLeftAndRight(moveX)
offsetTopAndBottom(moveY)
3.scrollTo ScrollBy
scroll'to 和scrollBy 在实际使用中是存在一定的区别的
scrollTo 是移动到具体的坐标 他的移动和 layout LayoutParams 是类似的
scrollBy 是增量移动 他的使用与 offsetLeftAndRight() 和 offsetTopAndBottom() 是类似的
同时scrollTo 和scrollBy使用的时候与上述 2种方法存在着差异
在View中:
上面两种方案 移动的是view 本身(画布固定不动) 而scrollTo 和scrollBy 移动的是view的内容
在ViewGroup 中:
上面两种方案 移动的是viewGroup 整体(画布固定不动) 而scrollTo 和scrollBy 移动的是子view
因此 想要正常使用scrollTo 和 scrollBy需要在父控件中使用
同时scrollTo和scrollBy的参数都是偏移量 举个简单的例子 现在坐标点是(0,0) 我想要把view移动到(100,100) 需要执行代码 scrollTo(-100,-100);
由于scrollTo和scrollBy 所选取的坐标原点不同,在实际使用的时候也存在着差异 scrollTo是使用的 绝对坐标 即手机屏幕左上角为(0,0)原点 而scrollBy采用的相对坐标 即父控件左上角为(0,0)原点
4.Scroller 类
Scroller 类的实现原理和scrollTo scrollBy 类似 他是把scrollTo 的一下子移动到目的坐标 改为一步步移动过去给人以一种平滑的感觉(帧动画)
Scroller 类的使用 :
----1.初始化
Scroller scroller = new Scroller(context);
Scroller在初始化的时候需要传入一个Context ,便于获屏幕的属性
----2.模拟滑动
模拟滑动 需要重写该类的computeScroll()方法 在该方法中书写滑动逻辑
例子:
@Override
public void computeScroll() {
super.computeScroll();
if(scroller.computeScrollOffset()){
scrollTo(0,scroller.getCurrY());
postInvalidate();
}
}
需要注意的是 上述代码是在一个自定义viewGroup 中复制过来的 如果在view中 应该是父控件调用scrollTo方法 。
computeScrollOffset 是判断 是否滑动完成 postInvalidate 重绘view 在重绘的时候会再次调用该方法 实现循环
----3.开始模拟
使用Scroller 类的startScroll方法即可 该方法有一个重载方法 它们一个规定了时间 一个没有
5.ViewDragHelper 类
其实google 为我们提供的DeawerLayout 和SildingPaneLayout两个布局中就是使用了ViewDragHelper 。ViewDragHelper虽然功能最为强大 但是他的使用比较复杂。
----1.初始化
----2.拦截事件
----3.处理computeScroll
----4.处理回调
以上便是Android 中实现滑动的几种方案(ViewDragHelper 在其他篇章中详细介绍)