背景
最近要实现一个功能,用到了一些属性动画,需要获取一些View的坐标信息,设计图如下:
这里我使用的是DialogFragment
来实现的,可以复用。
先贴一下获取View坐标的一些资料:
Android View各种尺寸位置相关的方法探究
Android获得控件在屏幕中的绝对坐标
合适的时机
要想获得View的坐标和长宽,必须要等到View绘制完毕,在平常写代码的生命周期函数内一般是获取不到的:
1 2 3 4 5 6 7 8 9
| onCreate(); onResume();
onCreate(); onCreateView(); onResume(); onShow(); setUserVisibleHint();
|
以上这些时机都是不行的。
目前经过测试可用的方法是:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
|
@Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); int[] location1 = new int[2] ; view.getLocationInWindow(location1); int[] location2 = new int[2] ; view.getLocationOnScreen(location2); }
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { View view = inflater.inflate(R.layout.xxx, container, false); ViewTreeObserver vto = view.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { } }); return view; }
@Override public Dialog onCreateDialog(Bundle savedInstanceState) { LayoutInflater inflater = getActivity().getLayoutInflater(); View view = inflater.inflate(R.layout.xxxx, null); ViewTreeObserver vto = view.getViewTreeObserver(); vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { } }); Dialog dialog = new Dialog(getActivity(), R.style.CustomCityPickerDialog); dialog.requestWindowFeature(Window.FEATURE_NO_TITLE); dialog.setContentView(view); dialog.setCanceledOnTouchOutside(true); ButterKnife.bind(this, view); Window window = dialog.getWindow(); window.setBackgroundDrawableResource(R.color.transparent); WindowManager.LayoutParams wlp = window.getAttributes(); wlp.gravity = Gravity.BOTTOM; wlp.width = WindowManager.LayoutParams.MATCH_PARENT; window.setAttributes(wlp); return dialog; }
|
后话
这是最后的成果:
下一篇文章将简单总结一下最近学习的属性动画,和如何实现上图中效果。
PS:
你可以关注的我 Github、CSDN 和 微博