坐标系

  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;}
scroller.gif

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

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

更多相关文章

  1. Android微信端的下拉刷新功能
  2. Android(安卓)slidingmenu详细解释 滑动的优化
  3. Android屏蔽/禁止ViewPager左右滑动/滚动
  4. 利用一个singleInstance的activity实现音乐播放器锁屏
  5. 修改ProgressBar的进度条颜色
  6. android noTouch 事件
  7. Android(安卓)UI开发第六篇——仿QQ的滑动Tab
  8. android的触摸屏事件
  9. Android中各种onTouch事件

随机推荐

  1. Flutter布局中嵌入Android原生组件 - 全
  2. 巧用AsyncTask的onProgressUpdate回调
  3. Android网络相关---上网流程
  4. Android之Adapter用法总结
  5. Gradle 发布共享库——如何通过Gradle发
  6. Android音频系统探究——从SoundPool到Au
  7. Android(安卓)Vector矢量图
  8. Android(安卓)下的视频播放器faplayer 编
  9. 让你自己写的Android的Launcher成为系统
  10. Android中measure过程、WRAP_CONTENT详解