目录
前言
介绍Android的View的相关知识(主要来自《Android进阶之光》),之前记录的,附在这里方便自己查询。
正文
View的继承关系
ViewGroup作为View或者ViewGroup这些组件的容器, 派生了多种布局控件子类, 比如LinearLayout、 RelativeLayout等。
坐标相关
Android系统中有两种坐标系, 分别为Android坐标系和View坐标系。
Android坐标
在Android中, 以屏幕左上角的顶点作为Android原点, 向右是X轴正方向, 向下是Y 轴正方向。
在触控事件中, 可用getRawX() 和getRawY() 方法获得的对应点的Android坐标。
View的坐标
除了Android坐标系, 还有一个坐标系: View坐标系, 它与Android坐标系并不冲突, 两者是共同存在 的, 它们一起来帮助开发者更好地控制View。
子View相对于父布局
-
getTop() : 获取View自身顶边到其父布局顶边的距离。
-
getLeft() : 获取View自身左边到其父布局左边的距离。
-
getRight() : 获取View自身右边到其父布局左边的距离。
-
getBottom() : 获取View自身底边到其父布局顶边的距离。
计算View的宽和高
float width = getRight() - getLeft(); float height = getBottom() - getTop();
子View的点击坐标
通过MotionEvent获取相对于整个屏幕或父布局的点击坐标。
-
getX() : 获取点击事件距离控件左边的距离, 即视图坐标。
-
getY() : 获取点击事件距离控件顶边的距离, 即视图坐标。
-
getRawX() : 获取点击事件距离整个屏幕左边的距离, 即绝对坐标。
-
getRawY() : 获取点击事件距离整个屏幕顶边的距离, 即绝对坐标。
View的滑动
实现View滑动有很多种方法, 在这里主要讲解6种滑动方法, 分别是layout() 、 offsetLeftAndRight() 与 offsetTopAndBottom() 、 LayoutParams、 动画、 scollTo 与 scollBy, 以及Scroller 。
layout()
思路: 记录ACTION_DOWN时的downX和downY位置,然后ACTION_MOVE时计算偏移量并通过layout()进行滑动View。
# ACTION_MOVE int offsetX = event.getX() - downX; int offsetY = event.getY() - downY; //利用layout的方法进行重新刷新 layout(getLeft()+ offsetX, getTop+offsetY, getRight()+offsetX, getBottom()+offsetY);
offsetLeftAndRight() 与offsetTopAndBottom()
跟Layout()差不多
# ACTION_MOVE # 部分代码略 offsetLeftAndRight(offsetX); offsetTopAndBottom(offsetY);
改变LayoutParams参数
这个比较常用,也比较简单,也就是通过改变布局参数,重新刷新。
这里以父布局为LinearLayout为例,
# 下面是获取LayoutParams的一种方式 LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams)getLayoutParams(); lp.leftMargin = getLeft() + offsetX; lp.topMargin = getTop() + offsetY; setLayoutParams(lp);
当然,还可以哟个ViewGroup.MarginLayoutParams
ViewGroup.MarginLayoutParams lp = (ViewGroup.MarginLayoutParams)getLayoutParams(); lp.leftMargin = getLeft() + offsetX; lp.topMargin = getTop() + offsetY; setLayoutParams(lp);
动画
动画移动。
-
补间动画的平移
-
属性动画
scrollTo和scrollBy
scrollTo(x, y) 表示移动到一个具体的坐标点, 而scrollBy(dx, dy) 则表示移动的增量为dx、 dy。 其中, scollBy最终也是要调用scollTo的。
scollTo、 scollBy移动的是View的内容, 如果在ViewGroup中使用, 则是移动其所有的子View。 我们将 ACTION_MOVE中的代码替换成如下代码:
((View)getParent()).scrollBy(-offsetX,-offsetY);
Scroller
在用scollTo/scollBy方法进行滑动时, 这个过程是瞬间完成的, 所以用户体验不大好。 这里我们可以使用 Scroller 来实现有过渡效果的滑动, 这个过程不是瞬间完成的, 而是在一定的时间间隔内完成的。
参考文章
1.《Android进阶之光》