android view基础

什么是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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值