简介

9GAG是一个以图片为主的搞笑网站,网友自发投稿,网络全球笑料,内容以英文,尤其美国文化为主。之前官方提供了一个开源的Android项目,不过目前官方的项目不再开源了,不过我们仍能在网上找到这个项目的源码。
官方项目源码
Material后的项目源码

效果

原始效果

Material之后的效果

注:以上两个只是部分效果,受CSDN对上传图片大小的限制没有把所有的功能都录制下来

分析

原项目的目录结构

从项目的演示效果来看好像并不复杂,但是看一下目录结构感觉还.java还挺多的,麻雀虽小五脏俱全,该有的都有了。所以本项目很适合新手学习一个完整项目的开发过程。整个项目的源码解析主要可以分为以下几个部分
- UI
- 网络数据交换
- 数据缓存

UI

整个讲解将分为三篇文章,本文主要讲解的是UI的部分。

ListView

原项目中使用的是StaggeredGridView,是个开源项目,但是目前的这个项目的作者已经把这个项目Deprecated,推荐我们使用官方的RecyclerView,但是RecyclerView目前不支持CursorAdapter,Google官方也没有提供解决方案,所以在Material的过程中直接使用了ListView,并用CursorAdapter作为适配器。

CursorAdapter

CursorAdapter使用起来很简单,主要重写newView()和bindView()这两个方法。需要注意的一点是,cursor的必须要有个命名为”_id”的列。比如Contacts._ID就为”_id”

newView返回的是一个用于装载ListView中item的View。

public View newView(Context context, Cursor cursor, ViewGroup viewGroup) {return mLayoutInflater.inflate(R.layout.listitem_feed, null);}

bindView()的目的就是把view中的元素给附上值。

public abstract void bindView (View view, Context context, Cursor cursor)
Bind an existing view to the data pointed to by cursor

Parameters
view Existing view, returned earlier by newView
context Interface to application’s global information
cursor The cursor from which to get the data. The cursor is already moved to the correct position.

  @Overridepublic void bindView(View view, Context context, Cursor cursor) {ViewHolder holder = (ViewHolder) view.getTag();if (holder == null) {holder = new ViewHolder(view);view.setTag(holder);}Feed feed = Feed.fromCursor(cursor);view.setEnabled(!mListView.isItemChecked(cursor.getPosition()+ mListView.getHeaderViewsCount()));holder.imageRequest = ImageCacheManager.loadImage(feed.getImages().normal, ImageCacheManager.getImageListener(holder.imageView, mDefaultImageDrawable, mDefaultImageDrawable), 0, DensityUtils.dip2px(context, IMAGE_MAX_HEIGHT));holder.caption.setText(feed.getCaption());}class ViewHolder{@Bind(R.id.iv_normal)ImageView imageView;@Bind(R.id.tv_caption)TextView caption;public ImageLoader.ImageContainer imageRequest;public ViewHolder(View view){ButterKnife.bind(this, view);}}

FoldingDrawerLayout

FoldingDrawerLayout是继承自DrawerLayout的一个类,用来实现折叠效果的Drawer,在Material的过程中,使用android.support.v4.widget.DrawerLayout和android.support.design.widget.NavigationView代替。

PhotoView

一个很好的开源项目,实现了对于ImageView我们常用的操作,比如放大、缩小、旋转等效果。
一个简单的示例

ImageView mImageView;
PhotoViewAttacher mAttacher;@Override
public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// Any implementation of ImageView can be used!mImageView = (ImageView) findViewById(R.id.iv_photo);// Set the Drawable displayedDrawable bitmap = getResources().getDrawable(R.drawable.wallpaper);mImageView.setImageDrawable(bitmap);// Attach a PhotoViewAttacher, which takes care of all of the zooming functionality.mAttacher = new PhotoViewAttacher(mImageView);
}// If you later call mImageView.setImageDrawable/setImageBitmap/setImageResource/etc then you just need to call
mAttacher.update();

具体用法参考PhotoView

ProgressWhell和LoadingFooter

原项目中这两个都是自定义的View,还借助了Titanic实现一些效果,在Material中都使用了ProgressBar代替(追求全面Material~~)

总结

还有一些其他的UI组件,我就不一一介绍了,毕竟学习这个项目的重点并不是关于UI的学习,项目的架构,网络数据的交换,缓存的设置才是主要要学习的地方。下面两篇文章将重点对这两个部分进行讲解。

开源项目9GAG源码解析与Material改造(一)相关推荐

  1. BT开源项目Snark源码分析

    BT开源项目Snark源码分析 Snark是国外一个开源Java的项目,实现了BitTorrent协议,通过分析此项目的源程序,可以更利于我们更加深入的了解当前流行的BT软件的原理,进而可以指导我们的 ...

  2. 今年我读了四个开源项目的源码,来分享下心得

    今年来看了 RocketMQ.Kafka.Dubbo .Tomcat 的源码,之前也有读者询问过如何读源码,索性就来分享一下. 其实还看了一点点 Linux.Redis.jdk8,这几个阅读的目的和上 ...

  3. 开源项目实例源码_今年我读了四个开源项目的源码,来分享下心得

    今年来看了 RocketMQ.Kafka.Dubbo .Tomcat 的源码,之前也有读者询问过如何读源码,索性就来分享一下. 其实还看了一点点 Linux.Redis.jdk8,这几个阅读的目的和上 ...

  4. 鸿蒙开源源码,基于鸿蒙系统开源项目OpenHarmony源码静态分析

    #ifndef __scc #define __scc(X) ((long) (X)) // 转为long类型 typedef long syscall_arg_t; #endif #define _ ...

  5. Go实现的5G核心网开源项目free5gc源码分析系列 | Gopher Daily (2021.01.08) ʕ◔ϖ◔ʔ

    每日一谚:"Abstractions should be discovered, not created." Go技术新闻 Go实现的5G核心网开源项目free5gc源码分析系列 ...

  6. 【机器人学】机器人开源项目KDL源码学习:(5)KDL如何求解几何雅克比矩阵

    这篇文章试图说清楚两件事:1. 几何雅克比矩阵的本质:2. KDL如何求解机械臂的几何雅克比矩阵. 一.几何雅克比矩阵的本质 机械臂的关节空间的速度可以映射到执行器末端在操作空间的速度,这种映射可以通 ...

  7. 开源项目Telegram源码 Telegram for Android Source

    背景介绍 Telegram 是一款跨平台的即时通信软件,它的客户端是自由及开放源代码软件.用户可以相互交换加密与自毁消息,发送照片.影片等所有类型文件.官方提供手机版.桌面版和网页版等多种平台客户端. ...

  8. 区块链开源项目Asch源码初探

    Asch这个名字是 App Side Chain 的缩写. 是一种基于区块链跨链技术的应用开发平台,目前全部核心代码已经在GitHub上开源. 区块链是比特币的底层技术,但是名气低于比特币,但是个人认 ...

  9. 基于‘纯洁的微笑’开源项目 — Favorites 源码分析

    引言: 对于某语言不算熟悉的话自创项目是很痛苦的过程,即便笔者是一位掌握java的Android码农,对于java入门也是深感无力,毕竟语言是基础,但框架设计模式却与Android有出入,且学习成本较 ...

  10. Python:渗透测试开源项目【源码值得精读】

    sql注入工具:sqlmap DNS安全监测:DNSRecon 暴力破解测试工具:patator XSS漏洞利用工具:XSSer Web服务器压力测试工具:HULK SSL安全扫描器:SSLyze 网 ...

最新文章

  1. 浅尝key-value数据库(三)——MongoDB的分布式
  2. python 返回函数对象_返回函数
  3. 参考例子,学习FuncT, TResult委托
  4. boost::local_time模块custom_time_zone 和 posix_time_zone 的简单示例
  5. 如何查看 Linux是32位还是64位?
  6. 【心路】谈谈最近的一些想法吧
  7. 【HDOJ】1720 A+B coming
  8. C# winfrom单击事件弹出浏览器
  9. 双击java安装包没反应_wps安装包双击没反应
  10. 4.23上海交大PMP试题每日一题
  11. 细说PHP(精要版)
  12. 如何进行邮件营销,邮件营销群发是否有效?
  13. unity渲染篇:画面亮度、饱和度、对比度调整
  14. 树莓派操控SG90舵机
  15. iTunes无法与iPhone正常连接的解决办法
  16. instandceof
  17. jzoj. 1285. 奶酪厂
  18. JS中判断NaN的方法
  19. Python项目对接CAS
  20. textView 的设置文本中某一文字的字体颜色以及图文混排

热门文章

  1. 一篇论文8778个作者:人均写5个字,署名用了17页
  2. 英语有哪些等级?公认CEFR等级是什么?C2到底是什么等级
  3. 新快报:十年聚焦,巨杉数据库打造中国基础软件的“原创力”
  4. AI综述专栏 | 多模态学习研究进展综述
  5. 一条SQL语句在MySQL中执行过程全解析
  6. word2016用尾注引用参考文献
  7. c#语言开发app,C#开发Android App--03--创建第一个app--Hello World
  8. 突发 | 工信部正式发放5G商用牌照 5G已来
  9. 5G牌照今日发放!!!
  10. 公司邮箱域名注册申请,域名邮箱如何解析?邮箱域名是什么?