Android坐标系 键盘的关闭和开启
Z轴向上,X轴向右,Y轴向下
获取屏幕区域的宽高等尺寸获取
1.<code class="language-java hljs ">//获取屏幕区域的宽高等尺寸获取
2.
DisplayMetrics metrics = new DisplayMetrics();
3.
getWindowManager().getDefaultDisplay().getMetrics(metrics);
4.
int widthPixels = metrics.widthPixels;
5.
int heightPixels = metrics.heightPixels;</code>
应用程序App区域宽高等尺寸获取
1.<code class="language-java hljs "><code class="hljs cs">//应用程序App区域宽高等尺寸获取
2.Rect rect = new Rect();
3.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);</code></code>
获取状态栏高度
1.<code class="language-java hljs "><code class="hljs cs"><code class="hljs cs">//获取状态栏高度
2.Rect rect= new Rect();
3.getWindow().getDecorView().getWindowVisibleDisplayFrame(rect);
4.int statusBarHeight = rectangle.top;</code></code></code>
View布局区域宽高等尺寸获取
1.<code class="language-java hljs "><code class="hljs cs"><code class="hljs cs"><code class="language-java hljs ">//View布局区域宽高等尺寸获取
2.Rect rect = new Rect();
3.getWindow().findViewById(Window.ID_ANDROID_CONTENT).getDrawingRect(rect); </code></code>
静态坐标方法
View的静态坐标方法
getLeft()
返回View自身左边到父布局左边的距离
getTop()
返回View自身顶边到父布局顶边的距离
getRight()
返回View自身右边到父布局左边的距离
getBottom()
返回View自身底边到父布局顶边的距离
getX()
返回值为getLeft()+getTranslationX(),当setTranslationX()时getLeft()不变,getX()变。
getY()
返回值为getTop()+getTranslationY(),当setTranslationY()时getTop()不变,getY()变。
MotionEvent坐标方法
getX()
当前触摸事件距离当前View左边的距离
getY()
当前触摸事件距离当前View顶边的距离
getRawX()
当前触摸事件距离整个屏幕左边的距离
getRawY()
当前触摸事件距离整个屏幕顶边的距离
View宽高方法
getWidth()
layout后有效,返回值是mRight-mLeft,一般会参考measure的宽度(measure可能没用),但不是必须的。
getHeight()
layout后有效,返回值是mBottom-mTop,一般会参考measure的高度(measure可能没用),但不是必须的。
getMeasuredWidth()
返回measure过程得到的mMeasuredWidth值,供layout参考,或许没用。
getMeasuredHeight()
返回measure过程得到的mMeasuredHeight值,供layout参考,或许没用。
View的方法
getLocalVisibleRect()
(0, 0 - 410, 100)
(0, 0 - 410, 470)
获取View自身可见的坐标区域,坐标以自己的左上角为原点(0,0),另一点为可见区域右下角相对自己(0,0)点的坐标,其实View2当前height为550,可见height为470。
getGlobalVisibleRect()
(30, 100 - 440, 200)
(30, 250 - 440, 720)
获取View在屏幕绝对坐标系中的可视区域,坐标以屏幕左上角为原点(0,0),另一个点为可见区域右下角相对屏幕原点(0,0)点的坐标。
getLocationOnScreen()
(30, 100)
(30, 250)
坐标是相对整个屏幕而言,Y坐标为View左上角到屏幕顶部的距离。
getLocationInWindow()
(30, 100)
(30, 250)
如果为普通Activity则Y坐标为View左上角到屏幕顶部(此时Window与屏幕一样大);如果为对话框式的Activity则Y坐标为当前Dialog模式Activity的标题栏顶部到View左上角的距离。
Android View滑动相关坐标系
关于View提供的与坐标息息相关的另一组常用的重要方法就是滚动或者滑动相关的,下面我们给出相关的解释(特别注意:View的scrollTo()和scrollBy()是用于滑动View中的内容,而不是改变View的位置;改变View在屏幕中的位置可以使用offsetLeftAndRight()和offsetTopAndBottom()方法,他会导致getLeft()等值改变。),如下:
View的滑动方法
效果及描述
offsetLeftAndRight(int offset)
水平方向挪动View,offset为正则x轴正向移动,移动的是整个View,getLeft()会变的,自定义View很有用。
offsetTopAndBottom(int offset)
垂直方向挪动View,offset为正则y轴正向移动,移动的是整个View,getTop()会变的,自定义View很有用。
scrollTo(int x, int y)
将View中内容(不是整个View)滑动到相应的位置,参考坐标原点为ParentView左上角,x,y为正则向xy轴反方向移动,反之同理。
scrollBy(int x, int y)
在scrollTo()的基础上继续滑动xy。
setScrollX(int value)
实质为scrollTo(),只是只改变Y轴滑动。
setScrollY(int value)
实质为scrollTo(),只是只改变X轴滑动。
getScrollX()/getScrollY()
获取当前滑动位置偏移量。
view.getX和view.getTranslationX区别
1.view.getTranslationX计算的是该view的偏移量。初始值为0,向左偏移值为负,向右偏移值为正。2.view.getX相当于该view距离父容器左边缘的距离,等于getLeft+ge
1.view.getTranslationX计算的是该view的偏移量。初始值为0,向左偏移值为负,向右偏移值为正。
2.view.getX相当于该view距离父容器左边缘的距离,等于getLeft+getTranslationX。
EditText获取焦点
btnPressedEt.setFocusable(true);
btnPressedEt.setFocusableInTouchMode(true);
btnPressedEt.requestFocus();
EditText
设置光标到指定位置
EditText et = (EditText) findViewById(R.id.etTest);
et.setSelection(2);隐藏光标
EditText et = (EditText) findViewById(R.id.etTest);
//设置光标不显示,但不能设置光标颜色
et.setCursorVisible(false);获得焦点时全选文本
EditText et = (EditText) findViewById(R.id.etTest);
et.setSelectAllOnFocus(true);PS:此方法可用来在用户点击EditText时,选中默认内容。
获取和失去焦点
EditText et = (EditText) findViewById(R.id.etTest);
et.requestFocus(); //请求获取焦点
et.clearFocus(); //清除焦点综合运用代码
EditText et = (EditText) findViewById(R.id.etTest); int index = et.getSelectionStart();//获取光标所在位置 String text="#请在这里输入话题#"; Editable edit = et.getEditableText();//获取EditText的文字 if (index < 0 || index >= edit.length() ){ edit.append(text); }else{ edit.insert(index,text);//光标所在位置插入文字 } et.setSelection(index + 1, index + text.length() - 1);
开启键盘 EditText获取焦点 光标
/**
* 开启键盘 EditText获取焦点 光标
*
* @param view
*/
private void openBroad(View view) {
//EditText获取焦点 光标
btnPressedEt.setFocusable(true);
btnPressedEt.setFocusableInTouchMode(true);
btnPressedEt.requestFocus();
InputMethodManager inputManager = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
inputManager.showSoftInput(view, 0);
}
显示或隐藏图标按钮页
/**
* 显示或隐藏图标按钮页
*
* @param view
*/
public void toggleMore(View view) {
//btnMessageLl 更多工具布局
if (btnMessageLl.getVisibility() == View.GONE) {
btnMessageLl.setVisibility(View.VISIBLE);
//关闭键盘
closeKeybroad();
} else {
btnMessageLl.setVisibility(View.GONE);
//开启键盘 EditText获取焦点 光标
openBroad(btnPressedEt);
}
}
关闭键盘
/**
* 关闭键盘
*
* @param view
*/
private void closeBroad(View view) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
关闭键盘 根据屏幕的可见区域大小来判断
/**
* @Title: closeKeybroad
* @Description: 关闭键盘 根据屏幕的可见区域大小来判断
* @return: void
*/
private void closeKeybroad() {
if (isKeyboardVisible()) {
hideSoftInput(btnPressedEt);
}
}
键盘切换相关
/*
* 键盘切换相关
*/
private Rect tmp = new Rect();
private int mScreenHeight; //获取屏幕的高度
private int DISTANCE_SLOP = 80; //底部默认的高度
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus && mScreenHeight <= 0) {
//获取根布局可见的区域
messageRootLl.getGlobalVisibleRect(tmp);
mScreenHeight = tmp.bottom;
}
}
键盘是否显示
/**
* @return
* @Title: isKeyboardVisible
* @Description: 键盘是否显示
* @return: boolean
*/
private boolean isKeyboardVisible() {
return (getDistanceFromInputToBottom() > DISTANCE_SLOP);
}
隐藏软键盘
/**
* @param view
* @Title: hideSoftInput
* @Description: 隐藏软键盘
* @return: void
*/
private void hideSoftInput(View view) {
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
imm.hideSoftInputFromWindow(view.getWindowToken(), 0);
}
输入框的下边距离屏幕的距离
/**
* 输入框的下边距离屏幕的距离
*/
private int getDistanceFromInputToBottom() {
Log.e("size", "mScreenHeight===" + mScreenHeight + "...getInputBottom()=====" + getInputBottom());
return mScreenHeight - getInputBottom();
}
输入框下边的位置
/**
* 输入框下边的位置
*/
private int getInputBottom() {
//btnFl是输入框的整体布局
btnFl.getGlobalVisibleRect(tmp);
return tmp.bottom;
}