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();
}
}
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();
}
}
相关文章推荐
- Android转型javaweb心得体会(第一个月)
- 2015年中国手机APP市场研究报告
- LeetCode *** 29. Divide Two Integers(binary search)
- ACM--酷酷的单词--CSU 1505--湖南第十届省赛
- 几种常用容器的分析与比较
- poj 1573 Robot Motion
- Date 和 SimpleDateFormat 类表示时间
- Swift之逻辑分支&循环的介绍
- Flask -- 内容管理系统
- AngularJS 输入验证
- Circular primes
- 面试路之快慢指针理解(3)
- json小计
- jQuery.extend 函数详解
- Linux iptables 查看、设置、配置保存、备份和恢复
- Javascript 将json字符串解析成js 对象的四种方法
- LeetCode 342 Power of Four
- 链接数据库并把表格显示出来
- Web 高效开发必备的 PHP 框架
- Jquery实现光棒效果