• Android -- 获取View宽高


    在activity中可以调用View.getWidth、View.getHeight()、View.getMeasuredWidth() 、View.getgetMeasuredHeight()来获得某个view的宽度或高度,但是在onCreate()、onStrart()、onResume()方法中会返回0,这是应为当前activity所代表的界面还没显示出来没有添加到WindowPhone的DecorView上或要获取的view没有被添加到DecorView上或者该View的visibility属性为gone 或者该view的width或height真的为0 ,所以只有上述条件都不成立时才能得到非0的width和height。

    View的事件回调里使用

    这时候该view已经被显示即被添加到DecorView上  如点击事件  触摸事件   焦点事件等

    View view=findViewById(R.id.tv);  
        view.setOnClickListener(new OnClickListener() {  
              
            @Override  
            public void onClick(View v) {  
                int width = v.getWidth();  
            }  
        });

    onWindowFocusChanged() 回调

    在activity被显示出来时即添加到了DecorView上时获取宽和高如onWindowFocusChanged() 回调方法

    @Override  
    public void onWindowFocusChanged(boolean hasFocus) {  
        View iv1 = findViewById(R.id.iv1);  
        View iv2=findViewById(R.id.iv2);  
        String msg1="iv1' "+iv1.getWidth()+" height:"+iv1.getHeight()+"      measuredWidth:"+iv1.getMeasuredWidth()+"measuredHeight:"+iv1.getMeasuredHeight();  
        String msg2="iv2' "+iv2.getWidth()+" height:"+iv2.getHeight()+"      measuredWidth:"+iv2.getMeasuredWidth()+"measuredHeight:"+iv2.getMeasuredHeight();  
        Log.i("onWindowFocusChanged() "+msg1);  
        Log.i("onWindowFocusChanged() "+msg2);  
        super.onWindowFocusChanged(hasFocus);  
    }

    延时

    在onResume方法最后开线程300毫秒左右后获取宽和高   因为onResume执行完后300毫秒后,界面就显示出来了。

    view.postDelayed(new Runnable() {  
                  
                @Override  
                public void run() {  
                    View iv1 = findViewById(R.id.iv1);  
                    View iv2=findViewById(R.id.iv2);  
                    String msg1="iv1' "+iv1.getWidth()+" height:"+iv1.getHeight()+"  measuredWidth:"+iv1.getMeasuredWidth()+"measuredHeight:"+iv1.getMeasuredHeight();  
                    String msg2="iv2' "+iv2.getWidth()+" height:"+iv2.getHeight()+"  measuredWidth:"+iv2.getMeasuredWidth()+"measuredHeight:"+iv2.getMeasuredHeight();  
                    Log.i("onWindowFocusChanged() "+msg1);  
                    Log.i("onWindowFocusChanged() "+msg2);  
                }  
            }, 300);

    在onCreate()或onResume()等方法中需要

    getViewTreeObserver().addOnGlobalLayoutListener()来添为view加回调在回调里获得宽度或者高度获取完后让view删除该回调

    view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {  
              
            @Override  
            public void onGlobalLayout() {  
                view.postDelayed(new Runnable() {  
                      
                    @Override  
                    public void run() {  
                        View iv1 = findViewById(R.id.iv1);  
                        View iv2=findViewById(R.id.iv2);  
                        String msg1="iv1' "+iv1.getWidth()+" height:"+iv1.getHeight()+"  measuredWidth:"+iv1.getMeasuredWidth()+"measuredHeight:"+iv1.getMeasuredHeight();  
                        String msg2="iv2' "+iv2.getWidth()+" height:"+iv2.getHeight()+"  measuredWidth:"+iv2.getMeasuredWidth()+"measuredHeight:"+iv2.getMeasuredHeight();  
                        Log.i("onWindowFocusChanged() "+msg1);  
                        Log.i("onWindowFocusChanged() "+msg2);  
                    }  
                }, 300);  
            }  
        });

    我是天王盖地虎的分割线

    参考:http://blog.csdn.net/nailsoul/article/details/25909313

  • 相关阅读:
    error: device not found
    RK3288 查看时钟树
    GPS数据包格式解析
    Android 操作文件系统失败: Read-only file system
    Ubuntu 14.04 配置安卓5.1编译环境
    升级 php composer 版本
    清理 laravel blade 模板缓存
    Laravel collection 报错 join(): Invalid arguments passed
    Laravel firstOrNew 与 firstOrCreate 的区别
    执行 crontab 的计划任务
  • 原文地址:https://www.cnblogs.com/yydcdut/p/4474217.html
Copyright © 2020-2023  润新知