View的事件体系----滑动事件

读书笔记

Android开发艺术探索
[讲解的很好](http://gold.xitu.io/post/581ed682128fe1005a064b38)

一、什么是View

1.view是界面层的一种抽象。
2.viewgroup也继承自view

二、View的位置参数

View主要由四个点来控制位置,最重要的是两个点:一个是左上定点,一个是右下顶点。View的位置都是相对于父容器来说的,因此是一种相对坐标系。

Paste_Image.png

在Android3.0以后,引入了translationX/Y 偏移量。
x=left+tranlationX;
通常通过getLeft()等方法拿到的值,是view相对于父容器的位置,但是当view发生偏移时,getLeft()等方法是不会变得,改变的是它的偏移量。

三、MotionEvent

手指按下屏幕时,会触发MotionEvent事件。
点击事件是down---up
滑动事件是down--move---up
同时通过motionevent可以拿到事件motionEvent事件发生时的坐标点--getX,getY。系统提供了两种方法getX/Y,getRowX/Y,前者是相对于view初始时的左上顶点的位置的。后者是相对于屏幕的。如上图。

四、TouchSlop

系统能识别出的最小滑动距离。
即:系统能够识别出的最小滑动距离。如果小于这个值,系统认为这次事件不是滑动事件。
通过:

ViewConfiguration.get(getContext()).getScaledTouchSlop()方法获得

五、速度追踪

VelocityTracker :拿到一次滑动的速度

VelocityTracker velocity=VelocityTracker.obtain();
velocity.addMovement(event);
velocity.computeCurrentVelocity(1000)//时间单位ms
int xVelocity=velocity.getXVelocity();
velocity.clear();
velocity.recycle()

注意
1.在通过get方法拿到速度前,一定要先计算,即调用computeCurrentVelocity方法。
2.从右向左为负值,反之为正值。正负代表方向。
3.不用的时候一定要回收。

GestureDetector

手势检测,辅助用户监听行为的类

GestureDetector mGesture=new GestureDetector(this);
//解决长按时无法拖动的现象
mGesture.setIsLongpressEnabled(false);

第二步 接管view的ontouch事件

boolean consume=mGesture.onTouchEvent(event);
return consume;

第三部 实现监听
OnGestureListener 和OnDoubleTapListener (可选)

六、Scroller弹性滑动

使用Scroller和View的computeScroll方法配合完成view有过度的滑动
1.mScroller.startScroll
2.重写view的computeScroll方法。

//-----------------------------------------------------------------------------------------

View的滑动

1.实现滑动的方式

1.使用View的scrollTo、scrollBy
2.使用动画
3.使用LayoutParams使得view重新布局

2.使用scrollTo实现

两个关键词    view边缘位置:view在布局中的位置
             view内容位置:view中内容的位置(viewgroup也是view);
注意:使用scrollTo只能改变view内容的位置,view本身没有动。

通过getScrollX/Y 拿到view内容滑动的距离----mScrollX/Y 。它们总是等于view边缘或者view内容边缘的水平距离。或者是垂直距离。

方向的正负:

        在水平方向上,参考我们翻书的习惯 :
        1.从右向左为正值
        2.从左向右为负值

        在竖直方向上,同样参考我们的习惯:
        1.从下往上为正值
        2.从上往下为负值

2.改变布局参数

使用LayoutParams
注意改变时调用requestLayout方法

3.各种滑动的对比
1.ScrollTo适合对内容滑动
2.动画适合对没有交互场景的view使用
3.改变布局适合有交互的场景。

弹性滑动

思想:将一次滑动分成多段滑动。

一、使用Scoller
1.创建Scroller对象。
Scroller mScroller=new Scroller(this);
2.滑动到指定的位置
{
 int scrollX=getScrollX();
 int deltaX=destX-scrollX;
 mScroller.startScroll(scrollx,0,deltax,0,1000);
 invalidate();
}
3.重写computeScroll
@Override
public void computeScroll(){
  if(mScroller.computeScrollOffSet()){
       srcollTo(mScroller.getCurrX,mScroller.getCurrY);
       postInvalidate();
   }
}

computeScrollOffSet会在通过startScroll方法中保存的参数根据时间计算要滑动的距离,它的返回值很重要。true代表滑动没有结束,false表示结束。

注意
1.startScroll方法并不能执行滑动,它只是保存了要滑动的距离等参数。
2.一点要调用invalidate方法。这样会时view重新绘制,重新绘制时会调用computeScroll方法。
3.computeScroll是一个空实现,一定要自己具体的实现。
4.computeScroll中通过srcollTo方法实现滑动。
5.scrollTo方法会向Scroll对象拿到当前要滑动的距离,实现一次滑动。
6.接着继续调用postInvalidate方法再次绘制。重复3,4步骤。

二、使用动画加控件

1.通过属性动画计算在规定时间内每一段要滑动的比例
2.将比例作用于控件上
ValueAnimator animator=ValueAnimator.ofInt(0,1).setDuration(1000);
animator.addUpdateListener(new AnimatorUpdataListener(){
publi void onAnimationUpdate(ValueAnimator animator){
float fraction=animator.getAnimatedFraction();
button.scrollTo((startX+deltaX*fraction),0)
}
})

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容