最后
在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
代码是固定的,如下所示
Scroller scroller = new Scroller(mContext);
// 缓慢滚动到指定位置
private void smoothScrollTo(int destX,int destY) {
int scrollX = getScrollX();
int delta = destX -scrollX;
// 1000ms内滑向destX,效果就是慢慢滑动
mScroller.startScroll(scrollX,0,delta,0,1000);
invalidate();
}
@Override
public void computeScroll() {
if (mScroller.computeScrollOffset()) {
scrollTo(mScroller.getCurrX(),mScroller.getCurrY());
postInvalidate();
}
}
2.View的滑动
-
通过三种方式可以实现View的滑动
-
通过View本身提供的scrollTo/scrollBy方法来实现滑动
-
第二种是通过动画给View施加平移效果来实现滑动
-
第三种是通过改变View的LayoutParams使得View重新布局从而实现滑动
2.1 使用scrollTo/scrollBy
- scrollTo和scrollBy只能改变View内容的位置而不能改变View在布局中的位置
2.2 使用动画
主要是操作View的translationX和translationY属性.
//View动画
val loadAnimation = AnimationUtils.loadAnimation(applicationContext, R.anim.animation_scroll)
btn_animation_scroll.startAnimation(loadAnimation)
//属性动画
btn_animation_scroll.animate().translationX(200f).translationY(200f).start()
2.3 LayoutParams
val layoutParams = btn_layout_params.layoutParams as? FrameLayout.LayoutParams
layoutParams?.leftMargin = layoutParams?.leftMargin?.plus(100)
//或者btn_layout_params.setLayoutParams(params)
btn_layout_params.requestLayout()
2.4 View滑动总结
-
scrollTo/scrollBy:操作简单,适合对View内容的滑动;
-
动画:操作简单,主要适用于没有交互的View和实现复杂的动画效果;
-
改变布局参数:操作稍微复杂,适用于有交互的View。
3. View的弹性滑动
3.1 使用Scroller
原理: 调用startScroll()方法,其实里面并没有进行滑动,而是因为紧接着调用的invalidate(),导致View重绘.在View的draw方法里面又会去调用computeScroll方法.computeScroll是需要自己去实现的,computeScroll会去向Scroller获取当前的scrollX和scrollY(Scroller内部是根据时间去计算当前的scrollX和scrollY的值),然后又调用scrollTo,又invalidate(),又要重绘,如此反复.实现了弹性滑动.
View不断重绘,不断通过时间流逝来计算新的滑动位置,小幅度的滑动,最终形成了弹性滑动.
3.2 通过动画
-
动画天生就自带弹性的属性,哈哈,自然没啥问题
-
说点利用动画来实现一些动画不能实现的效果->动画可以不作用于任何View上,而是通过它在具体的时间内完成了整个动画过程,我们可以获取这个值,从而干一些操作.比如通过ValueAnimator在1000ms内从0-100,然后我们可以根据这个来画一个进度条,在1000ms内到达100%.
模仿Scroller来实现View的弹性滑动
final int startX = 0;
final int deltaX = 100;
ValueAnimator animator = ValueAnimator.ofInt(0,1).setDuration(1000);
animator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animator) {
float fraction = animator.getAnimatedFraction();
mButton1.scrollTo(startX + (int) (deltaX * fraction),0);
}
});
animator.start();
3.3 Handler.postDelayed
不断发生延时消息,不断scrollTo.发送消息无法精确地定时,系统的消息调度是需要时间的,并且所需时间不定.
3.4 Thread#sleep
4.事件分发
主要是3个方法: dispatchTouchEvent(),onInterceptTouchEvent(),onTouchEvent()
-
从Activity的dispatchTouchEvent开始,然后传到PhoneWindow的superDispatchTouchEvent(),再传入DecorView的superDispatchTouchEvent(),即ViewGroup的dispatchTouchEvent.
-
在ViewGroup的dispatchTouchEvent()中,先调用onInterceptTouchEvent(),判断是否需要拦截事件.默认是不拦截的,继续向子View传递事件,找到被点击的响应子View控件,调用该View的dispatchTouchEvent.至此,完成了从ViewGroup向子View事件传递的过程,子View也可能是ViewGroup,但是过程是一样的,类似的递归下去. 当ViewGroup拦截了事件时,自己处理事件,调用自身的onTouch()->onTouchEvent()->performClick()->onClick()
-
当事件来到View这里,调用dispatchTouchEvent,调用View.onTouch(),如果这个方法返回true,那么事件已经被消费了,不用再继续往下传递了.如果返回false,那么消费事件,调用onTouchEvent().调用performClick(),调用onClick()
三者关系伪代码
public boolean dispatchTouchEvent(MotionEvent ev) {
boolean consume = false;
if (onInterceptTouchEvent(ev)) {
consume = onTouchEvent(ev);
} else {
consume = child.dispatchTouchEvent(ev);
}
return consume;
}
5. 解决滑动冲突
这里借用刚哥 安卓开发艺术探索中的图叙述一下
最后
说一千道一万,不如自己去行动。要想在移动互联网的下半场是自己占有一席之地,那就得从现在开始,从今天开始,马上严格要求自己,既重视业务实现能力,也重视基础和原理。基础夯实好了,高楼才能够平地而起,稳如泰山。
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的24套腾讯、字节跳动、阿里、百度2020-2021面试真题解析,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。
还有 高级架构技术进阶脑图、Android开发面试专题资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!