今天在使用PopWindow.showAtLocation(View parent, int gravity, int x, int y)时,最后2个参数的传值问题,
1.首先使用了View.getLocationOnScreen(new Location[]) 或者 getLocationInWindow(new Location[]);
获取到的location[0]及location[1]有时为0
2.使用View.getGlobalVisibleRect(new Rect());
获取rect.left view距屏幕左边的间距,rect.top view距屏幕上边的间距;
获取到的值不为0;
最终解决:
int p1 = Util.dip2px(168);
int[] location = new int[2];
parent.getLocationInWindow(location);
int l1 = location[0];
int l2 = location[1];
if (l1 == 0 || l2 == 0) {
Rect rect = new Rect();
parent.getGlobalVisibleRect(rect);
l1 = rect.left;
l2 = rect.top;
pop.showAtLocation(parent, Gravity.NO_GRAVITY, l1 - p1, l2);
今天在使用PopWindow.showAtLocation(View parent, int gravity, int x, int y)时,最后2个参数的传值问题,1.首先使用了View.getLocationOnScreen(new Location[]) 或者 getLocationInWindow(new Location[]);获取到的location[0]及location[1
view
.get
Location
On
Screen
(
location
);
这样就可以得到该视图在全局坐标系
中
的x,y值,(注意这个值是要从屏幕顶端算起,也就是说包括了通知栏的高度)
//获取在当前屏幕内的绝对坐标
location
[0] x坐标
location
[1] y坐标
应用 ,我们可以用来记录上一次list
view
滚动到了那里
首先我们需要一个记录当前滚动位置的全局变量:
代码如下:private float O
在对单击按钮的响应
中
,在Image
View
(或其他视图)上调用get
Location
On
Screen
()会给出正确的值.
但是当从Activity :: onCreate()调用get
Location
On
Screen
()时,我只得到[0,0].我怎样才能
解决
这个问题?
是否onCreate()太早,无法进行所有计算?是否有更好的地方可以挂钩来开始动画?
现在检查onCreate()
中
的getLoc...
1.当需要调节popwindow的位置时,new PopupWindow(content
View
, LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT, true)用固定的坐标给定,不然没有反应,就像这样new PopupWindow(content
View
,300,300, true);
而且位置的确定,其实就是某一个的上下左右,用
view
.get
Location
On
Screen
(
location
); 就可以获取横纵坐标,然后
view
.getheight和getwidth来确定哪个方位;比如popwindow再button下面: popupWindow.showAt
Location
(
view
, Gravity.NO_GRAVITY,
location
[0],
location
[1]+popupWindow.getHeight());
2.就是进出的方式,我把duration持续时间 等单词翻译成我们需要的意思,自己看着对应理解就好。
3.大家一起学习
从原点向右是X轴的正方向,从原点向下是Y轴的正方向
View
提供了get
Location
On
Screen
( int[]
location
)方法来获取在整个屏幕内的绝对坐标,该坐标值为
View
左上角的坐标。注意该
View
的坐标值是从屏幕左上角开始获取的,所以也包括了通知栏的高度
该方法的具体实现
* <p>Computes the coordinates of this
view
on the
screen
. The argument
* must be an array
在onCreate的时候去取,肯定是0,因为那个时候UI还没有渲染完毕。
只能在你后续的注册的事件
中
调用方法。
get
Location
On
Screen
,计算该视图在全局坐标系
中
的x,y值,(注意这个值是要从屏幕顶端算起,也就是索包括了通知栏的高度)//获取在当前屏幕内的绝对坐标
get
Location
InWindow ,计算该视图在它所在的widnow的坐标x,y值,//获取在整个窗
最近做项目时,发现在activity的onCreate()和onResume()方法里调用
View
.get
Location
InWindow()时,
View
.get
Location
InWindow()返回空值,觉得很奇怪,因为以前用过,没有发现这个问题,于是调查了一下源码,这里把调查结果做个记录。
首先,看看
View
.get
Location
InWindow()的实现,
publi
1)键盘在scroll
view
外面,布局写死,默认隐藏。
1)点击输入框显示键盘。
1)用键盘高度减去edittext高度得到scroll
view
移动距离,进行scroll
view
内容移动。
今天美工说不是这种效果:
如果不用scroll
view
,就还是原来的效果,那么就写死一个
view
在dialod里面作为键盘,默认隐藏,主要是怎么顶布局,移的距离计算还是上面那种做法。
总结:需要注意几个地方:
1)隐藏系统键盘但光标正常显示
EditText et =
view
Holder.get
View
(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与键盘高度差,再对root
View
进行scrollBy滚动(顶布局)。
root
View
.postDelayed(new Runnable() {
@Override
public void run() {
int[] etSize = new int[2];
et.get
Location
On
Screen
(etSize);
int etH = etSize[1];
int[] kbSize = new int[2];
keyBoard
View
.get
Location
On
Screen
(kbSize);
int kbH = kbSize[1];
moveH = etH - kbH + et.getMeasuredHeight();
Log.i(TAG, "--->>>moveH:" + moveH);
if (moveH > 0) {
root
View
.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才行。
因为root
View
.scrollBy其实是滚动的root
View
的内部的孩子,如果是写死比如600dp,那么孩子滚动的时候其实是再root
View
的600dp里面滚动的,就不会顶出到屏幕外面去。
1)自动将edittext
中
内容全选并获取焦点:
et.setSelectAllOnFocus(true);//获得焦点时全选文本
et.requestFocus(); //请求获取焦点
private RelativeLayout root;
private BounceCircle messageCount;
private BounceCircle contactCount;
private Image
View
messageIcon;
private Image
View
contactIcon;
private int radius = 40; // 圆形半径
private boolean init = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContent
View
(R.layout.activity_main);
root = (RelativeLayout) find
View
ById(R.id.activity_main);
messageIcon = (Image
View
) find
View
ById(R.id.message_icon);
contactIcon = (Image
View
) find
View
ById(R.id.contact_icon);
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
// 只需执行一次,在onWindowFocusChanged方法
中
才能获取到控件在屏幕
中
的坐标
if (init) {
init =false;
int[] position = new int[2];
messageIcon.get
Location
On
Screen
(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.add
View
(messageCount);
contactIcon.get
Location
On
Screen
(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.add
View
(contactCount);
记录一下get
Location
On
Screen
方法的作用
* <p>Computes the coordinates of this
view
on the
screen
. The argument
* must be an array of two integers. After ...
get
Location
On
Screen
此方法主要为了获取控件在屏幕的位置的x,y坐标。使用的时候需要传入一个int [] 型的参数,int[0]位x轴 同样也可以视为矩形的Left边界
int[1]为y轴,同样可以视为矩形Top的边界。
* <p>Computes the coordinates of this
view
in its window. The argument
* must be an array of two integers. After the method returns, the array
以下是一个简单的
Android
气泡框代码示例:
首先,创建一个自定义的布局文件 `custom_tooltip.xml`,包含一个 LinearLayout 和一个 Text
View
:
<LinearLayout xmlns:
android
="http://schemas.
android
.com/apk/res/
android
"
android
:id="@+id/tooltip_container"
android
:layout_width="wrap_content"
android
:layout_height="wrap_content"
android
:background="@drawable/tooltip_background"
android
:orientation="horizontal"
android
:padding="8dp">
<Text
View
android
:id="@+id/tooltip_text"
android
:layout_width="wrap_content"
android
:layout_height="wrap_content"
android
:textColor="@
android
:color/white" />
</LinearLayout>
然后,在你的 Activity
中
,使用 PopupWindow 来显示气泡框。示例代码如下:
// inflate the custom layout
View
tooltip
View
= LayoutInflater.from(this).inflate(R.layout.custom_tooltip, null);
// set the text of the Text
View
Text
View
tooltipText = tooltip
View
.find
View
ById(R.id.tooltip_text);
tooltipText.setText("Hello, world!");
// create a new PopupWindow
PopupWindow tooltip = new PopupWindow(tooltip
View
,
View
Group.LayoutParams.WRAP_CONTENT,
View
Group.LayoutParams.WRAP_CONTENT);
// set the PopupWindow to be focusable
tooltip.setFocusable(true);
// show the PopupWindow at a specified
location
int[]
location
= new int[2];
target
View
.get
Location
On
Screen
(
location
);
tooltip.showAt
Location
(target
View
, Gravity.NO_GRAVITY,
location
[0],
location
[1] - tooltip.getHeight());
这里,`target
View
` 是你想要在其上显示气泡框的
View
。`
location
` 数组包含 `target
View
` 在屏幕上的 x 和 y 坐标。我们使用 `showAt
Location
` 方法来显示气泡框,并将其放置在 `target
View
` 的下方。