android 布局参数理解

1,Layout_weight这个属性只对Linearlayout生效,等于0时优先满足。1,2,3,4按比例分配(数值越小占地越多)。此属性优先于其他大小属性。


2,singleLine已过期,使用lines="1"替代,滚动时加上scroll方向。


3,使用android.view.View.layout(int l, int t, int r, int b)这个方法设置的是View相对于父控件的参数,并不是屏幕的参数。


4,getWidth()、getHeight()和getMeasuredWidth()、getMeasuredHeight()这两对函数之间的区别,getMeasuredWidth()、getMeasuredHeight()返回的是measure过程得到的mMeasuredWidth和mMeasuredHeight的值,而getWidth()和getHeight()返回的是mRight - mLeft和mBottom - mTop的值。一般情况下layout过程会参考measure过程中计算得到的mMeasuredWidth和mMeasuredHeight来安排子视图在父视图中显示的位置,但这不是必须的,measure过程得到的结果可能完全没有实际用处,特别是对于一些自定义的ViewGroup,其子视图的个数、位置和大小都是固定的,这时候我们可以忽略整个measure过程,只在layout函数中传入的4个参数来安排每个子视图的具体位置。


5,view.getLocationOnScreen(location);  该方法可以获取到当前view与屏幕的关系,location(0)代表X值,表示该view的左边缘与屏幕的左边缘之间的距离。可以想象,当滑屏产生,view开始移动该值肯定会改变的。location(1)代表Y值,表示该view的上边缘与屏幕的上边缘之间的距离,该距离肯定是包含标题栏的高度的。


ps:View.getLocationInWindow()和 View.getLocationOnScreen()在window占据全部screen时,返回值相同,不同的典型情况是在Dialog中时。当Dialog出现在屏幕中间时,View.getLocationOnScreen()取得的值要比View.getLocationInWindow()取得的值要大。


6,滚动参数理解:
class MyLinearLayout extends LinearLayout {
        public MyLinearLayout(Context ctx) {
            super(ctx);
        }
        @Override
        public void computeScroll() {
            Log.d(TAG, this.toString() + " computeScroll-----------");
            if (mScroller.computeScrollOffset())
            {
                scrollTo(mScroller.getCurrX(), mScroller.getCurrY());
                Log.d(TAG, "getCurrX = " + mScroller.getCurrX());
                Log.d(TAG, "getCurrX child= " + getChildAt(0).getScrollX());
                Log.d(TAG, "getCurrX Layout= " + this.getScrollX());
                getChildAt(0).scrollTo(5, -10);
                getChildAt(0).invalidate();
            }
        }
    }
上例中,scrollTo(mScroller.getCurrX(), mScroller.getCurrY())这个是滚动MyLinearLayout,移动的是MyLinearLayout的子控件getChildAt(0),这是由于第三点讲的,View的绘制取决于他在父控件中的相对位置,scrollTo后,MyLinearLayout的(mScroller.getCurrX(), mScroller.getCurrY())这个坐标变成了它自己作为坐标系的原来左上角的坐标,于是getChildAt(0)的相对位置改变(子控件相对父控件的绝对位置没变,但是父控件的左上角变了,于是相对位置改变。移动方向:上加下减,左加右减),看起来就是移动了。
mScroller.getCurrX() = MyLinearLayout.getScrollX();
getChildAt(0).scrollTo(5, -10)这一句进一步深化理解View的绘制取决于他在父控件中的相对位置,调用这一句getChildAt(0)并不会移动,因为它相对父控件的相对位置没有改变,改变的是它自己作为坐标系的左上角的坐标。scrollTo的作用应该是移动自己的画布。
getChildAt(0).getScrollX() = 5;


7,requestLayout对滚动参数的影响:
1),ViewGroup的子类调用scrollTo不可恢复,基本View调用scrollTo会被恢复。
2),所有的offsetLeftAndRight都会被恢复到初始位置。
3),offsetLeftAndRight恢复的是View的位置(同android.view.View.layout(int l, int t, int r, int b)),并非改变以自己为坐标系的左上角坐标。
可以猜测,requestLayout恢复的是子控件在父控件中的相对坐标,而对于父控件的左上角坐标则不会改变。


8,Android~获取view在屏幕中的位置
getLocalVisibleRect , 返回一个填充的Rect对象, 感觉是这个View的Rect大小,left,top取到的都是0
getGlobalVisibleRect , 获取全局坐标系的一个视图区域, 返回一个填充的Rect对象;该Rect是基于总整个屏幕的
getLocationOnScreen ,计算该视图在全局坐标系中的x,y值,(注意这个值是要从屏幕顶端算起,也就是索包括了通知栏的高度)//获取在当前屏幕内的绝对坐标 
getLocationInWindow ,计算该视图在它所在的widnow的坐标x,y值,//获取在整个窗口内的绝对坐标 
getLeft , getTop, getBottom, getRight,  这一组是获取相对在它父亲里的坐标
**注**:如果在Activity的OnCreate()事件输出那些参数,是全为0,要等UI控件都加载完了才能获取到这些


example:
    int[] location = new int[2];
    v.getLocationOnScreen(location);
    int x = location[0];
    int y = location[1];

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值