Android 当我可以测量旋转后imageView的实际宽度和高度时
我试图在屏幕旋转后获得imageView的宽度和高度,但它总是返回0 注意:旋转后不会调用onWindowFocusChanged,因为我手动处理旋转。当我尝试这个代码的时候Android 当我可以测量旋转后imageView的实际宽度和高度时,android,Android,我试图在屏幕旋转后获得imageView的宽度和高度,但它总是返回0 注意:旋转后不会调用onWindowFocusChanged,因为我手动处理旋转。当我尝试这个代码的时候 ViewTreeObserver vto = mImgView.getViewTreeObserver(); vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { public boolean onPreDraw()
ViewTreeObserver vto = mImgView.getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
public boolean onPreDraw() {
mImgView.getViewTreeObserver().removeOnPreDrawListener(this);
viewWidth = mImgView.getWidth();
Log.e("Width =",viewWidth +"");
return true;
}
});
它被调用两次并返回不同的值其中一个是正确的!!
我的图像视图显示代码如下
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
Configuration config=getResources().getConfiguration();
if(config.orientation == Configuration.ORIENTATION_PORTRAIT)
{
setContentView(R.layout.quran_display_act);
mImgtView = (ImageView) findViewById(R.id.rightImg_view);
mImgtView.setImageBitmap(bitmap);
//TODO hereee
float viewWidth = mImgtView.getWidth();
...
}
那是什么,为什么再次调用setContentView?如果要手动处理方向更改,请从清单中删除configChanges=“orientation”(如果有)。然后每次旋转屏幕时,整个活动都会重建。所以您只需将发布的if-else语句放在onCreate()中,而不使用onConfigurationChanged。应该有帮助 编辑: 方向改变时切换布局没有问题。以上只是官方的方式之一。需要注意的重要一点是:setContentView可能不会被多次调用!看到或看到。经验法则:始终在super.onCreate下面的onCreate内部调用setContentView,然后再也不要调用 因此,如果您想在运行时更改方向时切换布局,则必须删除“setContentView(R.layout.quran_display_act);”并使用其他内容。最值得注意的选择是:
不,我不希望每次旋转都重新启动活动,我只想更改布局旋转时在横向布局和纵向布局之间切换有什么问题?这是常见的,由android官方推荐tutorial@RamDroid我的答案现在应该回答了你们所有的重要问题。我试过很多次了,它也给出了不同的值。你们的观点最终被测量到多种尺寸并没有错。布局(如RelativeLayout)在确定其正确大小之前可能会多次测量视图。那么,我如何知道正确的大小?您实际需要的大小是什么?这可能有助于找到正确的答案。我需要在此图像视图上的某个位置绘制一些矩形/图形,该位置可以相对于实际大小进行计算。您可以使用
OnGlobalLayoutListener
,而不必分离该侦听器。只要布局侦听器中的代码不影响视图的布局,它就不会导致无限循环。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec));
int width = MeasureSpec.getSize(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
if(getMeasuredWidth()!=0 && getMeasuredHeight()!=0)
{
//write your code here
//it gets called many times ,so write a condition also to stop executing the same several times.
}
}