您的位置:首页 > 其它

ViewDragHelper

2016-04-27 22:16 330 查看
//仿照QQ菜单

public class mDragView extends FrameLayout
{

private ViewDragHelper mDragger;// 在父布局的角度上响应点击事件

private int menue_width;

public
mDragView(Context context, AttributeSet attrs) {


super(context, attrs);

f();

}

private void f() {

mDragger = ViewDragHelper.create(this, 1.0f,

new ViewDragHelper.Callback() {

@Override

public boolean tryCaptureView(View child, int pointerId) {

// 返回ture则表示捕获该view,你可以根据传入的第一个view参数决定哪些可以捕获

return child == getChildAt(1);

}

@Override

public int clampViewPositionHorizontal(View child,

int left, int dx) {

// left值是根据计算点击事件得出的将要移动到的水平新位置的left,

// 以下对left的修改使得子view不能水平溢出父布局

int newLeft = 0;

if (child == getChildAt(1)) {

int leftBoundle = 0;

newLeft = Math.min(Math.max(leftBoundle, left),

menue_width);

}

return newLeft;

}

@Override

public void onViewReleased(View releasedChild, float xvel,

float yvel) {

if (getChildAt(1).getLeft() > (menue_width / 2)) {

mDragger.smoothSlideViewTo(releasedChild,

menue_width, 0);

} else {

mDragger.smoothSlideViewTo(releasedChild, 0, 0);

}

ViewCompat.postInvalidateOnAnimation(mDragView.this);

}

});

}

@Override

public boolean
onInterceptTouchEvent(MotionEvent event) {


// 由viewdrager判断是否要进行事件拦截

return mDragger.shouldInterceptTouchEvent(event);

}

@Override

public boolean
onTouchEvent(MotionEvent event) {


// 将点击事件交给viewdrager处理

mDragger.processTouchEvent(event);

return true;

}

@Override

public void computeScroll() {

if (mDragger.continueSettling(true)) {

invalidate();

}

}

@Override

protected void
onLayout(boolean changed, int left, int top, int right,


int bottom) {

super.onLayout(changed, left, top, right, bottom);

menue_width = getChildAt(0).getWidth();

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: