前言
随着入Android这个坑的时间越来越长,愈加觉得深入掌握原理以及技术输出的重要性,会使用轮子和造一个好轮子还是有天壤之别的。授人以鱼不如授人以渔,将一些经验分享出来,希望能够让更多的人更加深入地理解它,并帮助到有需要的朋友。本系列分为三篇,会由浅至深地对DrageHelper 进行详细讲解。
目录
ViewDragHelper 的介绍以及初步使用请阅读这篇:
ViewDragHelper (一)- 介绍及简单用例(入门篇)
ViewDragHelper 的源码以及Callback的详情介绍请阅读这篇:
ViewDragHelper (二)- 源码及原理解读(进阶篇)
利用DrageHelper 打造仿陌陌APP视频播放页的demo请阅读这篇:
ViewDragHelper (三)- 打造仿陌陌视频播放页(深入篇)
介绍:
首先简单看一下它的官方解释:
ViewDragHelper is a utility class for writing custom ViewGroups. It offers a number
of useful operations and state tracking for allowing a user to drag and reposition
views within their parent ViewGroup.
ViewDragHelper 它是Google官方推出的手势滑动辅助类,极大程度地简化了我们对控件的手势滑动跟踪及处理。让我们能够更加便捷地开发自定义ViewGroup控件,实现拖拽以及弹性滚动等功能。事实上,官方的SlidingPaneLayout和DrawerLayout都是利用ViewDragHelper实现的。掌握它,可以一定程度地减轻我们开发工作难度以及投入精力。
使用入门示例
接下来,我们主要通过一个简单的拖拽以及回弹的demo(类似于QQ空间视频播放页),来讲解如何利用DrageHelper 打造一个 ViewGroup 控件。
QQ空间视频播放页效果图:
大致步骤如下:
第一步:
创建一个DraggableView类继承自ViewGroup(或者也可用 FrameLayout , RelativeLayout, LinearLayout等)。
package com.test.demo;
import android.content.Context;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.widget.ViewDragHelper;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.RelativeLayout;
/**
* Created by 小嵩 on 2017/9/10.
*/
public class MyDraggableView extends RelativeLayout{
private ViewDragHelper viewDragHelper;
public MyDraggableView(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
initView();
}
private void initView() {
viewDragHelper = ViewDragHelper.create(this, 1.0f, new DraggableViewCallback(this));
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return viewDragHelper.shouldInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
viewDragHelper.processTouchEvent(event);
return true;
}
}
在onInterceptTouchEvent方法中,通过viewDragHelper.shouldInterceptTouchEvent(event)来决定我们是否应该拦截当前的事件,如果返回的是True,则会触发onTouchEvent。
在onTouchEvent方法中,通过viewDragHelper.proce