Android实现随意拖动视图效果的实例代码

  

项目过程中要实现能在页面中随意的拖动,刚开始实现是用悬浮球的形式进行实现,因为之前项目中用过,实现后发现用户每次安装后,都有权限的限制,甚至有些用户关闭悬浮球权限之后,不知道怎么在手机上打开悬浮球的权限,这样的话用户体验很不好,所以自己重新自定义实现在页面中拖动,不需要请求权限。

  

自定义随意拖动观点:

        包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实现随意拖动视图效果的实例代码