关于动态修改控件的宽或者高
转载 :https://blog.****.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或是否全屏幕)。