Android 自定义View measure模板

来源:互联网 发布:复合增长率算法 编辑:程序博客网 时间:2024/05/21 15:49

使用自定义View的时候,我们往往会重载onMeasure函数, 用多了之后,发现其实都是一套写法,因此记录下这个模板.

public class MyView extends View {public MyView(Context context) {super(context);}public MyView(Context context, AttributeSet attrs) {super(context, attrs);}//计算宽private int measureWidth(int measureSpec){int result = 0;int mode = MeasureSpec.getMode(measureSpec);int size = MeasureSpec.getSize(measureSpec);if(mode == MeasureSpec.EXACTLY)  //当指定了控件大小或者使用Match_Parent{result = size; }else{//可以用下面的函数将dp转换成px//float pxValue = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpValue, getResources().getDisplayMetrics());result = 100; // 单位是像素,这里写上自己计算的控件大小if(mode == MeasureSpec.AT_MOST) //一般使用Wrap_Content会进入这个条件{result = Math.min(result, size);}}return result;}//计算高private int measureHeight(int measureSpec){int result = 0;int mode = MeasureSpec.getMode(measureSpec);int size = MeasureSpec.getSize(measureSpec);if(mode == MeasureSpec.EXACTLY)  //当指定了控件大小或者使用Match_Parent{result = size; }else{//可以用下面的函数将dp转换成px//float pxValue = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dpValue, getResources().getDisplayMetrics());result = 100; // 单位是像素,这里写上自己计算的控件大小if(mode == MeasureSpec.AT_MOST) //一般使用Wrap_Content会进入这个条件{result = Math.min(result, size);}}return result;}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));}}


0 0