在开发中,可以通过getDrawable().getBounds().height()与getDrawable().getIntrinsicHeight()两种方法来获得图片资源的真实宽高
ImageView在不同的分辨率的屏幕中获取的宽高值是不准确的,需要根据density缩放
// 通过getBounds() 获得ImageView中Image的真实宽高,
int dw = (int) (iv.getDrawable().getBounds().width());
int dh = (int) (iv.getDrawable().getBounds().height());
Log.i(TAG, MainActivity.this.getResources().getDisplayMetrics().density+"drawable_X = "
+ dw + ", drawable_Y = " + dh);
// 通过getIntrinsic获得ImageView中Image的真实宽高,
int inDw = iv.getDrawable().getIntrinsicWidth();
int inDh = iv.getDrawable().getIntrinsicHeight();
Log.i(TAG, MainActivity.this.getResources().getDisplayMetrics().density+
"Intrinsic_drawable_X = " + dw + ", Intrinsic_drawable_Y = " + dh);
正确获取方式如下:
public class MainActivity extends Activity {
protected static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ImageView iv = (ImageView) findViewById(R.id.iv);
iv.setImageResource(R.drawable.ic_launcher);
// 等待ImageVivew加载完成
iv.post(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
// ImageView的宽和高,
Log.i(TAG, "iv_W = " + iv.getWidth() + ", iv_H = " + iv.getHeight());
// 显示的逻辑密度==密度/160
float density = MainActivity.this.getResources().getDisplayMetrics().density;
// 通过getIntrinsic 获得ImageView中Image的真实宽高,
int dw = (int) (iv.getDrawable().getBounds().width()/density);
int dh = (int) (iv.getDrawable().getBounds().height()/density);
Log.i(TAG, MainActivity.this.getResources().getDisplayMetrics().density
+"drawable_X = " + dw + ", drawable_Y = " + dh);
// 通过get获得ImageView中Image的真实宽高,
int inDw = (int) (iv.getDrawable().getIntrinsicWidth()/density); //单位是dp
int inDh = (int) (iv.getDrawable().getIntrinsicHeight()/density); //单位是dp
Log.i(TAG, MainActivity.this.getResources().getDisplayMetrics().density
+"Intrinsic_drawable_X = " + dw + ", Intrinsic_drawable_Y = " + dh);
}
});
}
}
getHeight(): View在设定好布局后整个View的高度。
getMeasuredHeight(): 对View上的内容进行测量后得到的View内容佔据的高度,前提是你必须在父布局的onLayout()方法或者此View的onDraw()方法调调 用measure(0,0);(measure 参数的值你可以自己定义),否则你得到的结果和getHeight()得到的结果一样。
google api解释
public float
density The logical density of the display. (像素密度/160)
public int densityDpi
The screen density expressed as dots-per-inch. (像素密度)
dp与px转换
PPI = Pixels per inch,每英寸上的像素数,即 "像素密度"
- xhdpi: 2.0
- hdpi: 1.5
- mdpi: 1.0 (baseline)
- ldpi: 0.75
1dp*ppi/160 = 实际像素。比如1dp x 320ppi/160 = 2px。