super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
mDragHelper = ViewDragHelper.create(this, 1.0f,new DragerCallBack());
mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();
}
public void setOnDrawerStatusChanged(OnDrawerStatusChanged onDrawerStatusChanged) {
this.onDrawerStatusChanged = onDrawerStatusChanged;
}
public void switchDrawer() {
if(mDragOffset<1){
minimize();
}else{
maximize();
}
}
private class DragerCallBack extends ViewDragHelper.Callback{
//从底部到顶部的顺序遍历子view
@Override
public int getOrderedChildIndex(int index) {
int childCount = BottomDrawerLayout.this.getChildCount();
int newIndex = childCount - index -1;
return newIndex;
}
@Override
public boolean tryCaptureView(View child, int pointerId) {
return child == mDrawerView;
}
@Override
public int clampViewPositionHorizontal(View child, int left, int dx) {
// Log.d(TAG, "clampViewPositionHorizontal " + left + “,” + dx);
// final int leftBound = getPaddingLeft();
// final int rightBound = getWidth() - mBottomView.getWidth() - leftBound;
// //坐标系三种情况
// final int newLeft = Math.min(Math.max(left, leftBound), rightBound);
//
// return newLeft;
return super.clampViewPositionHorizontal(child, left, dx);
}
//要想上下拖动必须重写此方法
@Override
public int clampViewPositionVertical(View child, int top, int dy) {
// Log.d(TAG, "clampViewPositionVertical " + top + “,” + dy);
final int topBound = getHeight() - mDrawerView.getMeasuredHeight() - mBottomView.getHeight();
final int bottomBound = getHeight() - mBottomView.getHeight();
final int newTop = Math.min(Math.max(top, topBound), bottomBound);
return newTop;
}
@Override
public void onViewCaptured(View capturedChild, int activePointerId) {
super.onViewCaptured(capturedChild, activePointerId);
}
@Override
public void onViewReleased(View releasedChild, float xvel, float yvel) {
// Log.i(TAG, “onViewReleased:” + “xvel:” + xvel + “,yvel:” + yvel);
//yvel Fling产生的值,yvel > 0 则是快速往下Fling || yvel < 0 则是快速往上Fling
int top = mParentHeight - mDrawerHeight - mBottomHeight;
if (yvel > 0 || (yvel == 0 && mDragOffset > 0.5f)/* 后面这个小括号里判断处理拖动之后停下来但是未松手的情况 */) {
top += mDrawerHeight;
}
mDragHelper.settleCapturedViewAt(releasedChild.getLeft(), top);
invalidate();//important 不加,就不会刷新View的位置
}
@Override
public void onViewDragStateChanged(int state) {
super.onViewDragStateChanged(state);
}
@Override
public void onViewPositionChanged(View changedView, int left, int top, int dx, int dy) {
mCurTop = top;
mDragOffset = ((float) top -(mParentHeight - mDrawerHeight - mBottomHeight))/ mDrawerHeight;
// Log.d(TAG, “onViewPositionChanged: mDragOffset:” + mDragOffset);
//旋转与透明跟随效果
mDrawerView.setAlpha(1-mDragOffset);
// mRotateView.setRotation((1-mDragOffset)*180);
requestLayout();
if (onDrawerStatusChanged != null) {
onDrawerStatusChanged.onChanged(mParentHeight,top);
}
// if(onDrawerStatusChanged !=null){
// if(mDragOffset == 0 || mDragOffset == 1){
// onDrawerStatusChanged.onChanged(mParentHeight,top);
// }
// }
}
}
public interface OnDrawerStatusChanged{
void onChanged(int parentHeight, int drawerTop);
}
public void maximize()
{
smoothSlideTo(0.0f);
}
public void minimize()
{
smoothSlideTo(1.0f);
}
private boolean smoothSlideTo(float slideOffset) {
final int topBound = mParentHeight - mDrawerHeight - mBottomHeight;
int y = (int) (topBound + slideOffset * mDrawerHeight);
if(mDragHelper.smoothSlideViewTo(mDrawerView, mDrawerView.getLeft(), y))
{
ViewCompat.postInvalidateOnAnimation(this);
return true;
}
return false;
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
int act = MotionEventCompat.getActionMasked(event);
// final int action = event.getAction();
switch (act) {
//由于很多情况不能拦截事件,这种时候系统不会调用onTouchEvent()
// 手动把事件传递给mDragHelper.processTouchEvent
case MotionEvent.ACTION_DOWN:
mInitialX = event.getX();
mInitialY = event.getY();
//Feed the down event to the detector so it has
// context when/if dragging begins
// mDetector.onTouchEvent(event);
mDragHelper.processTouchEvent(event);
isUnderBottomView = mDragHelper.isViewUnder(mBottomView, (int)mInitialX, (int)mInitialY);
isUnderDrawerView = mDragHelper.isViewUnder(mDrawerView, (int)mInitialX, (int)mInitialY);
break;
case MotionEvent.ACTION_POINTER_DOWN:
mDragHelper.processTouchEvent(event) ;
break;
case MotionEvent.ACTION_POINTER_UP:
mDragHelper.processTouchEvent(event) ;
break;
case MotionEvent.ACTION_MOVE:
final float x = event.getX();
final float y = event.getY();
final int yDiff = (int) Math.abs(y - mInitialY);
final int xDiff = (int) Math.abs(x - mInitialX);
//Verify that either difference is enough to be a drag
if ((yDiff > mTouchSlop || xDiff > mTouchSlop) && (isUnderBottomView || isUnderDrawerView) ){
//Start capturing events
return true;
}
break;
}
//父类是viewgroup,返回的false
return super.onInterceptTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
mDragHelper.processTouchEvent(event);
//down事件返回false,让其底部的平行层级的view能够接收到点击事件
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
return false;
case MotionEvent.ACTION_UP:
return false;
//只有当手指达到拖动阈值时this才确定消耗此系列事件
//若未达到阈值也返回true,则与其平行的view不会收到click事件
case MotionEvent.ACTION_MOVE:
final float x = event.getX();
final float y = event.getY();
final int yDiff = (int) Math.abs(y - mInitialY);
final int xDiff = (int) Math.abs(x - mInitialX);
//Verify that either difference is enough to be a drag
if ((yDiff > mTouchSlop || xDiff > mTouchSlop) && (isUnderBottomView || isUnderDrawerView) ){
//Start capturing events
return true;
}
如何成为Android高级架构师!
架构师必须具备抽象思维和分析的能力,这是你进行系统分析和系统分解的基本素质。只有具备这样的能力,架构师才能看清系统的整体,掌控全局,这也是架构师大局观的形成基础。 你如何具备这种能力呢?一是来自于经验,二是来自于学习。
架构师不仅要具备在问题领域上的经验,也需要具备在软件工程领域内的经验。也就是说,架构师必须能够准确得理解需求,然后用软件工程的思想,把需求转化和分解成可用计算机语言实现的程度。经验的积累是需要一个时间过程的,这个过程谁也帮不了你,是需要你去经历的。
但是,如果你有意识地去培养,不断吸取前人的经验的话,还是可以缩短这个周期的。这也是我整理架构师进阶此系列的始动力之一。
成为Android架构师必备知识技能
对应导图的学习笔记(由阿里P8大牛手写,我负责整理成PDF笔记)
部分内容展示
《设计思想解读开源框架》
- 目录
- 热修复设计
- 插件化框架设计
《360°全方面性能优化》
- 设计思想与代码质量优化
- 程序性能优化
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
链图片转存中…(img-WlXsyXJm-1714188129366)]
《360°全方面性能优化》
[外链图片转存中…(img-IJmgSsND-1714188129367)]
- 设计思想与代码质量优化
[外链图片转存中…(img-KdP3yay4-1714188129367)] - 程序性能优化
[外链图片转存中…(img-TsbugoLG-1714188129367)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!