一、视图座标系
在视图座标中我们可以通过如下方法可以获得View到其父控件(ViewGroup)的距离:
方法 | 解释 |
---|---|
getTop() | 获取View自身底边到其父布局顶边的距离 |
getLeft() | 获取View自身左边到其父布局左边的距离 |
getRight() | 获取View自身右边到其父布局左边的距离 |
getBottom() | 获取View自身底边到其父布局顶边的距离 |
无论是View还是ViewGroup,最终的点击事件都会由onTouchEvent(MotionEvent event)方法来处理,MotionEvent也提供了各种获取焦点坐标的方法:
方法 | 解释 |
---|---|
getX() | 返回值为getLeft()+getTranslationX(),当setTranslationX()时getLeft()不变,getX()变。 |
getY() | 返回值为getTop()+getTranslationY(),当setTranslationY()时getTop()不变,getY()变。 |
getRawX() | 获取点击事件距离整个屏幕左边距离,即绝对坐标 |
getRawY() | 获取点击事件距离整个屏幕顶边的的距离,即绝对坐标 |
二、实现View滑动的六种方法
- 使用layout的方法;
- 使用offsetLeftAndRight()与offsetTopAndBottom();
- 使用LayoutParams();
- 使用scrollTo()与scrollBy();
- 使用Scroller类
- 使用属性动画
1.使用onLayout的方法可以试着view的位置,那么我们就可以通过改变left,right,top,bottom来使View移动,结合MontionEvent来实现view跟着手指的滑动移动。
2.使用offsetLeftAndRight()与offsetTopAndBottom()
和Layout方法一样,都是对左上右下移动的一个封装
- offsetLeftAndRight()是对左右的一个封装
- offsetTopAndBottom()是对上下的一个封装
3.使用LayoutParams()
我们可以使用LayoutParams的方法来实现view的移动,LayoutParams可以设置view的位置,也可以通过geLayoutParams方法来获得当前view的位置。自然也可以使用setLayoutParams方法来修改View的位置,结合TouchEvent方法就可以让View进行变动。
a: 获取偏移量的方法和前两个一样,
b:这里的LayoutParams,是根据父类的类型来定的。LinearLayout.LayoutParams 、RelativeLayout.LayoutParams 等
这里主要分使用两种方式一种是getX,getY,(注释部分) 。一种是getRawX,getRawY(非注释部分)来获取触摸点的坐标
A:每次调用onTouchEvent的时候都来获取一下触摸点的坐标
B:在按下的时候记录一下触摸点的坐标
C:在move的事件的时候进行,进行偏移量的计算。
D:这里有一点不一样就是使用getRawX,和getRawY的时候需要最后重新设置初始坐标,因为他相对于屏幕而言的,所以每次都需要重新设置赋值。
三、属性动画
实现动画效果在Android开发中非常常见,因此Android系统一开始就提供了两种实现动画的方式:
- 逐帧动画(Frame Animation)
- 补间动画( Tweened animation )
动画的监听
完整的动画具有start,Repeat,End,Cancel四个过程:
组合动画
AnimatorSet这个类提供了一个play()方法,如果我们向这个方法中传入一个Animator对象(ValueAnimator或ObjectAnimator)将会返回一个AnimatorSet.Builder的实例,AnimatorSet.Builder中包括以下四个方法:
1.after(Animator anim) after中的动画先执行, 之后才是play中的动画.
2.after(long delay) after中设置时间, 那么play中的动画会根据时间延迟执行.
3.before(Animator anim) before中的动画后执行, play中的先执行.
4.with(Animator anim) play中的动画和with中的一同执行.
6.playTogether() 中间可以放入要一起执行的全部动画, 之后不可接 after(), before()这些函数.