关于动态修改控件的宽或者高

转载 :https://blog.csdn.net/gdutxiaoxu/article/details/53700020

首先认识一下view的坐标 

这五个位置是原始位置 , 一旦生成不会改变 
在android中, x轴和y轴的正方向分别为右和下
要注意的是,这些坐标都是相对于view的父容器来说的, 因此是一种相对坐标 

View 的 width 和 height

@ViewDebug.ExportedProperty(category = "layout")

public final int getHeight() {

return mBottom - mTop;

}

我们可以看到android的height 是由mBotto 和mTop共同得出的,那我们要怎样设置android的高度呢?

有人会说直接在xml里面设置 android:height=“” 不就ok 了,那我们如果要动态设置height的高度呢?怎么办 ?

你可能会想setWidth() 方法,但是我们遍历了view的所有方法,都没有发现setWidth(),那要怎样动态设置height呢,其实有两种方法

第一种,通过LayoutParams

int width=50;

int height=100;

ViewGroup.LayoutParams layoutParams=view.getLayoutParams( );

if(layoutParams==null){

layoutParams=new ViewGroup.LayoutParams(width,height);

}else{

layoutParams.height=height;

}

view.setLayoutParams(layoutParams);

第二种方法, 单独的改变top或者bottom的值,这种方法不推荐使用

需要注意的是,平时我们在执行动画的过程,不推荐使用LayoutParams 来改变view的状态, 因为改变LayoutParams会调用

requestLayout()方法,会标记当前view及父容器,同时逐层向上提交,直到 ViewRootlmpl处理该事件,

ViewRootlmpl 会调用三大流程,从measure开始,对于每一个含有标记位的view及其ziview都会进行测量,布局,绘制,性能较差

public void setLayoutParams(ViewGroup.LayoutParams params) {

if (params == null) {

throw new NullPointerException("Layout parameters cannot be null");

}

mLayoutParams = params;

resolveLayoutParams();

if (mParent instanceof ViewGroup) {

((ViewGroup) mParent).onSetLayoutParams(this, params);

}

requestLayout();

}

因此我们如果在api 14 以后 ,在动画执行过程中,要改变View的状态,

推荐使用setTranslationY()和setTranslationX(0等方法,而 尽量避免改变LayoutParams.因为性能嫌贵来说较差。

event.getY() 和 event.getRawY()

要区分于MotionEvent.getRawX() 和MotionEvent.getX();,

在public boolean onTouch(View view, MotionEvent event) 中,当你触到控件时,x,y是相对于该控件左上点(控件本身)的相对位置。 而rawx,rawy始终是相对于屏幕的位置。getX()是表示Widget相对于自身左上角的x坐标,而getRawX()是表示相对于屏幕左上角的x坐标值 (注意:这个屏幕左上角是手机屏幕左上角,不管activity是否有titleBar或是否全屏幕)。












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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值