澳门微尼斯人手机版 1Untitled
Diagram.png

读别人的源码,可以从中学到很多课本、视频中无法得到的东西,今天代码君就总结一下
github上比较好的开源项目APP,拿走不谢~

上面这个方面也是看到别人的实现的思路,虽然没什么问题不过还是算是取巧的一种方法,仅记录。

一张图 纵横世界 ,给你一个完整的android启动过程框架
,还你一个清晰明了的思路。

澳门微尼斯人手机版 2

mLayoutManager.scrollToPositionWithOffset(position, 0);//没有滑动,直接置顶

澳门微尼斯人手机版 3

这里随便拿一个app去阅读一下源码,读者就可以体会MVP是如何运用到项目当中的,代码君当初学习MVP架构也是理论上理解,实战欠缺,所以读别人源码是促使自己进步的一个好方法

 /** * When scrolling towards a child view, this method defines whether we should align the top * or the bottom edge of the child with the parent RecyclerView. * * @return SNAP_TO_START, SNAP_TO_END or SNAP_TO_ANY; depending on the current target vector * @see #SNAP_TO_START * @see #SNAP_TO_END * @see #SNAP_TO_ANY */ protected int getVerticalSnapPreference() { return mTargetVector == null || mTargetVector.y == 0 ? SNAP_TO_ANY : mTargetVector.y > 0 ? SNAP_TO_END : SNAP_TO_START; }

觉得太花哨,那就来个黑白版:

  1. 仿网易播放器 特点:澳门微尼斯人手机版, 音频处理范例

  2. 仿Youtube视频播放 特点: Youtube

  3. 仿B站 特点: bilibili

  • RecyclerView 的滑动方法

android本身网上讲解的启动流程很多,那为什么我还要画这张图呢?
原因是网上讲的是比较多,但是画出来的图,我在理解的时候,总是有偏差,自己在整理,想给别人传输概念时候,发现网上的那些图总是会带来一些误导。我在画这张图的时候,里面标注最明显的就是进程,以及一些线程的文字,我想传递出去的就是,虚拟机是在zygote里面,是属于内部的一个实现,然后其他的apk在fork的时候,直接拿到了一个虚拟机。而我们的AMS
PMS这些,我画在了system_server进程里面,标注是线程。让你直观上去看到AMS这些是在system_server进程内部,不会出现理解偏差。在zygote进程里面,我标注了一些
so jar
apk的信息,这些就是在zygote进程启动时候,自己首先加载了一堆库和资源,这样子我们启动apk的时候,从它这里fork的时候,就直接带过去了,这样子我们apk就直接有了一个虚拟机,这样子就能解析执行java语言编出来的dex字节码了。剩下的就是等你来细细阅读下这张图,有什么疑问,留言,代码GG随时解疑答惑。

要学习React语言的可以参考这些APP

public class LinearLayoutManagerWithSmoothScroller extends LinearLayoutManager { public LinearLayoutManagerWithSmoothScroller(Context context) { super(context, VERTICAL, false); } public LinearLayoutManagerWithSmoothScroller(Context context, int orientation, boolean reverseLayout) { super(context, orientation, reverseLayout); } //重点方法 @Override public void smoothScrollToPosition(RecyclerView recyclerView, RecyclerView.State state, int position) { //也就是说重点在于重写 SmoothScroller,而滑动的调用为 startSmoothScroll() RecyclerView.SmoothScroller smoothScroller = new TopSnappedSmoothScroller(recyclerView.getContext; smoothScroller.setTargetPosition; startSmoothScroll(smoothScroller); } private class TopSnappedSmoothScroller extends LinearSmoothScroller { public TopSnappedSmoothScroller(Context context) { super; } @Override public PointF computeScrollVectorForPosition(int targetPosition) { return LinearLayoutManagerWithSmoothScroller.this .computeScrollVectorForPosition(targetPosition); } @Override protected int getVerticalSnapPreference() { //将指定的 item 滑动至与屏幕的顶端对齐 return SNAP_TO_START; } }}//使用recyclerView.smoothScrollToPosition;
  1. Google MVP 特点:官方出品 必是精品

  2. 照片笔记APP 特点:Material Design风格
    MVP+Dagger2+RxJava+AspectJ+Dex

  3. 电影引导APP 特点:MVP, RxJava, Dagger

  4. 新闻客户端APP 特点:MVP Material Design风格

  5. 菜鸟新闻APP 特点:MVP EventBus Volley

  6. 仿微信朋友圈APP 特点:MVP 实现了点赞、评论、删除等功能

private void setSelectPosition(int index) { //当前可见的第一项和最后一项 int firstItem = linearLayoutManager.findFirstVisibleItemPosition(); int lastItem = linearLayoutManager.findLastVisibleItemPosition(); if (index <= firstItem) { //当要置顶的项在当前显示的第一个项的前面时,直接调用没有问题 rv.scrollToPosition; } else if (index <= lastItem) { //当要置顶的项已经在屏幕上显示时,计算需要滑动的距离 int top = rv.getChildAt(index - firstItem).getTop(); rv.scrollBy; } else { //当指定的 item 在当前显示的最后一项的后面时 //这时候一次的滑动不足以将指定 item 放到顶端 rv.scrollToPosition; //记录当前需要在RecyclerView滚动监听里面继续第二次滚动 move = true; }}//在第三种的情况中,scrollToPosition() 结束后该方法被调用class RecyclerViewListener extends RecyclerView.OnScrollListener{ @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); //在这里进行第二次滚动 if { move = false; int n = mIndex - mLinearLayoutManager.findFirstVisibleItemPosition(); if ( 0 <= n && n < mRecyclerView.getChildCount{ //要移动的距离 int top = mRecyclerView.getChildAt.getTop(); mRecyclerView.scrollBy; } } } }

scrollToPosition();smoothScrollToPosition() 将对应的 item
滑动到屏幕内,当 item 变为可见时则停止滑动。所以当指定的 item
在当前屏幕的下方时,滑动后目标 item 会出现屏幕的最底部;当指定 item
在屏幕可见时,则完全没有滑动。很多时候这个方法是不符合我们预期的,有时候,我们希望能将指定的
item 平滑的滑动到当前的屏幕顶端或中间。这时候可以配合 scrollBy()
来做一个判断:

发表评论

电子邮件地址不会被公开。 必填项已用*标注