前言

介绍Android的View的相关知识(主要来自《Android进阶之光》),之前记录的,附在这里方便自己查询。

正文

View的继承关系

ViewGroup作为View或者ViewGroup这些组件的容器, 派生了多种布局控件子类, 比如LinearLayout、 RelativeLayout等。

Android View相关摘抄

坐标相关

Android系统中有两种坐标系, 分别为Android坐标系和View坐标系。

Android坐标

在Android中, 以屏幕左上角的顶点作为Android原点, 向右是X轴正方向, 向下是Y轴正方向。

在触控事件中, 可用getRawX() 和getRawY() 方法获得的对应点的Android坐标。

View的坐标

除了Android坐标系, 还有一个坐标系: View坐标系, 它与Android坐标系并不冲突, 两者是共同存在的, 它们一起来帮助开发者更好地控制View。

Android View相关摘抄

子View相对于父布局
  1. getTop() : 获取View自身顶边到其父布局顶边的距离。

  2. getLeft() : 获取View自身左边到其父布局左边的距离。

  3. getRight() : 获取View自身右边到其父布局左边的距离。

  4. getBottom() : 获取View自身底边到其父布局顶边的距离。

计算View的宽和高

float width  = getRight() - getLeft();
float height = getBottom() - getTop();
子View的点击坐标

通过MotionEvent获取相对于整个屏幕或父布局的点击坐标。

  1. getX() : 获取点击事件距离控件左边的距离, 即视图坐标。

  2. getY() : 获取点击事件距离控件顶边的距离, 即视图坐标。

  3. getRawX() : 获取点击事件距离整个屏幕左边的距离, 即绝对坐标。

  4. 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);
动画

动画移动。

  1. 补间动画的平移

  2. 属性动画

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 来实现有过渡效果的滑动, 这个过程不是瞬间完成的, 而是在一定的时间间隔内完成的。

Android View相关摘抄

参考文章

1.《Android进阶之光》

相关文章

暂无评论

none
暂无评论...