自定义View之onLayout()(一)
onLayout()方法,是ViewGroup放置子 View的布局方法,是View放置的位置,放置子View的时候只需重写onLayout方法,获取到子View的实例,调用它的方法layout进行布局,实际开发中,配合onMeasure使用,先测量子View的大小,再确定放在父容器的那个位置。
看看ViewGroup中,onLayout方法
复制代码
1
2
3@Override protected abstract void onLayout(boolean changed, int l, int t, int r, int b);
View在父容器的放置,都是根据一个矩形区域来放置的,在看看这个方法,该方法定义为抽象方法,所以在继承该类的时候必须重写该抽象方法,里面的四个参数,int l,int t,int r,in b分别为放置父容器ViewGroup可用的矩形区域的左上角left、top和右下角right、bottom值,这个值刻印通过getLeft、getTop、getRight、getBottom方法获取。
再看看子View的layout方法
复制代码
这个方法是子View的放置方法,在子View中实现,调用这个方法要传入四个放置子View的参数,分别为确定左上角的l和r值,还有确定右下角的r和b值,比如说layout(20,10,80,100),那么该子View占有空间区域的矩形区域相对父容器ViewGroup的位置是,左上角(20,10)处,右下角(80,100)处,该矩形区域的宽高分别为(单位为像素)80-20=60、100-10=90.
1public void layout(int l, int t, int r, int b);
在自定义View中,onLayout配合onMeasure方法一起使用,可以实现自定义View的复杂布局。自定义View首先调用onMeasure进行测量,然后调用onLayout方法,动态获取子View和子View的测量大小,然后进行layout布局。
下面看一段项目中的实例
复制代码
上述实例就是调用layout方法进行动态布局,模拟下来拉升松开反弹的效果。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53package com.suowei.appsuowei.myview; import android.content.Context; import android.util.AttributeSet; import android.view.MotionEvent; import android.widget.LinearLayout; public class StretchLinearLayout extends LinearLayout{ /** *==========下拉可以拉升松开回弹的自定义LinearLayout容器================== *在onTouchEvent中调用了该实例的layout进行动态布局 */ private int moveSum; private int move; private int yDown,yMove; private Boolean isIntercept=false; public StretchLinearLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); // TODO 自动生成的构造函数存根 } public StretchLinearLayout(Context context, AttributeSet attrs) { super(context, attrs); // TODO 自动生成的构造函数存根 } public StretchLinearLayout(Context context) { super(context); // TODO 自动生成的构造函数存根 } @Override public boolean onTouchEvent(MotionEvent event) { int y=(int) event.getY();//每次触摸的纵坐标位置赋值给y switch (event.getAction()) { case MotionEvent.ACTION_DOWN: yDown=y;//把down的纵坐标位置赋值给yDown break; case MotionEvent.ACTION_MOVE: yMove=y;//下来滑动的时候把滑动的当前纵坐标值赋值给yMove if(yMove-yDown>0){//判断如果滑动了 move=yMove-yDown;//计算出这次滑动的距离 moveSum+=move;//把滑动总的距离统计出来 //调用该实例的layout进行动态布局,看到的实际效果就是跟随滑动,不断没拉升 this.layout(getLeft(), getTop()+move, getRight(), getBottom()+move); } break; case MotionEvent.ACTION_UP: //当手指松开的时候,在调用layout进行布局,返回到原来的位置 this.layout(getLeft(), getTop()-moveSum, getRight(), getBottom()-moveSum); moveSum=0; break; } //返回true,表示消费为这次触摸事件 return true; } }
最后
以上就是无私唇膏最近收集整理的关于安卓开发中自定义View之onMeasure(),onLayout(),onDraw()讲解(二)的全部内容,更多相关安卓开发中自定义View之onMeasure()内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复