前几天在做一个根据重力感应旋转控件到底部的功能点,原先项目里有旋转控件的方法,但只能在原地旋转,所以我要做的就是使用原有控件可旋转的方法的基础上,增加根据重力感应设置控件到屏幕底部的功能。
timerLl是一个LinerLayout,它的父布局是RelativeLayout
最一开始的做法是
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) timerLl.getLayoutParams();
lp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
lp.addRule(RelativeLayout.CENTER_HORIZONTAL);
timerLl.setLayoutParams(lp);
控件就始终在这个位置旋转,不会跟着转手机来到底部来。
经过大半天的尝试,最终发现,横屏时候的上下左右,才是对应于父布局的上下左右
所以,竖屏的时候相当于在父布局的右侧(在代码case里是Progress_Rotation_90),横屏的时候相当于在父布局底部(在代码case里是Progress_Rotation_0),手机底部按钮在左侧的横屏方式相当于在父布局的顶部(在代码case里是Progress_Rotation_180),手机倒立的竖屏相当于相对于父布局的左侧(在代码case里是Progress_Rotation_270)。
所以根据这个思路,我动态的改变相对于父布局的位置的center方式成功实现了根据重力感应,每次都在当前屏幕的底部的功能,代码见下图,我把它抽离出来成为一个方法,传入参数来控制
微信截图_2.png
对了,在每次设置,也就是addRule之前,应该先remove之前可能add的Rule
微信截图_3.png
网友评论