坐标系

  1. android 坐标系
//int[] location = new int[2];getLocationOnScreen(int location[]);获取view的左上角在android坐标系的坐标getRawX();                          触控过程中,获取触点在android坐标系的坐标
  1. View坐标系
    getX() getY();

滑动的七种实现

1. layout
2. offsetLeftAndRight,offsetTopAndBottom
3. LayoutParams
4. scrollTo,scrollBy

移动的是View的Content。如果在ViewGroup使用,滑动的是它的子View,而在View中滑动的是它的内容(TextView content是它的文本)

@Overridepublic boolean onTouchEvent(MotionEvent event) {    int x = (int) event.getX();    int y = (int) event.getY();    switch (event.getAction()) {        case MotionEvent.ACTION_DOWN:            lastX = (int) event.getX();            lastY = (int) event.getY();            break;        case MotionEvent.ACTION_MOVE:            int offsetX = x - lastX;            int offsetY = y - lastY;            //1.((View) getParent()).scrollBy(-offsetX, -offsetY);            //2.layout(getLeft() + offsetX,getTop() + offsetY,getRight() + offsetX,getBottom() + offsetY);            //3.offsetLeftAndRight(offsetX);offsetTopAndBottom(offsetY);            ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) getLayoutParams();            layoutParams.leftMargin = getLeft() + offsetX;            layoutParams.topMargin = getTop() + offsetY;            setLayoutParams(layoutParams);              break;    }    return true;}
5. Scroller
//1.在构造函数中初始化 ScrollermScroller = new Scroller(context,new BounceInterpolator());//2.重写 view 的 computeScroll@Overridepublic void computeScroll() {    super.computeScroll();    // 判断Scroller是否执行完毕    if (mScroller.computeScrollOffset()) {        ((View) getParent()).scrollTo(                mScroller.getCurrX(),   //获取当前的滑动坐标                mScroller.getCurrY());        // 通过重绘来不断调用computeScroll        invalidate();    }}//3.startScroll 设置参数@Overridepublic boolean onTouchEvent(MotionEvent event) {    int x = (int) event.getX();    int y = (int) event.getY();    switch (event.getAction()) {        case MotionEvent.ACTION_DOWN:            lastX = (int) event.getX();            lastY = (int) event.getY();            break;        case MotionEvent.ACTION_MOVE:            int offsetX = x - lastX;            int offsetY = y - lastY;            ((View) getParent()).scrollBy(-offsetX, -offsetY);            break;        case MotionEvent.ACTION_UP:            // 手指离开时,执行滑动过程            View viewGroup = ((View) getParent());            mScroller.startScroll(  //回到原来的位置                    viewGroup.getScrollX(), //总共滑动的距离                    viewGroup.getScrollY(),                    -viewGroup.getScrollX(),                    -viewGroup.getScrollY());            invalidate();            break;    }    return true;}
Android滑动的实现_第1张图片 scroller.gif

Scroll的绘制原理:
重点在于 mScroller.startScroll(...)下面的 invalidate 方法,这将导致 View 进行重绘,View 的 draw 方法又会去调用 computeScroll 方法,computeScroll 在 View中是个空实现。这就是为什么一定要 Override computeScroll 的原因。

6. 属性动画
7. ViewDragHelper (参考DragLayout-master)

更多相关文章

  1. androidSDK无法更新的解决方法之一
  2. android全屏去掉title栏的多种实现方法
  3. View类的XML属性、相关方法及说明
  4. android 中隐藏EditText的下划线方法
  5. Android调用系统默认浏览器访问的方法
  6. android Uri获取真实路径转换成File的方法
  7. Android 窗帘(Curtain Menu)效果五之应用场景和使用方法
  8. android 获取路径目录方法 以及 获取路径方法
  9. Linux系统下安装android sdk的方法步骤

随机推荐

  1. Android(安卓)MediaExtractor 浅析
  2. 理解Android进程创建流程(转)
  3. android 全部命令
  4. android虚拟按键NavigationBar的判断
  5. android 获取mac地址
  6. Android(安卓)字体颜色渐变效果 Span实现
  7. android AsyncTask
  8. Android(安卓)Firewall(防火墙) AndFire
  9. Android去除默认USB调试授权确认框
  10. android 拍照