Warning: mkdir(): No space left on device in D:\wwwroot\86494.com\auto_cache.php on line 25

Warning: chmod(): No such file or directory in D:\wwwroot\86494.com\auto_cache.php on line 26
getGlobalVisibleRect和getLocalVisibleRect-八六四九四

getGlobalVisibleRect和getLocalVisibleRect

发布时间:2021-09-21 09:03:27

在看android官网的demo的时候遇到这两个api,开始不是很明白这两个方法的作用。


通过多次的调试和测试之后慢慢开始有了点眉目,为了防止以后忘记,以此博文为记。


?


作为测试的目的,我写了这样一个布局



xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/container"
tools:context=".MainActivity"
android:paddingLeft="10px">

android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:id="@+id/innerL"
android:paddingLeft="20px">

android:id="@+id/expandedImage"
android:layout_width="wrap_content"
android:src="@drawable/thumb1"
android:layout_height="wrap_content"/>




另外为了方便测试,我将虚拟机设置为1dp=1px,大小等于320x480


因为这两个方法在View对象里面,所以基本上继承自View的对象都可以使用。


也是为了方便自己,我使用ImageView作为测试对象,图片大小为160x120px


?


下面是我自己的一个测试过程:


因为getLocalVisibleRect只有一个参数,所以我从这个方法入手


代码如下



@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

final ImageView imageView = (ImageView) findViewById(R.id.expandedImage);

imageView.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Rect localRect = new Rect();
imageView.getLocalVisibleRect(localRect);
System.out.println("local" + localRect);
}
});
}

程序执行后Logcat输出:


localRect(0, 0 - 160, 120)


很明显localRect变量中的right和bottom正是图片的长和宽。


目前的结论是:getLocalVisibleRect(Rect r)方法可以把视图的长和宽映射到一个Rect对象上。


?


这里我们先放下这个方法,把注意力集中到getGlobalVisibleRect方法中。


将代码改为:



@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

final ImageView imageView = (ImageView) findViewById(R.id.expandedImage);

imageView.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Rect globalRect = new Rect();
imageView.getGlobalVisibleRect(globalRect);
System.out.println("global" + globalRect);
}
});
}

Logcat输出:


globalRect(30, 81 - 190, 201)


除了30和190可以猜测出是什么(即left和right),其他的基本上没有什么线索,只知道是top和bottom。


30是paddingLeft,即图片向右偏移了30px,因此right很自然就多了30px


top和bottom要知道是什么,我用了最笨的办法,就是用尺子量。



可见,这81像素就是状态栏加上ActionBar的高度,所以Bottom120加上81就是201


目前的结论是:getGlobalVisibleRect方法的作用是获取视图在屏幕坐标系中的偏移量


?


那么,我的结论真的是正确的吗,其实我也不知道,继续测试下去。


把原先的布局文件改成下面这样的,现在我们重点对LinearLayout进行测试



xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/container"
tools:context=".MainActivity">

android:layout_width="320dp"
android:layout_height="480dp"
android:orientation="vertical"
android:id="@+id/innerL"
android:background="#550000ff"
android:layout_marginLeft="-50px"
android:layout_marginTop="30px">




布局效果如下:这种布局的目的是让这个View超出屏幕区域



java代码如下:



@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

final LinearLayout ll = (LinearLayout) findViewById(R.id.innerL);

ll.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
Rect localRect = new Rect();
ll.getLocalVisibleRect(localRect);
Rect globalRect = new Rect();

ll.getGlobalVisibleRect(globalRect);
System.out.println("global" + globalRect);
System.out.println("local" + localRect);
}
});
}

现在我们可以点击蓝色的这个布局获取数据,这次我们同时获取这两个方法返回的数据


Logcat数据:


????? globalRect(0, 111 - 271, 480)

?


?先来画图分析globalRect中的数据,在前面我们知道globalRect是基于屏幕坐标系的



从上图可以看出,蓝色区域的四个点的坐标实际上是LinearLayout在屏幕坐标系的可见区域


结论:


getGlobalVisibleRect方法的作用是获取视图在屏幕坐标中的可视区域


另外需要说的是,getGlobalVisibleRect还可以接受第二个Point类型的参数:


????? targetView.getGlobalVisibleRect(Rect r, Point gobalOffset)


调用完毕后,globalOffset的值就是targetView原点偏离屏幕坐标原点的距离。


?


现在来看localRect(49, 0 - 320, 369),初步猜测它是基于视图本身的坐标,


只要该视图没有被遮挡,targetView.getLocalVisibleRect()的坐标总是等于:


(0, 0, targetView.getwidth(), targetView.getheight())


从布局不难看出,我们让它向左偏移了50个像素,因此它本身的坐标也跟着向左移动50像素,


至于为什么是49,这个我也不太清楚。因为视图的top和right在该布局中总是可见,所以是0和320,


而bottom已经超出了屏幕, 所以480(屏幕的高度)-111(ActionBar+statusBar+marginTop)=369.


结论是:


getLocalVisibleRect的作用是获取视图本身可见的坐标区域,坐标以自己的左上角为原点(0,0)


最后测试图:



?


布局文件代码:



xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/container"
tools:context=".MainActivity">

android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:id="@+id/innerL">

android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/thumb1"/>



android:id="@+id/local"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"/>

android:id="@+id/global"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/local"
android:layout_below="@id/local"/>

android:id="@+id/offset"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@id/local"
android:layout_below="@id/global"/>




?


程序逻辑:



package com.whathecode.zoomimage;

import android.graphics.Point;
import android.graphics.Rect;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;


public class MainActivity extends ActionBarActivity
{

private int lastX = 0;
private int lastY = 0;

@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

ImageView imageView = (ImageView) findViewById(R.id.img);
imageView.setOnTouchListener(new View.OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();
break;
case MotionEvent.ACTION_MOVE:
int dx = (int) event.getRawX() - lastX;
int dy = (int) event.getRawY() - lastY;

int left = v.getLeft() + dx;
int top = v.getTop() + dy;
int right = v.getRight() + dx;
int bottom = v.getBottom() + dy;

v.layout(left, top, right, bottom);
lastX = (int) event.getRawX();
lastY = (int) event.getRawY();

Rect localRect = new Rect();
v.getLocalVisibleRect(localRect);
((TextView) findViewById(R.id.local))
.setText("local" + localRect.toString());

Rect globalRect = new Rect();
Point globalOffset = new Point();
v.getGlobalVisibleRect(globalRect, globalOffset);
((TextView) findViewById(R.id.global))
.setText("global" + globalRect.toString());
((TextView) findViewById(R.id.offset))
.setText("globalOffset:" + globalOffset.x + "," + globalOffset.y);
break;
case MotionEvent.ACTION_UP:
break;
}
return true;
}
});


}
}


转载于:https://www.cnblogs.com/ai-developers/p/4413585.html






相关资源:服务器配置教程 服务器配置教程

相关文档

  • 苹果11怎么设锁屏密码
  • 关于二叉树结点的小公式
  • 农民科技指导员个人工作总结
  • 淘宝店怎么把自己的商品前面
  • 2021年广东工业大学第十五届文远知行杯程序设计竞赛 E.捡贝壳(离线做法)
  • 人教版五年级上册数学期末测试题及答案
  • 生产企业劳动合同模板
  • 【c++】vector中迭代器失效问题
  • 小米9ccpro工程模式
  • 喜胜客加盟店要多少钱
  • 哪些水培植物好看又好养
  • 我的妈妈初中学生作文
  • 2017中级统计师考试统计工作实务备考练习题
  • 促销活动设计海报图片大全
  • 洗牙伤牙齿吗
  • 痛苦的滋味作文(精选9篇)
  • 治疗尖锐湿疣 偏方有奇效
  • 孤寂伤感唯美古风签名
  • hexo个人博客:换了电脑怎么办
  • 平板支撑怎么呼吸平板支撑呼吸这样调节
  • 二大爷
  • 给大学同学空间留言的离别句子
  • 新员工工作计划范文四篇
  • 如何设置无线路由器tplinkac1750c
  • 女人梦见黑棺材啥意思
  • 医院后勤工作个人总结_幼儿园后勤工作个人总结范文六篇
  • uniaccess安全助手卸载_手把手教你卸载电脑的流氓软件(每天一个小知识)
  • 伪装者中原型历史人物都有哪些
  • 做生意祝福语词_祝福生意兴隆的话
  • 杞人忧天造句
  • 猜你喜欢

  • 硫酸三厂节能管理机构职责
  • 高考语文常考古诗文
  • 中国有卖世界上最小发动机吗
  • 有关网上高校实验室智能电源管理系统的设计
  • leetcode39. 组合总和、40. 组合总和 II(c++)
  • 手机如何设置网络密码忘了怎么办
  • 【演讲稿】英语演讲稿:我喜欢运动
  • 苏州引力波贸易有限公司(企业信用报告)- 天眼查
  • 2018最新餐饮企业员工合同范本
  • 山东省高密市第三中学高中政治第一、二课神奇的货币多
  • 电风扇不转了是怎么回事?电风扇不转了怎么办?
  • 病理生理学网络课件第11章凝血与抗凝血*衡紊乱课件
  • 2007年乐清中学自主招生考试-数学
  • 家长会上家庭教育经验发言稿
  • 项目精细化管理学*心得体会
  • 重庆历洲汽车驾驶技术服务有限公司企业信用报告-天眼查
  • 做一个有心量的人(议二 升格稿)
  • 昆明夫高园林绿化有限公司企业信用报告-天眼查
  • 湖北省武汉市2017-2019年三年中考英语试卷分类汇编:书面表达
  • 上海市人民政府办公厅关于做好2011年本市电力迎峰度夏工作的通知
  • 2019年高三数学(理科)人教A版一轮单元评估检测8第8章*面解析几何Word版含解析
  • 浅谈幼儿园如何对幼儿开展感恩教育
  • 青春,友谊,爱情 高中作文【600字】
  • 学雷锋作文300字
  • 学生会文艺部工作总结报告
  • AlGaInP发光二极管的全方位反射镜研究
  • 中学突发性安全事故应急预案 -范文.doc
  • (浙江新高考专用版)2019_20学年高中物理第十一章机械振动3简谐运动的回复力和能量课件新人教版
  • 计算结构动力学 多自由度体系的振动概要
  • 招聘淡季 人才网应为下一个热潮做多少准备
  • 【幼儿教育】最新幼儿园工作实用范文:幼儿园教师瑟肽旯ぷ髯芙
  • 高三作文《北京的包容》600字(共8页PPT)
  • 成本会计习题(3)练习辅助生产费用分配答案
  • 河南省内黄县第一中学分校2014-2015学年高一下学期第一次月考生物试题
  • 世界环境日优秀作文:大自然,环保梦_0
  • 2018年3月证券考试《金融市场基础知识》真题及参考答案后附最新考纲后附最新考试大纲
  • 2017高考热点作文素材:90
  • (完整word版)羽毛球课程优秀教案全
  • 凉拌竹笋的家常做法介绍
  • Android经典面试:耗时两个礼拜,8000字安卓面试长文,全套教学资料
  • 七十味珍珠丸要用多久 七十味珍珠丸有什么疗效作用
  • 2020届浙江省杭州市二中高三上学期第一次月考生物试题(解析word版)
  • 电脑版