Android应用ViewDragHelper详解及部分源码浅析,Android面试真题精选

mCurTop = top;

requestLayout();

}

@Override

public int getViewVerticalDragRange(View child) {

if (mDrawerView == null) return 0;

return (mDrawerView == child) ? mDrawerView.getHeight() : 0;

}

@Override

public void onViewDragStateChanged(int state) {

super.onViewDragStateChanged(state);

if (state == ViewDragHelper.STATE_IDLE) {

mIsOpen = (mDrawerView.getTop() == 0);

}

}

}

@Override

public void computeScroll() {

if (mTopViewDragHelper.continueSettling(true)) {

invalidate();

}

}

public void closeDrawer() {

if (mIsOpen) {

mTopViewDragHelper.smoothSlideViewTo(mDrawerView, mDrawerView.getLeft(), -mDrawerView.getHeight());

invalidate();

}

}

public void openDrawer() {

if (!mIsOpen) {

mTopViewDragHelper.smoothSlideViewTo(mDrawerView, mDrawerView.getLeft(), 0);

invalidate();

}

}

public boolean isDrawerOpened() {

return mIsOpen;

}

//Step3:重写onInterceptTouchEvent回调ViewDragHelper中对应的方法.

@Override

public boolean onInterceptTouchEvent(MotionEvent ev) {

return mTopViewDragHelper.shouldInterceptTouchEvent(ev);

}

//Step3:重写onTouchEvent回调ViewDragHelper中对应的方法.

@Override

public boolean onTouchEvent(MotionEvent event) {

mTopViewDragHelper.processTouchEvent(event);

return true;

}

@Override

protected LayoutParams generateDefaultLayoutParams() {

return new MarginLayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);

}

@Override

protected LayoutParams generateLayoutParams(LayoutParams p) {

return new MarginLayoutParams§;

}

@Override

public LayoutParams generateLa

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

youtParams(AttributeSet attrs) {

return new MarginLayoutParams(getContext(), attrs);

}

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

int measureWidth = MeasureSpec.getSize(widthMeasureSpec);

int measureHeight = MeasureSpec.getSize(heightMeasureSpec);

setMeasuredDimension(measureWidth, measureHeight);

mContentView = getChildAt(0);

mDrawerView = getChildAt(1);

MarginLayoutParams params = (MarginLayoutParams) mContentView.getLayoutParams();

int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(

measureWidth- (params.leftMargin + params.rightMargin), MeasureSpec.EXACTLY);

int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(

measureHeight - (params.topMargin + params.bottomMargin), MeasureSpec.EXACTLY);

mContentView.measure(childWidthMeasureSpec, childHeightMeasureSpec);

mDrawerView.measure(widthMeasureSpec, heightMeasureSpec);

}

@Override

protected void onLayout(boolean changed, int l, int t, int r, int b) {

if (changed) {

MarginLayoutParams params = (MarginLayoutParams) mContentView.getLayoutParams();

mContentView.layout(params.leftMargin, params.topMargin,

mContentView.getMeasuredWidth() + params.leftMargin,

mContentView.getMeasuredHeight() + params.topMargin);

params = (MarginLayoutParams) mDrawerView.getLayoutParams();

mDrawerView.layout(params.leftMargin, mCurTop + params.topMargin,

mDrawerView.getMeasuredWidth() + params.leftMargin,

mCurTop + mDrawerView.getMeasuredHeight() + params.topMargin);

}

}

}

怎么样,简单吧。效果也有了,代码也有了,ViewDragHelper也体验了,接下来就该苦逼的看源码了。

【工匠若水 http://blog.csdn.net/yanbober 未经允许严禁转载,请尊重作者劳动成果。私信联系我

3 ViewDragHelper局部源码浅析

==========================

上面的例子中我们可以知道,使用ViewDragHelper的第一步就是通过他提供的静态工厂方法create获取实例,因为ViewDragHelper的构造方法是私有的。既然这样那我们先看下这些静态工厂方法,如下:

public class ViewDragHelper {

public static ViewDragHelper create(ViewGroup forParent, float sensitivity, Callback cb) {

final ViewDragHelper helper = create(forParent, cb);

helper.mTouchSlop = (int) (helper.mTouchSlop * (1 / sensitivity));

return helper;

}

public static ViewDragHelper create(ViewGroup forParent, Callback cb) {

return new ViewDragHelper(forParent.getContext(), forParent, cb);

}

}

可以看见,三个参数的create方法实质调运的还是两个参数的create。其中forParent一般是我们自定义的ViewGroup,cb是控制子View相关状态的回调抽象类实现对象,sensitivity是用来调节mTouchSlop的,至于mTouchSlop是啥以及sensitivity的作用下面会有解释。接着可以发现两个参数的create实质是调运了ViewDragHelper的构造函数,那我们就来分析一下这个构造函数,如下源码:

private ViewDragHelper(Context context, ViewGroup forParent, Callback cb) {

//对参数进行赋值

mParentView = forParent;

mCallback = cb;

//通过ViewConfiguration等将dp转px得到mEdgeSize

final ViewConfiguration vc &#

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值