注意:无论哪种方式,在代码中获取的控件的宽高和设置宽高都是以px做为单位.如果要设置dp值,可先将dp值转成px值后再设置.
先来看看布局文件的xml定义的宽高值,以及显示的效果:
方式1:通过测量获取的宽高值
代码如下:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textView = (TextView) findViewById(R.id.tv); int width = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); int height = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); textView.measure(width, height); height = textView.getMeasuredHeight(); width = textView.getMeasuredWidth(); Log.d("chenys", "宽测量px:" + width + " 高测量px" + height); } }</span>运行的结果如下:
<span style="font-family:Courier New;">public int convertPx2Dp(int px) { float density= context.getResources().getDisplayMetrics().density; return (int)(px / scale + 0.5F * (float)(px >= 0.0F?1:-1)); }</span>具体代码如下:
<span style="font-family:Courier New;">public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textView = (TextView) findViewById(R.id.tv); int width = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); int height = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); textView.measure(width, height); height=textView.getMeasuredHeight(); width=textView.getMeasuredWidth(); Log.d("chenys", "宽测量px:" + width+" 高测量px:" + height); //px->dp int widthDp = convertPx2Dp(width); int heightDp = convertPx2Dp(height); Log.d("chenys", "测量宽度值转dp值:" + widthDp + " 测量高度值转成dp值:" + heightDp); } public int convertPx2Dp(int px) { float density= context.getResources().getDisplayMetrics().density; return (int)(px / scale + 0.5F * (float)(px >= 0.0F?1:-1)); } }</span>我们来看看转成dp后打印的结果如下:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textView = (TextView) findViewById(R.id.tv); int width = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); int height = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); textView.measure(width, height); height=textView.getMeasuredHeight(); width=textView.getMeasuredWidth(); Log.d("chenys", "宽测量px:" + width+" 高测量px:" + height); //px->dp int widthDp = convertPx2Dp(width); int heightDp = convertPx2Dp(height); Log.d("chenys", "测量宽度值转dp值:" + widthDp + " 测量高度值转成dp值:" + heightDp); //应用测量值,注意:代码设置的话只能传入px值 textView.setLayoutParams(new RelativeLayout.LayoutParams(width,height)); } public int convertPx2Dp(int px) { float density = getResources().getDisplayMetrics().density; return (int) (px /density +0.5f); } }再来看看手机的运行效果:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textView = (TextView) findViewById(R.id.tv); int width = textView.getLayoutParams().width;//px int height = textView.getLayoutParams().height; Log.d("chenys", "TextView的宽px" + width + " TextView的高px" + height); int widthDp = convertPx2Dp(width); int heightDp = convertPx2Dp(height); Log.d("chenys", "TextView的宽dp" + widthDp + " TextView的高dp" + heightDp); }
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView textView = (TextView) findViewById(R.id.tv); int width = textView.getWidth(); int height = textView.getHeight(); Log.d("chenys", "TextView的宽px" + width + " TextView的高px" + height); int widthDp = convertPx2Dp(width); int heightDp = convertPx2Dp(height); Log.d("chenys", "TextView的宽dp" + widthDp + " TextView的高dp" + heightDp); }
public class MainActivity extends Activity { private TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = (TextView) findViewById(R.id.tv); int width = textView.getWidth(); int height = textView.getHeight(); Log.d("chenys", "onCreate->TextView的宽px" + width + " TextView的高px" + height); int widthDp = convertPx2Dp(width); int heightDp = convertPx2Dp(height); Log.d("chenys", "onCreate->TextView的宽dp" + widthDp + " TextView的高dp" + heightDp); } @Override protected void onStart() { super.onStart(); int width = textView.getWidth(); int height = textView.getHeight(); Log.d("chenys", "onStart->TextView的宽px" + width + " TextView的高px" + height); int widthDp = convertPx2Dp(width); int heightDp = convertPx2Dp(height); Log.d("chenys", "onStart->TextView的宽dp" + widthDp + " TextView的高dp" + heightDp); } @Override protected void onResume() { super.onResume(); int width = textView.getWidth(); int height = textView.getHeight(); Log.d("chenys", "onResume->TextView的宽px" + width + " TextView的高px" + height); int widthDp = convertPx2Dp(width); int heightDp = convertPx2Dp(height); Log.d("chenys", "onResume->TextView的宽dp" + widthDp + " TextView的高dp" + heightDp); } @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); int width = textView.getWidth(); int height = textView.getHeight(); Log.d("chenys", "onWindowFocusChanged->TextView的宽px" + width + " TextView的高px" + height); int widthDp = convertPx2Dp(width); int heightDp = convertPx2Dp(height); Log.d("chenys", "onWindowFocusChanged->TextView的宽dp" + widthDp + " TextView的高dp" + heightDp); } public int convertPx2Dp(int px) { float density = getResources().getDisplayMetrics().density; return (int) (px / density + 0.5f); } }