android获取控件的坐标
1. 怎样获取控件的屏幕坐标
c#的方式
private void CaptureJpeg()
{
var catchBmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);
var g = Graphics.FromImage(catchBmp);
//转换成控没察轮件在屏幕上的坐没备标
var screenPoint = PointToScreen(pictureBox1.Location);
//拷贝屏幕枯信区域到Bitmap
g.CopyFromScreen(screenPoint, new Point(0, 0), new Size(pictureBox1.Width, pictureBox1.Height));
//存文件
catchBmp.Save(string.Format(@"D:\image\{0}.jpg",MAC));
}
2. 请问大侠:我在android界面上任意添加一个Button,怎么获取Butoon的中心坐标呢
可以用戚敏销 (getLeft()+getRight())/2 ,(getBottom()+getHeight()/2) 获得Button 在屏幕的坐标 你试高游试拿烂
3. 怎样获得一个组件相对于父容器的坐标 android
可以在相对布局里面,再写一个Linelayout布局,源冲给两个控件一样做卖的权重,也就是android:gravity=1,或者任意数值,只要是一样的数值。
一般这样的布局问题,都可以通过权纯裂逗重来达到平分的效果,如果受制于手机的虚拟键问题,还可以通过设置scrollview来解决。
4. android中获得控件的位置(相对于布局文件)
正确的代码如下所示
java">TextViewtv=(TextView)findViewById(R.id.text);
tv.getViewTreeObserver().addOnGlobalLayoutListener(newOnGlobalLayoutListener(){
@Override
publicvoidonGlobalLayout(){
//这里执行获取位置大小操作
intleft=tv.getLeft();
inttop=tv.getTop();
intbottom=tv.getBottom();
intright=tv.getRight();
//tv相对于父布局的坐标就得出来了
}
}
view的位置和大小是通过onLayout和onMeasure方法计算出来的,执行到activity的onCreate()方法时,尚未开始计算控件的大小和位置,所以是取不到的
OnGlobalLayoutListener 是ViewTreeObserver的内部类,当一个视图树的布局发生改变时,可以被ViewTreeObserver监听到,这是一个注册监听视图树的观察者(observer),在视图树的全局事件改变时得到通知
除了OnGlobalLayoutListener ,ViewTreeObserver还有如下内部类:
interfaceViewTreeObserver.OnGlobalFocusChangeListener
当在一个视图树中的焦点状态发生改变时,所要调用的回调函数的接口类
interfaceViewTreeObserver.OnGlobalLayoutListener
当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时,所要调用的回调函数的接口类
interfaceViewTreeObserver.OnPreDrawListener
当一个视图树将要绘制时,所要调用的回调函数的接口类
interfaceViewTreeObserver.OnScrollChangedListener
当一个视图树中的一些组件发生滚动时,所要调用的回调函数的接口类
interfaceViewTreeObserver.OnTouchModeChangeListener
当一个视图树的触摸模式发生改变时,所要调用的回调函数的接口类
5. Android开发 在代码中怎么动态改变Button坐标
首先,获取需要改变的Button 通过Button myButton = findviewById(R.id.xxx);
之后有2种方式改变坐标
第一种,带动画的改变
//位移动画从左到右参数分别为
//x轴方向起始位置x差值,x轴方向结束位置x差值,y轴方向起始位置y差值,y轴方向结束位置y差值
=newTranslateAnimation(fromXDelta,toXDelta,fromYDelta,toYDelta);
translateAnimation.setDuration(300);//设置动画世界
button.setAnimation(translateAnimation);
上面的示例只是许多动画中的一种简单地位移动画,如果有兴趣可以查阅一下android动画方面的知识
第二种,直接改变控件的位置
这种方法里面也有2种不用的情况
//这是第一种直接付给此button新的xy坐标
button.setX();
button.setY();
//这是第二种让button有一个位移到指定地点
button.setTranslationX();
button.setTranslationY();
第一种直接改变了xy坐标,第二种是添加了坐标位移但是控件本身的xy坐标还是在原来的位置
6. Android自定义控件 | 小红点的三种实现(终结)
上一篇通过在父控件绘制前景的方式展示小红点,在布局文件中配置标记控件就能为任意子控件添加小红点。实现方案是”布局文件中配置带小红点控件 id,在父控件中获取它们的坐标,并在其右上角绘制圆圈“。但这个方案有一个漏洞,当子控件做动画,即子控件尺寸发生变化时,小红点不会联动。效果入下图:
在父控件的 draw() , dispatchDraw() , drawChild() 中打 log,子控件做动画时都未能捕获到联动的事件。
突然想起 androidx.coordinatorlayout.widget.CoordinatorLayout 中的 Behavior ,在 onDependentViewChanged() 中可以实时获得关联控件的属性变化。它是如何做到的?沿着调用链往上查找:
当关联子控件发生变化时,会遍历关联控件并将变换通过 onDependentViewChanged() 传递出去。沿着调用链再往上:
CoordinatorLayout 在 onAttachedToWindow() 时注册了 View 树观察者,子控件属性变化时必定会触发 View树重绘,这样就可以在 onPreDraw() 中监听到它们的属性变化。
将这套机制照搬到自定义容器控件 TreasureBox :
这样当需要绘制小红点的子控件属性发生变化时,标记控件就可以在 onPreDraw() 中收到通知:
每次 View 树重绘前都可以在 onPreDraw() 中实时获取子控件的宽高及坐标,为了衡银避免过度重绘,只有当属性变化时,才触发父控件重绘。需要记忆上次重绘的属性,通过比较就能知道属性是否发生变更:
还需要变更下小红点绘制逻辑,之前的逻辑如下:
如果沿用这套绘制逻辑,即使父控件监听到子控件重绘,小红点也不会跟着联动。那是因为 View 的 getTop() 和 getRight() 不包含位移值:
而 getX() 和 getY() 则包含了位移值:
只需要将绘制逻辑中的 v.right 和 v.top 换成 v.x 和 v.y ,小红点就能和动画联动了。为控件添加位移和缩放动画,测试一下:
GG思密达~
。位移动画的确会联动,但缩放并没有~
打了 log 才发现,View 通过 setScale() 的方式进行动画时,它的宽高和坐标并不会发生变化。。。
但必然是有一个属性的值变化了,虽然暂且不知道它是啥?
只能打开 View 源码,遍历所有 get 开头的函数,然后把它们的值打印在 onPreDraw() 中。经过多次尝试,终于找到了一个函数,它的返回值和咐晌宴子控件缩放动画联动:
当子控件做缩小动画时,该函数返回的 Rect 中的 left 会变大而 right 会变小。
函数的返回值在 mLeft , mRight , mTop , mBottom 的基础上叠加了 matrix 的值。做动画的属性值最终都会反映到 matrix 上,这样一分析好像能自圆其说,即该函数会实时返回 view 因动画而改变的属性值。
如此一来,只需要记忆上一次的 Rect ,就能在下次重绘前通过比较得知子控件是否做了动画:
绘制小红点逻辑也要做响应改动:
大功告谨罩成,效果如下:
7. 【安卓开发】怎么获取用户点击图片中的坐标
我想你应该是要获取被用户点击的那张图片的坐标吧,首先给你的图片加一个监听,如果被点击了,获取手机屏幕的宽高,然后获取图片自身的宽高,屏幕的坐标减去图片的宽高就是该图片所在的坐标,如果你神则要获取图片相对于其他某个举掘控件的坐标,只要获取另一个正瞎核控件的坐标,然后进行计算就可以了
8. 在android中如何改变控件的坐标(例如一个button,我想让它向右移动20dp)
RelativeLayout.LayoutParams ballLp = (android.widget.RelativeLayout.LayoutParams)b.getLayoutParams();
ballLp.leftMargin = 从你控件的基础上加20像素;
ballLp.topMargin = 不变:
b.setLayoutParams(ballLp);
这没有移动的动画,只是直接跳到次位置上
要有移动的话可以加动画,或者让这段代码执行20次,每次leftMargin增加1就可以了。