Android必知必会-获取View坐标和长宽的时机

如果移动端访问不佳,请访问–>Github版

背景

最近要实现一个功能,用到了一些属性动画,需要获取一些View的坐标信息,设计图如下:

这里我使用的是DialogFragment来实现的,可以复用。

先贴一下获取View坐标的一些资料:

Android View各种尺寸位置相关的方法探究

Android获得控件在屏幕中的绝对坐标

合适的时机

要想获得View的坐标和长宽,必须要等到View绘制完毕,在平常写代码的生命周期函数内一般是获取不到的:

//Activity
onCreate();
onResume();
//Fragmen
onCreate();
onCreateView();
onResume();
onShow();
setUserVisibleHint();

以上这些时机都是不行的。

目前经过测试可用的方法是:

/*
 * 对于:Activity
 * 覆写 onWindowFocusChanged(boolean hasFocus)方法
 */
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        int[] location1 = new int[2] ;
        view.getLocationInWindow(location1); //获取在当前窗口内的绝对坐标
        int[] location2 = new int[2] ;
        view.getLocationOnScreen(location2);//获取在整个屏幕内的绝对坐标
        //do something
    }

/*
 * 对于:Fragmen
 * 在 onCreateView()中为View添加addOnGlobalLayoutListener
 */
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.xxx, container, false);
        ViewTreeObserver vto = view.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new  ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                //在这里获取View及其子控件的坐标和长宽信息
            }
        });
      //do something
        return view;
    }
/*
 * 对于:DialogFragment
 * 在 onCreateDialog()中为View添加addOnGlobalLayoutListener
 * PS: start-end之间的是重点,其他可以不看
 */
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        LayoutInflater inflater = getActivity().getLayoutInflater();
        View view = inflater.inflate(R.layout.xxxx, null);
      //-----获取View及其子控件的坐标和长宽信息 start----
        ViewTreeObserver vto = view.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                //在这里获取View及其子控件的坐标和长宽信息
            }
        });
      //-----获取View及其子控件的坐标和长宽信息 end----

        Dialog dialog = new Dialog(getActivity(), R.style.CustomCityPickerDialog);
        dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
        dialog.setContentView(view);
        dialog.setCanceledOnTouchOutside(true);
        ButterKnife.bind(this, view);
        // 设置宽度为屏宽、靠近屏幕底部。
        Window window = dialog.getWindow();
        window.setBackgroundDrawableResource(R.color.transparent);
        WindowManager.LayoutParams wlp = window.getAttributes();
        wlp.gravity = Gravity.BOTTOM;
        wlp.width = WindowManager.LayoutParams.MATCH_PARENT;
        window.setAttributes(wlp);
        return dialog;
    }

后话

这是最后的成果:

下一篇文章将简单总结一下最近学习的属性动画,和如何实现上图中效果。

PS:

你可以关注的我GithubCSDN微博

时间: 2024-10-24 12:06:59

Android必知必会-获取View坐标和长宽的时机的相关文章

Android必知必会-获取视频文件的截图、缩略图

背景 公司最近要求给我负责的APP加上视频录制和发布的功能,我简单的完成了基本的录制和视频压缩功能,后来发现发布接口需要上传视频的截图,网上搜索了一下资料,在这里整理一下. 代码实现 /** * 获取视频文件截图 * * @param path 视频文件的路径 * @return Bitmap 返回获取的Bitmap */ public static Bitmap getVideoThumb(String path) { MediaMetadataRetriever media = new Me

迈向高阶:优秀Android程序员必知必会的网络基础

1.前言 网络通信一直是Android项目里比较重要的一个模块,Android开源项目上出现过很多优秀的网络框架,从一开始只是一些对HttpClient和HttpUrlConnection简易封装使用的工具类,到后来Google开源的比较完善丰富的Volley,再到如今比较流行的Okhttp.Retrofit. 要想理解他们之间存在的异同(或者具体点说,要想更深入地掌握Android开发中的网络通信技术),必须对网络基础知识.Android网络框架的基本原理等做到心中有数.信手拈来,关键时刻才能

Android必知必会-使用okhttp的PUT方式上传文件

背景 公司的文件上传接口使用PUT协议,之前一直用的都是老项目中的上传类,现在项目中使用了okhttp网络库,就查了下资料,在这里分享一下. 代码实现 /** * @param mediaType MediaType * @param uploadUrl put请求地址 * @param localPath 本地文件路径 * @return 响应的结果 和 HTTP status code * @throws IOException */ public String put(MediaType

mysql 必知必会总结

以前 mysql 用的不是很多, 2 天看了一遍 mysql 必知必会又复习了一下基础.  200 页的书,很快就能看完, 大部分知识比较基础, 但还是了解了一些以前不知道的知识点.自己做一个备份,随时查看. 命令:sql 不区分大小写,语句大写,列.表名小写是一种习惯连接命令:mysql -u user_name –h example.mysql.alibabalabs.com –P3306 –pxxxxquithelp show; // 查看所有 show 命令show databases;

读MYSQL必知必会的总结

看到了mysql必知必会 总结了以下几个以后很有可能用到的知识点: 1.在检索多列的时候,需要再列名之间用","进行分开,最后的列名后面不加. select id,uid,name from 表名;      select* form 表名 代表检索所有的列 2.在检索指定从第几行开始后的几行 select id from 表名 limit 3,4;第3行开始的后4行,要注意的是检测出来的第一行为0. 3.可以用 order by 语句对检测数来的进行排序,因为数据会受到修改编辑的影响

移动前端开发人员必知必会:移动设备概述

因为工作岗位的变换带来工作内容的变动,对于移动网站的前端开发已经疏远了好几个月,在这好几个月中有很多新的东西出现,自己所掌握的一些东西也已经陈旧,所以选择了这本书<HTML5触摸界面设计与开发>来系统地学习和整理一下关于移动网站前端开发的知识体系. 之所以选择这本书,一是因为这本书比较新,2014年04月发的第一版.其二是因为作者Stephen Woods,这是Flickr团队的资深前端,Yahoo主页的Javascript技术平台正是出自此人之手. 接下来的时间里会陆续上传关于这本书学习的一

基础入门_Python-模块和包.深入Celery之常用架构/方案选型/必知必会?

简单介绍: 说明: 此模块是一个专注于分布式消息传递的异步任务队列,所谓任务就是消息,消息中的有效载荷中包含要执行的任务需要的全部数据 几大特性: 1. Celery易于使用和维护,且不需要配置文件,默认配置启动时自动写入消息代理. 2. Celery高可用,连接丢失或失败时客户端或消费者会自动重试,并且可通过消息代理的双主/主从模式来提高高可用性 3. Celery快速,单个进程每分钟可处理百万任务,且优化后可保持往返延迟在亚毫秒级别 4. Celery灵活,几乎所有部分都支持扩展或单独使用,

正则表达式必知必会(修订版)整理教程

正则表达式必知必会(修订版)整理教程 1.   正则表达式入门 1.1  用途:是一种工具,主要用途是搜索变化多端的文本.匹配       到我们想要的信息. 1.2  使用正则表达式:在线测试工具:http://tool.oschina.net/regex/ 2.  匹配单个字符 2.1  匹配纯文本 例子: 文本 Hello,my name is zhaikaishun,please visitmy blog at http://blog.csdn.net/t1dmzks?viewmode=

《SQL必知必会》学习笔记二)

<SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语句,但是实际应用中的业务逻辑往往会非常复杂,所以会用到一些比较复杂的查询,如子查询,联合查询. 1.子查询 当一个查询是另一个查询的条件时,称为子查询.但是说到子查询又不的不说它与嵌套查询两者的区别,下面一张图来说明 下面再用一条sql语句来说明他们的关系. 其中在查询中又分为嵌套子查询和相关子查询,他们之间