现在的位置: 首页 > 综合 > 正文

Android 自定义滑动控件相关

2014年09月05日 ⁄ 综合 ⁄ 共 1848字 ⁄ 字号 评论关闭

最近做侧滑控件,又把相关的知识梳理了一遍. 现总结如下

--------------------------------------

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,表明滚动动作已经结束。

抱歉!评论已关闭.