实现滑动的七种方法:

一.layout方法
二.offsetLeftAndRight()与offsetTopAndBottom()
三.LayoutParams
四.scrollTo与scrollBy smoothScrollTo与smoothScrooBy

  • 1.scrollTo . scrollBy方法移动的是view的content,即让View的内容移动.如果在ViewGroup中使用scrollTo.scrollBy方法,那么移动的将是所有子View,但如果在View中使用,那么移动的将是View的内容.

  • 2.如果将scrollBy中的参数dx和dy设置为正数,那么content将向坐标轴负方向移动,如果将scrollBy中的参数dx , dy设置为负数,那么content将向坐标轴正方向移动.

五.Scroller,注意事项:同“四”
六.属性动画
七.ViewDragHelper

Scroller简单使用

  • 基本api
mScroller.getCurrX() //获取mScroller当前水平滚动的位置   mScroller.getCurrY() //获取mScroller当前竖直滚动的位置   mScroller.getFinalX() //获取mScroller最终停止的水平位置mScroller.getFinalY() //获取mScroller最终停止的竖直位置     mScroller.setFinalX(int newX) //设置mScroller最终停留的水平位置,没有动画效果,直接跳到目标位置 mScroller.setFinalY(int newY) //设置mScroller最终停留的竖直位置,没有动画效果,直接跳到目标位置 //滚动,startX, startY为开始滚动的位置,dx,dy为滚动的偏移量, duration为完成滚动的时间     mScroller.startScroll(int startX, int startY, int dx, int dy) //使用默认完成时间250ms   mScroller.startScroll(int startX, int startY, int  dx, int dy, int duration)      mScroller.computeScrollOffset()   //返回值为boolean,true说明滚动尚未完成,false说明滚动已经完成。这是一个很重要的方法,通常放在View.computeScroll()中,用来判断是否滚动是否结束。
  • 基本使用
public class ScrollerLayout extends RelativeLayout {    private Scroller scroller;    public ScrollerLayout(Context context, AttributeSet attrs) {        super(context, attrs);        scroller = new Scroller(context);    }    //滑动时调用    public void startScroll(int dx, int dy) {        scroller.startScroll(scroller.getFinalX(), scroller.getFinalY(), dx, dy);        //调用invalidate(),间接调用computeScroll()        invalidate();    }    @Override    public void computeScroll() {        super.computeScroll();        //判断滚动是否完成        if (scroller.computeScrollOffset()) {            //完成实际滚动            scrollTo(scroller.getCurrX(), scroller.getCurrY());            //刷新,重复调用computeScroll()            invalidate();        }    }}

Scroller实际应用

实际用法有好多,其中可以用来实现阻尼效果
不叨叨,上代码

public class ScrollerLayout2 extends LinearLayout{    private Scroller scroller;    //手势的事件更丰富一点    private GestureDetector gestureDetector;    public ScrollerLayout2(Context context, AttributeSet attrs) {        super(context, attrs);        scroller = new Scroller(context);        gestureDetector = new GestureDetector(context , new GestureCallback());    }    @Override    public boolean onTouchEvent(MotionEvent event) {        switch (event.getAction()){            case MotionEvent.ACTION_UP:                //手指抬起,回到原处                startScroll(0 , -scroller.getFinalY());                break;            default:                return gestureDetector.onTouchEvent(event);        }        return super.onTouchEvent(event);    }    /**     * 开始滑动     * @param dx 正值向左移动     * @param dy 正值向左移动     */    private void startScroll(int dx , int dy){        scroller.startScroll(scroller.getFinalX() , scroller.getFinalY() , dx , dy);        invalidate();    }    @Override    public void computeScroll() {        super.computeScroll();        if (scroller.computeScrollOffset()){            scrollTo(scroller.getCurrX() , scroller.getCurrY());            invalidate();        }    }    private class GestureCallback implements GestureDetector.OnGestureListener{        @Override        public boolean onDown(MotionEvent e) {            //这里要返回true哦,要不后面的move和up不会到这个view里面来了            return true;        }        @Override        public void onShowPress(MotionEvent e) {        }        @Override        public boolean onSingleTapUp(MotionEvent e) {            return false;        }        @Override        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {            startScroll(0 , (int) distanceY/2);            return false;        }        @Override        public void onLongPress(MotionEvent e) {        }        @Override        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {            return false;        }    }    @Override    public boolean onInterceptTouchEvent(MotionEvent ev) {        return true;    }}

源码

参考01
参考02

更多相关文章

  1. Android(安卓)菜单(OptionMenu)大全
  2. Android(安卓)Camera Framework层分析
  3. Android(安卓)中判断是否存在虚拟按键
  4. Android(安卓)Laucher3 去掉二级菜单
  5. Android(安卓)插件化分析(2)- 动态代理
  6. WebView深究之Android是如何实现webview初始化的
  7. Android(安卓)webview加载富文本 屏幕简单适配
  8. Android中获取地理位置经纬度
  9. android中setVisibility的用法

随机推荐

  1. Android Calendar一闪而过 无法创建event
  2. invalid resource directory name
  3. Android的SQLite使用实例
  4. Android 进程生命周期(Process Lifecycle
  5. 扔掉USB线,无需无线路由器,利用笔记本电脑(W
  6. IDEA 快捷键 Android Studio快捷键
  7. android中handler用法总结
  8. Android期末项目(一)—— 解析二维数组对象
  9. Android中Thread,hanlder(HanlderThread),Run
  10. Android UI之对话框(dialog)