转载博客地址:http://www.cnblogs.com/flyme2012/p/4076674.html

这个Demo是用来练习VIewDragHelper的,也是仿照网上一个大神的代码。我通过他的代码学会的ViewDragHelper,然后仿照效果写的同样的效果。
原文连接:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0911/1680.html
效果图:
 
主要代码就是一个继承VIewGroup的类。写了注释,就不再解释了。
我写的主要代码如下:
 
public class YouLayout extends RelativeLayout {
 
private View topView;
private View bottomView;
private ViewDragHelper mDragHelper;
 
 
public YouLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
init(context);
}
public YouLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
// TODO Auto-generated constructor stub
}
public YouLayout(Context context) {
super(context);
init(context);
}
 
private void init(Context context){
mDragHelper = ViewDragHelper.create(this, 1.0f, new DragHelperCallBack());
}
 
@Override
protected void onFinishInflate() {
super.onFinishInflate();
topView = getTopView();
bottomView = getBottomView();
}
 
private View getTopView(){
return getChildAt(0);
}
private View getBottomView(){
return getChildAt(1);
}
 
 
 
 
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
 
if (ev.getAction() == MotionEvent.ACTION_CANCEL || ev.getAction() == MotionEvent.ACTION_UP) {
mDragHelper.cancel();
return false;
}
return mDragHelper.shouldInterceptTouchEvent(ev); //将事件传递给ViewDragHelper,让它自己处理是否需要打断。
}
 
 
private int downX ;
private int downY ;
 
@Override
public boolean onTouchEvent(MotionEvent event) {
mDragHelper.processTouchEvent(event); //同样是传递事件给ViewdragHelper
int x = (int) event.getX();
int y = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = x ;
downY = y ;
break;
case MotionEvent.ACTION_UP:
int dx = x - downX;
int dy = y - downY;
int slop = mDragHelper.getTouchSlop();
if ((Math.pow(dx, 2) + Math.pow(dy, 2)) < Math.pow(slop, 2)) {
//说明是点击事件
if (mDragOffset == 0 ) {
moveTo(1f);
}else {
moveTo(0);
}
}
break;
}//收拾的放下,抬起的处理,是为了针对点击事件做的处理
 
 
 
return  isMyView(topView, x, y) || isMyView(bottomView, x, y); //判断当前的点击事件是在TopView或者是在BottomView上,如果在其上,则返回true
//如果是在TopView上,事件则传递给ViewDragHelper处理,如果是在BottomView上,则自然的传递下去。如果是在其他地方,则返回false,将事件传递下去。
}
 
 
 
@Override
public void computeScroll() {
 
//这个是为了将事件执行到底
if (mDragHelper.continueSettling(true)) {
ViewCompat.postInvalidateOnAnimation(this);
}
}
 
 
//判断点击事件是否在View上
private boolean isMyView(View view, int x, int y) {
       int[] viewLocation = new int[2];
       view.getLocationOnScreen(viewLocation);
       int[] parentLocation = new int[2];
       this.getLocationOnScreen(parentLocation);
       int screenX = parentLocation[0] + x;
       int screenY = parentLocation[1] + y;
       return screenX >= viewLocation[0] && screenX < viewLocation[0] + view.getWidth() &&  screenY >= viewLocation[1] && screenY < viewLocation[1] + view.getHeight();
 }
 
 
 
//移动到指定的位置
boolean moveTo(float slideRatio) {
        final int topBound = getPaddingTop();
        int y = (int) (topBound + slideRatio * mHeight);
        if (mDragHelper.smoothSlideViewTo(topView, topView.getLeft(), y)) {
            ViewCompat.postInvalidateOnAnimation(this);
            return true;
        }
        return false;
    }
 
 
class DragHelperCallBack extends Callback{
 
 
/**
* 这个是为了判断力要ViewDragHelper处理的是哪个View,很明显,这里处理的是TopView
*/
@Override
public boolean tryCaptureView(View child, int arg1) {
  return child == topView;
}
 
//时时回调。提供的是TopView时时更改的状态
@Override
public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
mTop = top;
 
mDragOffset = (float) top / mHeight;
 
           topView.setPivotX(topView.getWidth());
           topView.setPivotY(topView.getHeight());
           topView.setScaleX(1 - mDragOffset / 2);
           topView.setScaleY(1 - mDragOffset / 2);
 
           bottomView.setAlpha(1 - mDragOffset);
           requestLayout();
           System.out.println("onviewpositionChhanged");
}
 
 
 
@Override
public void onViewReleased(View releasedChild, float xvel, float yvel) {
int top = getPaddingTop();
if (yvel > 0 || (yvel == 0 && mDragOffset > 0.5f)) {
top += mHeight;
}
mDragHelper.settleCapturedViewAt(releasedChild.getLeft(), top);
invalidate();
}
 
@Override
public int getViewVerticalDragRange(View child) {
return mHeight;
}
 
/**
* 如果手指是竖向滑动,事件则是在这个方法中处理的
*/
@Override
public int clampViewPositionVertical(View child, int top, int dy) {
int topBound = getPaddingTop();
int bottomBound = getHeight() - topView.getHeight() - topView.getPaddingBottom();
int newTop = Math.min(Math.max(top, topBound), bottomBound);
return newTop;
}
}
 
 
 
/**
* 重新的测量View
*/
@Override
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
       measureChildren(widthMeasureSpec, heightMeasureSpec);
 
       int maxWidth = MeasureSpec.getSize(widthMeasureSpec);
       int maxHeight = MeasureSpec.getSize(heightMeasureSpec);
 
       setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, 0),
               resolveSizeAndState(maxHeight, heightMeasureSpec, 0));
   }
 
 
 
private int mTop = 0 ;
private int mHeight;
private float mDragOffset;
 
/**
* 重新的布局子View   ,不重新布局也是可以的如果只是简单的移动一个topView的时候。在这个Demo中,需要让BottomView与TopView一起的移送,
* ViewdragHelper不能控制两个View,这里自己布局,然后使得在onViewPositionChanged的方法中,重新调用,重新布局,实现两个VIew的联动
*/
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
mHeight = getHeight() - topView.getHeight();
topView.layout(0, mTop, r, mTop + topView.getMeasuredHeight());
bottomView.layout(0, mTop + topView.getMeasuredHeight(), r, mTop +b);
}
 
}
 
 
我的github地址:https://github.com/flyme2012
我的博客地址:http://www.cnblogs.com/flyme2012/

ViewDragHelper练习使用的更多相关文章

  1. Android -- ViewDragHelper

    ViewDragHelper SlidingPaneLayout和DrawerLayout,现在这俩个类被广泛的运用,其实研究他们的源码你会发现这两个类都运用了ViewDragHelper来处理拖动. ...

  2. Viewdraghelper解析

    2013年谷歌i/o大会上介绍了两个新的layout: SlidingPaneLayout和DrawerLayout,现在这俩个类被广泛的运用, 其实研究他们的源码你会发现这两个类都运用了ViewDr ...

  3. Android之ViewDragHelper

    在自定义ViewGroup中,很多效果都包含用户手指去拖动其内部的某个View(eg:侧滑菜单等),针对具体的需要去写好onInterceptTouchEvent和onTouchEvent这两个方法是 ...

  4. Android 一步一步教你使用ViewDragHelper

    在自定义viewgroup的时候 要重写onInterceptTouchEvent和onTouchEvent 这2个方法 是非常麻烦的事情,好在谷歌后来 推出了ViewDragHelper这个类.可以 ...

  5. Android ViewDragHelper源码解析

    在自定义ViewGroup的过程中,如果涉及到View的拖动滑动,ViewDragHelper的使用应该是少不了的,它提供了一系列用于用户拖动子View的辅助方法和相关的状态记录,像Navigatio ...

  6. Android 中 View移动总结:ViewDragHelper学习及用法详解

    如上图简单呈现出两个方块后,提出一个需求: 1.拖动方块时,方块(即子View)可以跟随手指移动. 2.一个方块移动时,另一个方块可以跟随移动. 3.将方块移动到左边区域(右边区域)后放开(即手指离开 ...

  7. ViewDragHelper详解

    2013年谷歌i/o大会上介绍了两个新的layout: SlidingPaneLayout和DrawerLayout,现在这俩个类被广泛的运用,其实研究他们的源码你会发现这两个类都运用了ViewDra ...

  8. ViewDragHelper的使用

    一.ViewDragHelper的原理 是一个能够自用移动ViewGroup内部View的控件. 通过获取ViewGroup的点击事件,之后通过Scroller滑动来进行对ViewGroup内部控件的 ...

  9. Android ViewDragHelper完全解析 自定义ViewGroup神器

    Android ViewDragHelper完全解析 自定义ViewGroup神器   转载请标明出处: http://blog.csdn.net/lmj623565791/article/detai ...

随机推荐

  1. haproxy hdr和path

    path : string This extracts the request's URL path, which starts at the first slash and ends before ...

  2. Linux进程间通信——使用信号

    一.什么是信号 用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过生成信号和捕获信号来实现的,运行中 ...

  3. HDU1879 继续畅通工程 (并查集)

    继续畅通工程 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

  4. win7 Visual Studio 2008 安装程序时出现“ 加载安装组件时遇到问题。取消安装。”处理方法

    win7 Visual Studio 2008 安装程序时出现“ 加载安装组件时遇到问题.取消安装.”处理方法 vs2008试用期到期,卸载.重新安装都会出现“ 加载安装组件时遇到问题.取消安装.”无 ...

  5. HDU 4721 Food and Productivity (二分+树状数组)

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 题意 :给出n * m的格子,每个格子有两个属性f ...

  6. source insight 下看不了utf-8中文字符

    utf-8中文在source insight中显示为乱码,写了一个简单脚本,在linux下将代码转换为GBK格式,然后在source insight下正常查看. #!/bin/sh function ...

  7. linux 内核源代码分析 - 获取数组的大小

    #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) 測试程序: #include<stdio.h> #include<stdlib. ...

  8. oracle归档日志管理

    归档日志(Archive Log)是非活动的重做日志备份.通过使用归档日志,可以保留所有重做历史记录,当数据库处于ARCHIVELOG模式并进行日志切换式,后台进程ARCH会将重做日志的内容保存到归档 ...

  9. 《think in python》学习-9

    think in python think in python -9 案例分析:文字游戏 从文本文件中读取文字 作者提供了一个文本文件words.txt 地址 本章后面案例也会用带该文件中的词组 fi ...

  10. 何使用CSS写出一个下拉菜单。

    导航菜单是每个网站所必备的功能,也是每个学习制作网站的朋友所必须接触的,如何用css样式制作一个简单漂亮的二级下拉菜单呢? 下面为大家分享一下我的经验 方法步骤: 第一步  : 首页我们打开Subli ...