为了熟悉使用一些开源框架,我决定利用业余时间写一个APP来熟悉这些框架的使用。提前踩坑,方便以后在公司的项目中使用。使用的接口是聚合数据和干货集中营,非常感谢。效果图中使用的主流框架是首页侧滑条。Realm数据库用于实现本地采集。采用Retrofit+RxJava+RxAndroid实现网络请求,对返回结果进行简单封装。RecyclerView的Adapter和ViewHolder被封装了。,实现上拉加载使用CoordinatorLayout+AppBarLayout+CollapsingToolbarLayout实现炫酷的滑动动画使用Glide实现图片加载使用PhotoView实现图片缩放Calendar使用开源素材-calendarview实现SwipeRefreshLayout第一次进入自动刷新1.使用DrawerLayout+NavigationView实现侧滑条DrawerLayout是Androidv4包中的内置控件,支持左右滑动,android:layout_gravity="leftt"代表左滑界面(或start),android:layout_gravity="right"代码向右滑动的界面(或端),不用layout_gravity就是可以在主界面代码中加入ActionBarDrawerToggle来控制侧滑条的显示和隐藏。ActionBarDrawerTogglemDrawerToggle=newActionBarDrawerToggle(这个,mDrawerLayout,mToolBar,R.string.open,R.string.close);mDrawerToggle.syncState();mDrawer.addDrawerListener(mDrawerToggle);NavigationView是Google在5.0之后推出的一个控件,主要作为一个菜单控件,分为上下两部分。上半部分是headerLayout,可以自定义布局。下半部分是menu,作为导航菜单的菜单项。二、Glide加载图片并设置绑定生命周期Glide.with(Contextcontext);//BindContextGlide.with(Activityactivity);//BindActivityGlide.with(FragmentActivityactivity);//绑定FragmentActivityGlide.with(Fragmentfragment);//绑定Fragment常规用法:Glide.with(context).load(imageUrl)//图片路径.placeholder(R.drawable.ic_launcher)//设置加载图片.error(R.drawable.ic_launcher)//设置加载失败图片.skipMemoryCache(true)//设置跳过内存缓存.diskCacheStrategy(DiskCacheStrategy.ALL)//设置缓存策略:all:缓存源资源和Converted资源/none:nodiskcache/source:cachesourceresource/result:cacheconvertedresource.priority(Priority.NORMAL)//设置下载优先级.animate(R.anim.item_alpha_in)//设置Loadinganimation.thumbnail(0.1f)//设置缩略图支持(加载thumbnailfirst,thenloadfullimage).override(400,400)//设置加载size??.centerCrop()//设置动态transformation.into(imageView);加载Git图片:Glide.with(this).load(imageUrl).asGif().into(imageView);动态缓存清理:Glide.get(this).clearDiskCache();//清除磁盘缓存需要在子线程中执行Glide.get(this).clearMemory();//清除内存缓存可以在UI主线程加载。图片:Glide.with(this).load(imageUrl).transform(newGlideRoundTransform(this)).into(imageView);需要自定义Transform,这里是圆角和圆角Transform:圆角变换:publicclassGlideRoundTransformextendsBitmapTransformation{privatestaticfloatradius=0f;publicGlideRoundTransform(Contextcontext){this(context,4);}publicGlideRoundTransform(Contextcontext,intdp){super(context);this.radius=Resources.getSystem().getDisplayMetrics().density*dp;}@OverrideprotectedBitmaptransform(BitmapPoolpool,BitmaptoTransform,intoutWidth,intoutHeight){returnroundCrop(pool,toTransform);}privatestaticBitmaproundCrop(BitmapPoolpool,Bitmapsource){if(source==null)returnnull;Bitmapresult=pool.get(source.getWidth(),source.getHeight(),Bitmap。Config.ARGB_8888);if(result==null){result=Bitmap.createBitmap(source.getWidth(),source.getHeight(),Bitmap.Config.ARGB_8888);}Canvascanvas=newCanvas(result);Paintpaint=新Paint();paint.setShader(newBitmapShader(source,BitmapShader.TileMode.CLAMP,BitmapShader.TileMode.CLAMP));paint.setAntiAlias(true);RectFrectF=newRectF(0f,0f,source.getWidth(),source.getHeight());canvas.drawRoundRect(rectF,radius,radius,paint);returnresult;}@OverridepublicStringgetId(){returngetClass().getName()+Math.round(radius);}}圆形图片转换:publicclassGlideCircleTransformextendsBitmapTransformation{publicGlideCircleTransform(Contextcontext){super(context);}@OverrideprotectedBitmaptransform(BitmapPoolpool,BitmaptoTransform,intoutWidth,intoutHeight){returncircleCrop(pool,toTransform);}privatestaticBitmapcircleCrop(BitmapPoolpool,Bitmapsource){if(source==null)returnnull;intsize=Math.min(source.getWidth(),source.getHeight());intx=(source.getWidth()-size)/2;inty=(source.getHeight()-size)/2;//TODOthiscouldbeacquiredfromthepooltooBitmapsquared=Bitmap.createBitmap(source,x,y,size,size);Bitmapresult=pool.get(size,size,Bitmap.Config.ARGB_8888);if(result==null){result=Bitmap.createBitmap(size,size,Bitmap.Config.ARGB_8888);}Canvascanvas=newCanvas(result);Paintpaint=newPaint();paint.setShader(newBitmapShader(squared,BitmapShader.TileMode.CLAMP,BitmapShader.TileMode.CLAMP));paint.setAntiAlias(true);floatr=size/2f;canvas.drawCircle(r,r,r,paint);returnresult;}@OverridepublicStringgetId(){returngetClass().getName();}}获取BitmapGlide.with(this).load(imageUrl).asBitmap().into(newSimpleTarget(){@OverridepublicvoidonResourceReady(Bitmapresource,GlideAnimationglideAnimation){imageView.setImageBitmap(mBitmap);}});