自定義拖拽效果
如圖,要想實現上圖的效果,需要自定義ViewGroup,自定義ViewGroup的程式碼如下:
public class DragSlideLayout extends RelativeLayout {
private View mDragView;
private ViewDragHelper mDragHelper;
public DragSlideLayout(Context context) {
super(context);
init();
}
public DragSlideLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public DragSlideLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
mDragHelper = ViewDragHelper.create(this, 1.0f, new DragHelperCallback());
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
int childCount = getChildCount();
mDragView = getChildAt(childCount - 1);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
final int action = MotionEventCompat.getActionMasked(ev);
if (action == MotionEvent.ACTION_CANCEL || action == MotionEvent.ACTION_UP) {
mDragHelper.cancel();
return false;
}
return mDragHelper.shouldInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
mDragHelper.processTouchEvent(ev);
return true;
}
class DragHelperCallback extends ViewDragHelper.Callback {
@Override
public boolean tryCaptureView(View child, int pointerId) {
return child == mDragView;
}
@Override
public int clampViewPositionVertical(View child, int top, int dy) {
final int topBound = getPaddingTop();
final int bottomBound = getHeight() - mDragView.getHeight() - getPaddingBottom();
return Math.min(Math.max(top, topBound), bottomBound);
}
@Override
public int clampViewPositionHorizontal(View child, int left, int dx) {
final int leftBound = getPaddingLeft();
final int rightBound = getWidth() - mDragView.getWidth() - getPaddingRight();
return Math.min(Math.max(left, leftBound), rightBound);
}
@Override
public int getViewVerticalDragRange(View child) {
return getMeasuredHeight() - child.getMeasuredHeight();
}
@Override
public int getViewHorizontalDragRange(View child) {
return getMeasuredWidth() - child.getMeasuredWidth() - getPaddingRight();
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
public void onViewReleased(View releasedChild, float xvel, float yvel) {
super.onViewReleased(releasedChild, xvel, yvel);
int leftBound = getPaddingLeft();
int rightBound = getViewHorizontalDragRange(releasedChild);
int toTarget = releasedChild.getX() > (getMeasuredWidth() / 2 - releasedChild.getMeasuredWidth() / 2) ? rightBound : leftBound;
mDragHelper.settleCapturedViewAt(toTarget, (int) releasedChild.getY());
invalidate();
}
}
@Override
public void computeScroll() {
if (mDragHelper.continueSettling(true)) {
invalidate();
}
}
}
其中xml的程式碼如下:
<?xml version="1.0" encoding="utf-8"?>
<com.example.itservice.myapplication.DragSlideLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/iv_store_guide"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginBottom="30dp"
android:layout_marginRight="30dp"
android:src="@mipmap/ic_guide_from" />
</com.example.itservice.myapplication.DragSlideLayout>
相關文章
- iOS 自定義拖拽式控制元件:QiDragViewiOS控制元件View
- JavaScript拖拽效果JavaScript
- Android 自定義View 點贊效果AndroidView
- Smartisan OS一步之自定義拖拽內容
- WPF自定義Panel:讓拖拽變得更簡單
- canvas矩形拖拽效果Canvas
- 原生JS拖拽效果JS
- Android自定義View 雷達掃描效果AndroidView
- html頁面自定義文字水印效果案例HTML
- 自定義實現MIUI的拖動視差效果(阻尼效果)UI
- RN自定義元件封裝 – 拖拽選擇日期的日曆元件封裝
- RN自定義元件封裝 - 拖拽選擇日期的日曆元件封裝
- 讓拖拽更加人性化?如何自定義dragover樣式Go
- 直播平臺搭建,自定義氣泡效果(BubbleView)View
- jquery 擴充套件方法($.fn.extend/$.extend) 自定義外掛 拖拽jQuery套件
- 使用自定義 View 繪製一個懸浮式可拖拽按鈕View
- 自定義TabBar動畫效果 - 頁面轉場(Swift)tabBar動畫Swift
- Android SeekBar 自定義thumb,thumb旋轉動畫效果Android動畫
- 線上直播原始碼,自定義氣泡效果(BubbleView)原始碼View
- JavaScript元素拖拽路徑回放效果JavaScript
- JavaScript 限定範圍的拖拽效果JavaScript
- 使用BottomSheetBehavior實現美團拖拽效果
- (原創)[C#] 一步一步自定義拖拽(Drag&Drop)時的滑鼠效果:(一)基本原理及基本實現C#
- 直播軟體開發,工具類的自定義彈窗效果
- HarmonyOS NEXT應用開發—自定義檢視實現Tab效果
- 直播系統程式碼,Android自定義View實現呼吸燈效果AndroidView
- react-native 仿原生自定義彈窗|iOS/Android 彈窗效果ReactiOSAndroid
- 直播平臺原始碼,Android自定義View實現呼吸燈效果原始碼AndroidView
- Android技術分享|【自定義View】實現Material Design的Loading效果AndroidViewMaterial Design
- Android自定義View實現流式佈局(熱門標籤效果)AndroidView
- 自定義註解+反射 實現給註解新增功能的效果反射
- 使用 vue3 的自定義指令給 element-plus 的 el-dialog 增加拖拽功能Vue
- 手把手帶你使用JS-SDK自定義微信分享效果JS
- Java 給PPT新增動畫效果(預設動畫/自定義動畫)Java動畫
- jQuery的ztree仿windows檔案新建和拖拽效果jQueryWindows
- 完全模仿掘金Android App大圖瀏覽拖拽效果!AndroidAPP
- 【Flutter 專題】96 圖解 Draggable + DragTarget 基本拖拽效果Flutter圖解
- android自定義view(自定義數字鍵盤)AndroidView
- netty自定義Decoder用於自定義協議Netty協議