zoukankan      html  css  js  c++  java
  • ViewDragHelper 任意拖动

    自定义view 拖动的边界需要严谨控制

    view

     1 public class DragView extends LinearLayout{
     2 
     3     private View childView;
     4     private ViewDragHelper mDragHelper;
     5 
     6     public DragView(Context context) {
     7         this(context, null);
     8     }
     9 
    10     public DragView(Context context, AttributeSet attrs) {
    11         this(context, attrs, 0);
    12     }
    13 
    14     public DragView(Context context, AttributeSet attrs, int defStyleAttr) {
    15         super(context, attrs, defStyleAttr);
    16         initializeView();
    17     }
    18 
    19     private void initializeView() {
    20         mDragHelper = ViewDragHelper.create(this, new ViewDragHelper.Callback() {
    21             @Override
    22             public boolean tryCaptureView(View child, int pointerId) {
    23                 return true;
    24             }
    25 
    26             @Override
    27             public int clampViewPositionVertical(View child, int top, int dy) {
    28                 return Math.min(Math.max(top, 0), getHeight()-child.getHeight());
    29             }
    30 
    31             @Override
    32             public int clampViewPositionHorizontal(View child, int left, int dx) {
    33                 return Math.min(getWidth() - child.getWidth(), Math.max(left, 0));
    34             }
    35 
    36             @Override
    37             public int getViewVerticalDragRange(View child) {
    38                 return child.getMeasuredHeight();
    39             }
    40 
    41             @Override
    42             public int getViewHorizontalDragRange(View child) {
    43                 return child.getMeasuredWidth();
    44             }
    45 
    46             @Override
    47             public void onEdgeDragStarted(int edgeFlags, int pointerId) {
    48                 mDragHelper.captureChildView(childView,pointerId);
    49             }
    50         });
    51         mDragHelper.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);
    52     }
    53 
    54     @Override
    55     public boolean onInterceptTouchEvent(MotionEvent ev) {
    56         return mDragHelper.shouldInterceptTouchEvent(ev);
    57     }
    58 
    59     @Override
    60     public boolean onTouchEvent(MotionEvent event) {
    61         mDragHelper.processTouchEvent(event);
    62         return true;
    63     }
    64 
    65     @Override
    66     public void computeScroll() {
    67         if(mDragHelper.continueSettling(true)) {
    68             invalidate();
    69         }
    70     }
    71 
    72     @Override
    73     protected void onFinishInflate() {
    74         super.onFinishInflate();
    75         if(getChildCount() < 1) {
    76             throw new IllegalArgumentException("必须有一个child");
    77         }
    78         childView = getChildAt(0);
    79     }
    80 }

    xml文件:

     1 <cn.haoju.mytest.view.DragView
     2         android:layout_width="match_parent"
     3         android:layout_height="match_parent"
     4         android:orientation="vertical"
     5         >
     6         <Button
     7         android:layout_margin="10dp"
     8         android:gravity="center"
     9         android:layout_gravity="center"
    10         android:background="#aabbcc"
    11         android:text="拖我"
    12         android:layout_width="100dp"
    13         android:layout_height="100dp"/>
    14 
    15     </cn.haoju.mytest.view.DragView>

    几行代码就可实现任意拖动了

  • 相关阅读:
    Linux系统中常用操作命令
    CentOS 7 巨大变动之 systemd 取代 SysV的Init
    不可不知的安卓屏幕知识
    Gradle-jar-aar
    【Android】开源项目汇总
    Android中关于系统Dialog无法全屏的问题(dialog样式)
    Android LockScreen (锁屏弹窗)
    linux 权限设置
    android 多语言(在APP里面内切换语言)
    host更新
  • 原文地址:https://www.cnblogs.com/lihaolihao/p/4745879.html
Copyright © 2011-2022 走看看