项目过程中要实现能在页面中随意的拖动,刚开始实现是用悬浮球的形式进行实现,因为之前项目中用过,实现后发现用户每次安装后,都有权限的限制,甚至有些用户关闭悬浮球权限之后,不知道怎么在手机上打开悬浮球的权限,这样的话用户体验很不好,所以自己重新自定义实现在页面中拖动,不需要请求权限。
自定义随意拖动观点:
包com.dragdemo; 进口android.annotation.SuppressLint; 进口android.content.Context; 进口android.util.AttributeSet; 进口android.util.Log; 进口android.view.MotionEvent; 进口android.widget.ImageView;/* * *随意拖动的观点 */@SuppressLint (“AppCompatCustomView”) 公开课DragView延伸ImageView { 私人int宽度; 私人int高度; 私人int screenWidth; 私人int screenHeight; 私人上下文语境;//是否拖动 私人布尔isDrag=false; 公共布尔isDrag () { 返回isDrag; } 公共DragView(上下文语境,AttributeSet attrs) { 超级(上下文,attrs); this.context=上下文; } @Override 保护空白> 包com.dragdemo; 进口android.content.Context; 进口android.util.DisplayMetrics; 进口android.view.Display; 进口android.view.View; 进口android.view.WindowManager; 公开课ScreenUtil { 私有静态int宽度=0; 私有静态int高度=0; 私有静态int showHeight=0; 私有静态int statusHeight=0; 私有静态悬浮密度=0; 公共静态int getScreenWidth(上下文语境){ 如果(宽度==0){ WindowManager经理=(WindowManager)上下文 .getSystemService (Context.WINDOW_SERVICE); 显示器显示=manager.getDefaultDisplay (); 宽度=display.getWidth (); } 返回宽度; } 公共静态int getScreenHeight(上下文语境){ 如果(身高==0){ WindowManager经理=(WindowManager)上下文 .getSystemService (Context.WINDOW_SERVICE); 显示器显示=manager.getDefaultDisplay (); 身高=display.getHeight (); } 回报高; } 公共静态int getScreenShowHeight(上下文语境){ 如果(showHeight==0) { showHeight=getScreenHeight(上下文)——getStatusBarHeight(上下文); } 返回showHeight; } 公共静态int getStatusBarHeight(上下文语境){ 如果(statusHeight比;0){ 返回statusHeight; } Class<& # 63;比;c=零; 对象obj=零; 爪哇.朗.反射。字段字段=零; int x=0; 尝试{ c=forname (“com.android.internal.R dimen美元”); obj=c.newInstance (); ?c.getField (“status_bar_height”); x=Integer.parseInt (field.get (obj) .toString ()); statusHeight=context.getResources () .getDimensionPixelSize (x); 返回statusHeight; }捕捉(Throwable e) { e.printStackTrace (); } 返回statusHeight; } 公共静态浮动getScreenDensity(上下文语境){ 如果(密度==0){ 尝试{ DisplayMetrics dm=new DisplayMetrics (); WindowManager经理=(WindowManager)上下文 .getSystemService (Context.WINDOW_SERVICE); manager.getDefaultDisplay () .getMetrics (dm); 密度=dm.density; }捕捉(例外的前女友){ ex.printStackTrace (); 密度=1.0度; } } 返回密度; } 公共静态浮动getScreentMinLength(上下文语境){ 返回getScreenHeight(上下文)的在getScreenWidth(上下文)& # 63;getScreenWidth(上下文) :getScreenHeight(上下文); }/* * *根据指定k的系数获取屏幕在马克斯·范围内的最大长宽,默认宽比较小 * * @param上下文 * @param k * @return */公共静态DrawWrap getCutWrap(上下文语境、k浮动浮动max) { 浮动tWidth=getScreenWidth(上下文); 浮动tHeight=getScreenHeight(上下文); 如果(tWidth *马克斯* k比;tHeight) { 返回新DrawWrap (tHeight * max/k, tHeight * max); 其他}{ 返回新DrawWrap (tWidth *马克斯,tWidth *马克斯* k); } } 公共静态类DrawWrap { 公共浮动宽度; 公共浮子高度; 公共DrawWrap(宽度浮动,浮动高度){ 这一点。宽度=宽度; 这一点。身高=身高; } } 公共静态int dip2px(上下文背景下,浮动dipValue) { 返回(int) (dipValue * getScreenDensity(上下文)+ 0.5 f); }/* * *将sp值转换为像素值,保证文字大小不变 * * @param上下文 * @param spValue * (DisplayMetrics类中属性scaledDensity) * @return */公共静态int sp2px(上下文背景下,浮动spValue) { 最后浮动fontScale=context.getResources () .getDisplayMetrics () .scaledDensity; 返回(int) (spValue * fontScale + 0.5 f); }/* * *根据手机的分辨率从px(像素)的单位转成为迪拜 */公共静态int px2dip(上下文背景下,浮动pxValue) { 最后的浮动比例=context.getResources () .getDisplayMetrics () .density; 返回(int) (pxValue/规模+ 0.5 f); }/* * *获取屏幕中控件顶部位置的高度,即控件顶部的Y点 * * @return */公共静态int getScreenViewTopHeight(查看视图){ 返回view.getTop (); }/* * *获取屏幕中控件底部位置的高度,即控件底部的Y点 * * @return */公共静态int getScreenViewBottomHeight(查看视图){ 返回view.getBottom (); }/* * *获取屏幕中控件左侧的位置,即控件左侧的X点 * * @return */公共静态int getScreenViewLeftHeight(查看视图){ 返回view.getLeft (); }/* * *获取屏幕中控件右侧的位置,即控件右侧的X点 * * @return */公共静态int getScreenViewRightHeight(查看视图){ 返回view.getRight (); }/* *获取控件宽 */公共静态int getWidth(查看视图){ int w=View.MeasureSpec.makeMeasureSpec (0, View.MeasureSpec.UNSPECIFIED); int h=View.MeasureSpec.makeMeasureSpec (0, View.MeasureSpec.UNSPECIFIED); 视图。测量(w h); 返回(view.getMeasuredWidth ()); }/* *获取控件高 */公共静态int获得(查看视图){ int w=View.MeasureSpec.makeMeasureSpec (0, View.MeasureSpec.UNSPECIFIED); int h=View.MeasureSpec.makeMeasureSpec (0, View.MeasureSpec.UNSPECIFIED); 视图。测量(w h); 返回(view.getMeasuredHeight ()); } }Android实现随意拖动视图效果的实例代码