什么是view
view是android中所有控件的基类,例如textview,button或者viewgroup等。viewgroup也继承了view,但是可以包含多个控件。
这是我网上找的一张继承关系图:
view的参数
view最基础的四个参数 left,top,right,bottom,通过view的
getLeft(),
getTop(),
getRight(),
getBottom()方法获取。分别代表左上角横坐标,左上角纵坐标,右上角横坐标,右上角纵坐标。需要注意的是这些坐标是相对坐标,相对于自己这个view的父容器。在android中x轴和y轴的正方向代表的是右边和下边,屏幕左上角为起点向右和下x,y增大。根据这个view的宽和高也很容易计算出:
width = rigth-left
heigth = bottom-top
从android3.0开始,view增加了几个参数,分别是x,y,translationX,translationY。translationX和translationY代表的是view的偏移量。偏移后left,top这些值不会改变,改变的是x,y,translationX,translationY。所以可以得到这几个位置参数之间的关系:
x = left + translationX
y = top + translationY
view可以通过getX()和getY()方法获取x和y的值,x和y同样是相对坐标。如果想获取相对于手机屏幕左上角的坐标,可以使用getRawX()和getRawY()方法来获取。
view的滑动
view的滑动有很多种方式,这里举几种常见的来说。
通过scrollTo/scrollBy:它可以快速的实现view的滑动效果。但是要注意的是滑动的只是view的内容,并不是view本身。例如一个button修改了scrollX,移动的只是button里的字,button本身并不会移动,类似于listview中item的移动。从源码可以看出scrollBy调用的就是scrollTo方法,顾名思义,scrollBy代表的是相对滑动,scrollTo代表的是绝对滑动。要注意的是内容向右边移动mScrollX是负的,向左边移动mScrollX为正,mScrollY也是如此,内容向下为负,向上为正。
Scroller scroller = new Scroller(context);
scroller.startScroll(getScrollX(),0,-100,0,2000);
invalidate();
使用scroller来实现滑动,startScroll方法传入滑动的起点和要滑动的距离,然后还有滑动的时间。
当然这样并不会让view开始滑动。查看源码可以发现它只是保存了我们传入的参数:
public void startScroll(int startX, int startY, int dx, int dy, int duration) {
mMode = SCROLL_MODE;
mFinished = false;
mDuration = duration;
mStartTime = AnimationUtils.currentAnimationTimeMillis();
mStartX = startX;
mStartY = startY;
mFinalX = startX + dx;
mFinalY = startY + dy;
mDeltaX = dx;
mDeltaY = dy;
mDurationReciprocal = 1.0f / (float) mDuration;
}
关键在于invalidate方法,它会导致view的重绘,然后在view的draw()方法中又会调用computeScroll()方法,由于computeScroll是一个空实现,所以需要我们自己去实现:
public void computeScroll(){
if(mScroller.computeScrollOffset()){
scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
postInvalidate();
}
}
里面做了一些判断是否需要继续滑动。如果需要滑动就会调用postInvalidate()导致重绘,如此反复直到滑动结束。
view的滑动当然也可以通过动画来实现。需要注意的是,普通动画移动后实际上view并没有移动,例如一个button移动了你会发现点击无效。点击原来的位置有效。不过属性动画可以解决这个问题。
view的滑动也可以通过layoutParams来实现。逐渐增大margin。