添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <LinearLayout
        android:id="@+id/linearlayout_test"
        android:layout_marginLeft="50px"
        android:layout_marginTop="50px"
        android:layout_width="200px"
        android:layout_height="200px"
        android:background="@color/colorPrimary"
        android:orientation="vertical"/>
</LinearLayout>

getGlobalVisibleRect()

这个方法会返回一个 View 是否可见的 boolean 值。以屏幕左上角为参考系,判断view是否有一部分仍然在屏幕中(没有被父View遮挡),则会返回true。反之,如果它全部被父View遮挡住或者本身就是不可见的,则会返回false

同时还会将该 View 的可见区域 left,top,right,bottom 值保存在一个rect对象中
在这里插入图片描述
该Rect是基于总整个屏幕的。若是普通activity,则 Rect 的 top 为可见的状态栏高度+可见的标题栏高度+ Rect 左上角到标题栏底部的距离

若是对话框式的 activity,则 y 坐标为 Rect 的 top 为可见的标题栏高度 + Rect 左上角到标题栏底部的距离,此时是无视状态栏的有无的

Rect rect = new Rect();
boolean b = linearLayout.getGlobalVisibleRect(rect);
if(b){
	Log.d("getGlobalVisibleRect",""+rect);

getLocalVisibleRect()

这个方法跟getGlobalVisibleRect用法相同,只不过是以 view 自身的左上角为参考系
在这里插入图片描述

以上方法在 OnCreate 方法中调用,都会返回 0,这是因为 View 还未加载完毕

getLocationInWindow()

一个控件在其父窗口中的坐标位置,获取在当前窗口内的绝对坐标
getLocationInWindow 是以B为原点的C的坐标
在这里插入图片描述
若是普通activity,则 y 坐标为可见的状态栏高度 + 可见的标题栏高度 + view左上角到标题栏底部的距离(可见的意思是:在隐藏了状态栏/标题栏的情况下,它们的高度以0计算)

若是对话框式的 activity,则 y 坐标为可见的标题栏高度 + view 到标题栏底部的距离,此时是无视状态栏的有无的

int[] location = new int[2];
linearLayout.getLocationInWindow(location);
int x = location[0];
int y = location[1];
Log.d("getLocationInWindow", "x:" + x + ",y:" + y);

getLocationOnScreen()

一个控件在其整个屏幕上的坐标位置,获取在整个屏幕内的绝对坐标,注意这个值是要从屏幕顶端算起,也就是包括了通知栏的高度

getLocationOnScreen以A为原点的C的坐标

在这里插入图片描述
注意
当view没有绑定到window时,返回在window里的坐标是没有意义的,以上4个方法如果在Activity的OnCreate()事件输出那些参数,是全为0,要等UI控件都加载完了才能获取到这些。所以可以在以下函数中调用这些方法

	@Override
    public void onWindowFocusChanged(boolean hasFocus) {
    ......
                    测试布局&lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="vertical"&gt;    &lt;LinearLayout        android:id="@+id/linearl
1)键盘在scrollview外面,布局写死,默认隐藏。
1)点击输入框显示键盘。
1)用键盘高度减去edittext高度得到scrollview移动距离,进行scrollview内容移动。
今天美工说不是这种效果:
如果不用scrollview,就还是原来的效果,那么就写死一个view在dialod里面作为键盘,默认隐藏,主要是怎么顶布局,移的距离计算还是上面那种做法。
总结:需要注意几个地方:
1)隐藏系统键盘但光标正常显示
EditText et = viewHolder.getView(R.id.id_et);
 * 禁止Edittext弹出软件盘,光标依然正常显示,并且能正常选取光标
public static void disableShowSoftInput(EditText editText) {
    Class cls = EditText.class;
    Method method;
    try {
        method = cls.getMethod("setShowSoftInputOnFocus", boolean.class);
        method.setAccessible(true);
        method.invoke(editText, false);
    } catch (Exception e) {
        e.printStackTrace();
1)计算输入的edittext与键盘高度差,再对rootView进行scrollBy滚动(顶布局)。
rootView.postDelayed(new Runnable() {
    @Override
    public void run() {
        int[] etSize = new int[2];
        et.getLocationOnScreen(etSize);
        int etH = etSize[1];
        int[] kbSize = new int[2];
        keyBoardView.getLocationOnScreen(kbSize);
        int kbH = kbSize[1];
        moveH = etH - kbH + et.getMeasuredHeight();
        Log.i(TAG, "--->>>moveH:" + moveH);
        if (moveH > 0) {
            rootView.scrollBy(0, moveH);
}, 100);
1)edittext选中和清楚选中。
private void selectAll(EditText currentEt) {
    et = currentEt;
    et.setSelectAllOnFocus(true);
private void clearSelectAll() {
    if(et != null){
        //取消全选,主要是clearFocus起作用
        et.setSelectAllOnFocus(false);
        et.clearFocus();
1)要顶开的id_kb_root布局高度要设置成match_parent才行。
因为rootView.scrollBy其实是滚动的rootView的内部的孩子,如果是写死比如600dp,那么孩子滚动的时候其实是再rootView的600dp里面滚动的,就不会顶出到屏幕外面去。
1)自动将edittext中内容全选并获取焦点:
et.setSelectAllOnFocus(true);//获得焦点时全选文本
et.requestFocus(); //请求获取焦点
var globalVisibleRect = Rect()
testVisiblty.getGlobalVisibleRect(globalVisibleRect)
var localVisibleRec.
				
private RelativeLayout root; private BounceCircle messageCount; private BounceCircle contactCount; private ImageView messageIcon; private ImageView contactIcon; private int radius = 40; // 圆形半径 private boolean init = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); root = (RelativeLayout) findViewById(R.id.activity_main); messageIcon = (ImageView) findViewById(R.id.message_icon); contactIcon = (ImageView) findViewById(R.id.contact_icon); @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); // 只需执行一次,在onWindowFocusChanged方法中才能获取到控件在屏幕中的坐标 if (init) { init =false; int[] position = new int[2]; messageIcon.getLocationOnScreen(position); messageCount = new BounceCircle(this, radius, position[0] + messageIcon.getWidth(), (position[1] - Util.getTopBarHeight(this))); messageCount.setNumber("20"); messageCount.setFinishListener(new BounceCircle.FinishListener() { @Override public void onFinish() { Toast.makeText(MainActivity.this, "message count dismiss", Toast.LENGTH_LONG).show(); root.addView(messageCount); contactIcon.getLocationOnScreen(position); contactCount = new BounceCircle(this, radius, position[0] + contactIcon.getWidth(), (position[1] - Util.getTopBarHeight(this))); contactCount.setNumber("30"); contactCount.setFinishListener(new BounceCircle.FinishListener() { @Override public void onFinish() { Toast.makeText(MainActivity.this, "contract count dismiss", Toast.LENGTH_LONG).show(); root.addView(contactCount);
本文所有内容来自网络,通过本人梳理编撰成文。文章仅对知识要点做罗列整理,相当于知识目录,预期读者为具备相关开发经验的研发,不建议初学者阅读。如果需要进一步探究,可以查看参考资料查看原文。 屏幕坐标系:移动设备的坐标系一般定义屏幕的左上角为坐标原点,向右为X轴增大方向,向下为Y轴增大方向; View坐标系:控件的坐标系是相对于父控件而言的,当然也可以通过getLocationOnScreen获取全局坐标; 事件坐标系:触摸事件的坐标提供了上述两个坐标系,即一个相对于整个手机屏幕的坐标,.
代码片段: ImageView rectImage = findViewById(R.id.rect_image); rectImage.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { Rect loc
在消息流中,根据ImageView是否在屏幕中出现了再决定是否加载; 在视频流页面,当视频滑入屏幕被用户可见时播放,滑出屏幕就自动停止播放等等; 网络请求数据,根据返回的数据结果控制相应View可见或不可见; 需要根据view是否可见或第一次可见,做特殊的处理,如埋点上报等操作。...
市面上的 APP 大多都有这个功能,我们这次做的新手高亮引导蒙层有什么特殊之处呢? 最基础的蒙层就是盖在页面的上方大概位置,不能精确定位。也不会随着 view 的变化蒙层的高亮区域和 tips 指示区域跟随底部 view 的位置变化而变化,也不能进行点击事件透传。一般都是点击蒙层后蒙层消失然后需要再次点击 view 我们这次开发的蒙层具备哪些功能,和解决了哪些技术难点,和市面上大多数蒙层博客有什么异同呢。 1 : 蒙层的高亮区域跟随底部目标 view ( 以下简称 targetView ) 我们的 AP..
public final boolean getGlobalVisibleRect(Rect r) public boolean getGlobalVisibleRect(Rect r, Point globalOffset) public final boolean getLocalVisibleRect(Rect r) public void getLocationInWindow(in
View的getTop()、getBottom()、getLeft()、getRight()获取的都是当前View相对于它的父类容器的顶部、底部、左边和右边的位置是相对位置    right = left + width;    bottom = top + height; 再来看一看getHeight(),getWidth(),他们是这样的 总结(正解
通过实例分析下view中getHitRect()、getDrawingRect()、getLocalVisibleRect()、getGlobalVisibleRect、 getLocationOnScreen、getLocationWindow这几个函数的区别。 先看例子源码     xmlns:tools="http://schemas.android.com/tools
要动态获取 Android 中 View 的当前位置,可以使用以下方法: 1. 使用 `view.getLocationOnScreen()` 方法获取 View 在屏幕上的位置坐标。该方法返回一个包含左上角 x 和 y 坐标的数组。 ```java int[] location = new int[2]; view.getLocationOnScreen(location); int x = location[0]; int y = location[1]; 2. 使用 `view.getLocationInWindow()` 方法获取 View 在窗口中的位置坐标。该方法返回一个包含左上角 x 和 y 坐标的数组。 ```java int[] location = new int[2]; view.getLocationInWindow(location); int x = location[0]; int y = location[1]; 这两种方法都可以获得相对于屏幕或窗口左上角的坐标。你可以根据需要选择其中一种方法来获取 View 的当前位置。