最近做侧滑控件,又把相关的知识梳理了一遍. 现总结如下
--------------------------------------
1. View的ScrollTo和ScrollBy.
这两个函数是用来使子控件滚动的. 比如:我在ViewB上使用ViewB.ScrollTo(x,y),那么ViewB的子控件就会进行滚动,但ViewB本身不会移动.
具体应用的例子为:
Launcher,个人的控件ScrollLayout,还有平铺的SlidingMenu等等.
------------------------
2. offsetLeftAndRight 或 offsetTopAndBottom
这两个方法是使控件进行临时滚动的. 以控件现在位置为坐标原点进行上下左右滚动,比如要使控件向右移动2个像素,只需要传入2即可.这两个函数只能使控件临时滚动,即手松开后,滚动的效果就没有了,会恢复到滚动前的位置.
------------------------
3. View.Layout()
上面的控件只是能够临时滚动,滚动完后保存位置就需要用到Layout了.
比如,我要使控件固定在右侧的位置那么只要用如下方法即可:
mContentView.layout(偏移量, mContentView.getTop(), 偏移量+ mContentView.getWidth(), mContentView.getBottom());
-------------------------
4.写控件必备:
public boolean dispatchTouchEvent(MotionEvent ev):传递Touch事件至target view(可以是自己)。
public boolean onInterceptTouchEvent(MotionEvent ev):在ViewGroup中定义,用于拦截Touch事件的传递。
public boolean onTouchEvent(MotionEvent event): Touch事件处理函数。
处理手势的必备函数.这几种函数好好编写逻辑,才可达到想要的效果.
比如: 我在改写SlidingDrawer为侧滑菜单时就遇到了一个问题,里面的按钮不能够点击.
因为SlidingDrawer的handle里面是不用放控件的,在改写里我把Handle改写为内容页,内容页里面肯定会放按钮之类的东西.
SlidingDrawer的onInterceptTouchEvent事件简化是这样写的:
if (!mTracking && !frame.contains((int) x, (int) y)) {
return false;
}
return true
也就是说只要点击的是Handle区域就进行拦截. 这样的话,子控件就不能获取到事件了. 在侧滑菜单中改成了这样:
if(action == MotionEvent.ACTION_MOVE){
final int xDiff = (int) Math.abs(moveX - x);
final int yDiff = (int) Math.abs(moveY - y);
//是左右滑动
if (xDiff > MOVE_MIN_NUM && yDiff < xDiff / 2) {
return true;
}
只有是左右滑动事件时,才进行拦截,这样 子控件就能进行响应.
-------------------------
5. VelocityTracker
只要涉及到滑动基本都会用到他.
用来跟踪触摸速度的类 当你需要跟踪的时候使用obtain()方法来来获得VelocityTracker类的一个实例对象使用addMovement(MotionEvent)函数将当前的移动事件传递给VelocityTracker对象 使用computeCurrentVelocity (int units)函数来计算当前的速度 使用getXVelocity ()、getYVelocity ()函数来获得当前的速度.
--------------------------
6. Scroller
这个类封装了滚动操作。滚动的持续时间可以通过构造函数传递 ,并且可以指定滚动动作的持续的最长时间。经过这段时间,滚动会自动定位到最终位置,并且通过computeScrollOffset ()会得到的返回值为false,表明滚动动作已经结束。