Android自定义View里面获取宽高及dp和px间的转换
在自定义View的onMeasure和onDraw里面获取View的宽高
onMesure先被调用:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
// 获取宽-测量规则的模式和大小
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
// 获取高-测量规则的模式和大小
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
//获取xml里面设置的宽高的像素值
Log.e(LOG_TAG,"widthSize="+widthSize+",heightSize="+heightSize);
}
onDraw在OnMesure后被调用。
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 获取控件的高度和宽度
int width = getWidth();
int height = getHeight();
//获取的宽度值为:450px
Log.e(LOG_TAG,"onDraw="+width);
// 设置圆的半径 = 宽,高最小值的2分之1
int r = Math.min(width, height)/2;
// 画出圆(蓝色)
// 圆心 = 控件的中央,半径 = 宽,高最小值的2分之1
canvas.drawCircle(width/2,height/2,r,mPaint1);
}
dp和px间的转换
private float dpToPx(float dp, Context context){
float scale=context.getResources().getDisplayMetrics().density;
return dp*scale+0.5f;
}
private float pxToDp(float px,Context context){
float scale=context.getResources().getDisplayMetrics().density;
return (px-0.5f)/scale;
}