更改归属地提示框显示的位置
view对象渲染的两个阶段:1、测量参数——布局参数生效 LayoutParams params = (LayoutParams) iv_dragview.getLayoutParams();
params.leftMargin = left;
params.topMargin = top;
// 重新设置回去
iv_dragview.setLayoutParams(params); 2、渲染之后,layout()生效 3、在onCreate()中不能用 int tv_height = tv_dragview.getHeight();来设置view对象的位置,因为此时view对象还没有初始化出来,还没有调用onMeasure(),view对象的宽度和高度都还没有确定,此时调用layout()方法,view对象在界面上显示不出来, protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),
getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));
}此时,应该用 LayoutParams 来设置组件的位置。 final LayoutParams iv_params = (LayoutParams) iv_dragview.getLayoutParams();
iv_params.leftMargin = left;
iv_params.topMargin = top;
|
注意: 在onCreate()方法中,调用iv_dragview.getHeight()等方法为0,因为view还没渲染,返回为0,layout()也不生效。 |
一、textview可以根据imageview的位置调整:imageview在上面textview在下面,imageview在下面textview在上面: DragViewActivity.java if (top < (window_height / 2 - iv_dragview.getHeight() / 2)) { // 当前iv_dragview的最上边top在窗体的上半部分,tv_dragview到底部
tv_dragview.layout(tv_dragview.getLeft(), window_height-tv_height-40, tv_dragview.getRight(), window_height-40);
} else if (bottom > (window_height / 2 + iv_dragview.getHeight() / 2)) { // 当前iv_dragview的最下边bottom在窗体的下半部分,tv_dragview到顶部
tv_dragview.layout(tv_dragview.getLeft(), 0, tv_dragview.getRight(), tv_height);
}
|
二、拨打电话时,位置为设置的位置: ShowAddressService.java final WindowManager.LayoutParams params = new WindowManager.LayoutParams();
// 设置拨打电话提示框显示的位置,根据之前设置的位置来显示
params.gravity = Gravity.LEFT + Gravity.TOP;// 默认是Gravity.CENTER
params.x = sp.getInt("left", 0);// 要和上面的Gravity.LEFT等一起使用,否则,会被忽略掉
params.y = sp.getInt("top", 0);注意:如果没有配置 Gravity.LEFT 等,那么param.x就无效 X position for this window. With the default gravity it is ignored. When
using |
三、保证imageview在上面时textview在下面,imageview在下面时textview在上面,退出时保存,下次进来还是那样: // 9、如果iv_dragview在上方,将tv_dragview放到下方
final int window_height = wm.getDefaultDisplay().getHeight();// 获取窗体高度
final int window_width = wm.getDefaultDisplay().getWidth();
int tv_height = sp.getInt("tv_height", 0);// FIXME bug
int tv_left = sp.getInt("tv_left", 0);
// /int tv_right = sp.getInt("tv_right", 0);
if (tv_height != 0) {
Log.i(TAG, "iv在上方,tv跑下去");
if (top < (window_height / 2 - tv_height / 2)) { // iv_dragview.getHeight()
LayoutParams tv_params = (LayoutParams) tv_dragview.getLayoutParams();
tv_params.topMargin = window_height-tv_height-40;
// tv_params.bottomMargin = window_height-40;//这个不要,否则显示不正确
tv_params.leftMargin = tv_left;
// tv_params.rightMargin = tv_right;//这个不要,否则显示不正确
}
} 结果: |
核心代码:
|
问题1: 在Activity中的onCreate()方法中,View对象的宽度,高度还没有计算出来,值为0。 View对象要想被渲染出来,只有当view对象被new出来,然后执行onMeasure()方法后-计算宽度和高度 int height = iv_dragview.getBottom() - iv_dragview.getTop();// iv_dragview高度,值为0 int width = iv_dragview.getRight() - iv_dragview.getLeft();// iv_dragview宽度,值为0 // layout()是布局机制的第二个阶段,第一个阶段还是测量,只有测量后该方法才会生效
iv_dragview.layout(left, top, left + width, top + height); |
问题2: 如果将 拖动到每个边框,第二次再进来的时候,会变的很小,这次因为,当到边框的时候,系统检测显示不出来完整,就将按钮缩小了。 解决:不准拖动至手机边框外 |