既然是被举爆wwWqdaily因为单身的缘故故,那被用的qdailycom是什么进口

都说动图是年轻人的东西,你知道它马上奔四了吗_自媒体_科技头条_砍柴网
都说动图是年轻人的东西,你知道它马上奔四了吗
/ 好奇心日报 /
无论是用视频仿造GIF效果,还是用短视频来替代GIF,都是科技公司在对用户的选择妥协。到今天,已经没什么人在意GIF的文件格式,大家在意的,只是一个会在屏幕上循环播放的...
本文来自《好奇心日报》,更多好文章请在各大应用商店搜索 &好奇心日报&。
&解放!烧光所有GIF图!为了软件专利改革,湾区网页开发者大游行!&
&时间到了,应该烧光所有GIF!&
下午5点,在离旧金山市区30公里外的布里斯班市,一群由编程自由联盟组织起来的开发者们聚集在了Unisys公司门口,举起了自制的横幅,喊起了&烧光所有GIF&的口号。
Unisys是GIF的专利持有方。虽然说GIF不可能真正&焚烧&,但这群硅谷开发者想表达的是怒火&&GIF这种被大量使用的图片格式,要交专利费简直不可理喻。
不过今年9月初,在iPhone的iMessage表情商店全面支持GIF的时候,恐怕也没考虑这些人的感受。
因为那已经是17年前的事情了。可能很少有人想过,GIF动图这种有浓厚互联网文化的玩意儿,已经要迈入第30个年头了。
GIF诞生的时候,世界是什么样的?
在GIF诞生的1987年,互联网没诞生,个人电脑也远未普及。
那时候,扎克伯格才3岁,Google的两位创始人拉里&佩奇和谢尔盖&布林还是初中生,也还在杭州师范学院外语系读大三。唯一已经成名的是比尔&盖茨,把Windows操作系统做进IBM个人电脑的32岁盖茨,刚刚带领微软上市一年,他本人也成为了亿万富翁。
1986年,马云还没开始,在大学里排练着话剧
而GIF一开始是不会动的。
1987年,GIF(是图像互换格式,Graphics Interchange Format的缩写)由美国的CompuServe开发出来了。他们基于LZW算法做成的GIF,可以将两个不同颜色像素压缩在一起,将图片无损压缩到更小的体积。
1989年,CompuServe开发了一个新的GIF 89版本,图才能动起来。不过,GIF早期的重点还是在压缩算法,会动,只是副产品。
从压缩技术来说, GIF已经是当时最好最通用的了,而网络环境和硬件设备受限,更是帮了它一把。
1990年,互联网的上传速度最快不超过1kbps。在那个时候要想远程传输一张1 MB左右大小的图片需要花将近1小时,在那时候,在互联网上传播巨大的视频文件是不可想象的事情。
那也是一个储存空间金贵的时期。1989年西部数据的20 MB硬盘,就已经要卖到899美元。尽管这个容量的硬盘,现在只够放4张iPhone拍摄的照片。
但GIF呢?文件体积小,无损压缩图像,不需要添加额外的代码和插件就能使用,因为会动还能部分替代短视频的效果,而且免费。
这也难怪,在互联网出现的初期GIF特别受欢迎。到1993年,GIF成了第一个大规模使用的互联网产品,Netscape公司的Mosaic浏览器的首选图片格式。
互联网上发布的第一张图片,也是GIF格式的:
互联网上第一张图片,原图为GIF格式
早期的GIF动图代表作,都是因为魔性十足而传播甚广:
上面这张婴儿跳舞图是互联网上第一张病毒式传播的GIF。1996年网页开发者Woodell从一段热门视频片段里截取出来了3D的婴儿模型跳舞。
做完之后,他觉得这个GIF让人看得停不下来,于是他把这个GIF邮件发给了家人和朋友,很快这张图片就在互联网上疯传了。
另外这张&香蕉/腌黄瓜/胡萝卜&跳舞图,也是因为这种&看着停不下来&的循环动图效果而成了90年代最红的GIF之一。
单是作为一种图像格式,GIF在1990年代末就过时了
但GIF很快就惹得满身争议。
1994年,GIF的开发商CompuServe公司妥协了。因为另外一家计算机技术公司Unisys声称,GIF的压缩算法LZW里面,他们拥有W的部分,也就是三分之一,所以GIF的利益他们应该分一杯羹。
12月29日,这两个公司联合发布声明,每个给GIF制作软件或者编辑GIF的公司,都应该给专利拥有方Unisys公司付费。Unisys公司当时还想向把GIF图片用于用途的人都收费一次。
技术圈的开发者们炸了。于是就有了文章开始时候的一幕。在日,反对GIF的线上活动发展成了一场游行示威。
一张&烧光所有GIF&的GIF,够不够讽刺(微笑)
而PNG,就是当时专门为了取代GIF而开发出来的新图片格式。
就从技术上来说,除了照片常用的JPEG之外,1994年诞生的PNG比GIF好太多了:同样是无损压缩,出来的图比GIF要小;GIF只支持256色,PNG除了256色之外,还支持24 Bit真彩色;GIF在深色背景当中还会有白色锯齿,而PNG完全支持半透明像素的处理,不会出现锯齿毛边。
感受一下,左边是PNG,右边是同一张图片,透明背景的GIF。
PNG唯一没有做的就是动图功能。因为当时PNG的设计者们认为,跟GIF一样的会动的图片,是一种过时的展现方式。
也许更重要的是,1997年后互联网网速越来越快了。
到2000年之后,不用再占用电话线路的有线宽带极高地提高了网速,也让人们不那么在乎图片文件大小的事情了。
互联网用户对网速和流量不那么敏感,对更高清、颜色更丰富的图片,甚至是视频的需求,让GIF这种图像格式看起来没有什么存在的必要了。
GIF最大的特点动态图上也有了替代品,它就是1996年诞生的Flash。
Flash是Adobe公司开发的动画制作工具和播放器,可以嵌入到浏览器里面播放比GIF更流畅、高清、颜色丰富的动画,而且动画短片的时间还可以随意延长。
经过几个版本的迭代,Flash做动画成了一种能够赚钱的职业,那些Flash动画作者还有个专门的称呼叫&闪客&。
在美国,GIF就转而在4Chan或者Reddit这种互联网论坛活跃,成了给文字帖子增添有趣的效果的小众文化产品。
靠着QQ,GIF在中国又火了起来
在2004年,腾讯推出了QQ2003 III Beta4版本,它开始支持&自定义表情&的功能,用户可以把GIF格式的动态表情保存到本地,然后在QQ中转发给别人。
QQ2003 III Beta4屏幕截图,当时添加单个GIF已经很方便了。
腾讯的改变不只是因为看到用户个性化表达的需求而已。2004年,持续了20年的GIF软件版权到期了。GIF又可以重新免费被使用了。
就这样,这一个不太起眼的小功能,后来成了表情产业的入口。
第一批尝鲜并且红起来的,就是那些原来做Flash动画的人们。
王卯卯就是其中一个。2006年,她画兔斯基的时候,正是一个动画专业的大学生。
&11月的时候,自己觉得QQ当时已有的表情不够表达自己的情绪,于是就开始做了第一个表情&&就是两个手上下颤,左右晃的那个 得意 的表情。&王卯卯告诉《好奇心日报(www.qdaily.com)》。
她把这只兔子做成了QQ自定义表情,发给了同学玩。
第一个兔斯基表情,这种抖动的舞蹈能让人盯着看很久。
一周之后,王卯卯的表哥给她转发了一只兔斯基,说还挺像她的风格的,结果她一看,原来就是自己做的表情。
王卯卯这才意识到,兔斯基可能比她想象中更受欢迎。
就在诞生的一年间,这只兔子不仅成了QQ最红的表情,进驻了微软的聊天工具MSN,还成了摩托罗拉新的代言形象。
兔斯基在2008年代言摩托罗拉的G8手机
因为QQ自定义表情能火这件事情,也让很多原来做动画的人们加入了创作大军。
2010年,马里奥小黄画的&小幺鸡& GIF在QQ群里红了起来。这一只褐色的小鸡,表情有点贱,但重点是动作妖娆。
跟兔斯基一样,小幺鸡在QQ里红起来的方式,也都是通过口碑传播。
&我有几个QQ号,加在不同的QQ群里,当时看到很多人都在转发我们的表情,那个时候我就感觉小幺鸡火了。&
这是小幺鸡跳钢管舞的GIF,是小幺鸡系列里最受欢迎的一个表情之一。马里奥小黄告诉《好奇心日报(www.qdaily.com)》,她画这个表情画了一个多月。
在QQ最流行的那几年,如何在重装电脑之后恢复QQ文件夹的自定义表情,成了关于QQ这个软件最热门的问题之一。
智能手机时代,最大的竞争对手Flash也失败了
GIF在网站和即时通讯软件重新兴起的另外一面是,本来可能是重要竞争对手的Flash在手机上失败了。
2007年iPhone第一代就没有支持Flash,当时还惹来不少吐槽。背后的原因有不少:Flash是一个更针对于鼠标操作的软件,在手机的小屏幕上使用鼠标式的交互并不合适;而Flash运行时还会耗费大量的电量,还有导致发热,对于早期续航时间短,硬件配置并不高的智能手机来说并不友好。
Android系统对于Flash的支持,也只持续到了2012年就终止了。
乔布斯还专门写了一封公开信,讲为什么在移动时代苹果不再使用Flash:
Flash是PC时代,为了个人鼠标和PC创造出来的产品。Flash也是Adobe公司很成功的业务,我们能理解他们想把Flash推广到PC之外领域的希望。但是,移动时代是一个关于低功能设备、触摸屏和开放网络标准的时代&&这些所有都是Flash的短处。
对于GIF来说,移动互联网时代,仿佛又回到他们最初兴起的PC互联网:有限的移动互联网带宽,有限性能的硬件设备,缺乏一个通用的动态图片的标准。
人们对于移动互联网速度和流量的敏感,也一直持续至今。在移动网络下,不少人还是不会随意点开视频,而短视频的产品,也是最近一两年才有的事情&&伴随着网络速度提升和运营商流量资费下调。
而年代久远的GIF,又派上了用场。
微博、和GIF流行文化
小幺鸡红起来的2010年,新浪微博刚刚进入大众的视野,微博客社交网站,成为了中国最新潮的玩意儿。
对比起QQ这种半封闭的沟信息传播模式,微博用户发的消息都是广播式的,这也让有趣的动态图片有更快速传播的土壤。
对于小幺鸡来说,更重要的是2010年他们被微博官方定为默认表情之一。微博给了他们一个很不错的推荐位&&每个微博用户内容发布框。
同一时期成为默认表情的,还有小鸟彼尔德、小黑猫罗小黑等等。
小幺鸡这样的表情作者,也逐渐有了盈利的机会。一些商家会主动利用微博找上门来,要求授权表情,比如小幺鸡授权的小幺鸡大合体、塔防萌主等。
但因为微博的公开性质,另一种更加&野生&的GIF内容也开始病毒式传播。他们并不像兔斯基和小幺鸡那样,是制作一个固定的形象。
这些新兴的动图内容,一般都是从电视剧、电影以及综艺节目里片段压制而成。
微博账号&爆笑GIF图&就是其中一个。它背后的慕容继承告诉《好奇心日报(www.qdaily.com)》,从2011年开始,他就扒不同视频和外国网站的搞笑GIF图传播。
这个微博账号现在已经拥有382万粉丝,每天发十几条GIF动图,现在还有一些国外的搞笑视频。
&萌、意外、逗比或傻缺&是在他看来是一个能做出会火的GIF图的选材标准。
爆笑GIF图制作的猫狗大战动态GIF
像慕容继承这样抓视频压制做出来的GIF,也被称为&野生表情&。他们制作难度不高,影视剧明星、猫狗视频成了最大的素材来源。
从电影《旺角卡门》截取出来的张学友表情包&吃屎啦你&就是其中之一,尽管GIF里张学友表情有点恶俗,但是张学友很接受这种让他在互联网上又火了一把的动图。
张学友在发布会上抱着的,就是他自己的GIF表情的抱枕
这一趋势一直延续到微信时代。GIF成了&表情&这个大分类的一部分。
早期微信在自定义表情上并没有大力推进,只是在应用上线的同年11月开放了自定义表情的功能,跟QQ类似,用户要在手机相册里选择图片插入自定义表情栏,不过微信对这些自定义表情的数量和图片限制不少。
所以不少的动图创作者选择了微信公众号。从微博时代过来的&爆笑GIF图&、小幺鸡等作者,也在2012年转移到微信公众号上了。
2013年8月,微信才在它的5.0版本中又推出了表情商店。只是早期的投稿平台和表情商店对个人表情创作者的激励并不大。
&因为当时那种投稿方式太麻烦了,很多人都不知道有投稿的网页,而且上传很麻烦,上传之后无法追踪后续进展,那感觉有点像投简历一样,投过去就石沉大海了。&脏小白告诉《好奇心日报(www.qdaily.com)》。
他是&小崽子&表情包的作者,2013年开始在微信平台上制作表情包,大部分的表情都是静态图片,也有少量的GIF。
微信的做法其实来自于LINE。
因为LINE能用表情赚钱,连国外的公司也来参与了
日本的即时通讯应用LINE在2011年10月就添加了贴图功能,而付费贴纸逐渐成为了如今Line的一大重要收入来源。它的贴图业务收入在2015年获得的收入达到2.68亿美元,占去年总营收的23.9%。
除了贴纸,如今Line已经把它的表情角色包装成IP,制作动画短片,开线下主题商店。在国内你也许用不上Line,但LINE系列的周边和T恤还是很火。
甚至国外的科技公司也开始向GIF这种早应该被淘汰的格式妥协。
Facebook在2013年开始支持自动播放的视频时,也曾短暂内置支持过一段时间GIF图,但由于担心这类GIF图会影响到信息流里的新闻内容质量,它很快就取消了这项功能。
但到2014年,Facebook又重新开始支持GIF图,并在2015年5月,它已经全面开放支持。用户在状态栏或评论栏输入GIF的链接,发布后就能显示动图。而同样,Twitter也在2014年6月开放了对GIF图的支持。
尽管这些社交网站并不能从GIF中直接获得收入,但支持GIF能为它们黏住更多用户。
而专门做GIF搜索网站Giphy,在2015年C轮获得了5500万美元的融资,估值达3亿美元。到目前它仍然没有盈利,但由于每月6500万人使用它, Giphy获得了广告主和影视制作方的青睐。
GIF图在它们眼中成了一种不错的方式。2015年8月,环球影视就曾与它合作推出六款GIF图来宣传它的新电影《冲出康普顿》。
除了网站对GIF图的支持,一些输入法工具也开始默认GIF是交流必备。Google在今年发布的输入法Gboard中就直接添加了GIF部分,用户可以在输入法里直接搜索GIF图;有同样功能的还有8月刚发布的iOS版微软输入法。
左图为Google输入法Gboard ,右图为微软输入法:Word for flow
今年9月,苹果在最新的iOS 10里添加了iMessage的应用商店,表情贴图是商店里最重要的部分。
表情作者们可以像在Line和微信里那样向苹果提交表情。跟开发者一样,苹果和表情作者的分成比例是3:7。
它也吸引着国内的表情作者。
表情&罗罗布&的作者,加一就是其中一个。她毕业以后一直专职做独立动画作者,除了画些静态的漫画,她也画动态表情。而她的收入主要也是稿费或授权收入。
加一的GIF表情作品 罗罗布
iMessage平台上线商店以后,她也开始计划上苹果的iMessage平台上发布自己的表情作品。
毕竟苹果提供的7成分账还是很诱人的,&听说苹果的审核也会快一点&。朋友告诉她,苹果的审核时间只要两天,不过最近可能因为审核的人变多了,速度会稍微慢一点。但比起微信官方15天的审核速度这也算快的了。
但你熟悉的GIF,早已经不是GIF了
2010年,Google发布了WebM的视频文件格式,它能提供免费且高质量的压缩视频配合HTML 5使用,只不过,很多网站就用WebM这种视频格式,做出来GIF的效果。
图片分享网站Imgur就是其一。2014年推出GIFV,它本质上是一种文件拓展名,无论在哪个浏览器上,它都能表现得像GIF一样,不需要点播放键,图片一直循环播放,没有声音。
尽管,这种格式的&图片&下载以后会自动保存为mp4或WebM的视频格式。
不止Imgur ,在社交网站上也有类似模仿GIF。从2014年开始,Twitter在2014年允许用户上传GIF,但用户在上传之后,它会在上传的过程中被转化成MP4的格式,本质上,它成了视频文件,只不过比较小而已。
Skype在2015年在它的输入框里添加了Mojis,虽然它看起来很像GIF,但实际它是模仿GIF动态效果的视频片段;最近一家做动图分享的公司Gfycat,刚融到了1000万美元。在这个平台上用户可以分享自己制作的动图,它们看起来很像GIF动图,但却是一些很短,无声循环的动画和剪辑的视频。
无论是用视频仿造GIF效果,还是用短视频来替代GIF,都是科技公司在对用户的选择妥协。
到今天,已经没什么人在意GIF的文件格式,大家在意的,只是一个会在屏幕上循环播放的表现形式。
就像人们对GIF这个单词的读音选择一样。
GIF被大多数人念成&Gift&,牛津词典也这么标注。
GIF最初的设计师曾试图纠正这个发音,说这个词语正确读音是&JIF&。
但动图早已经超越了他们所发明的文件格式。
就像Andy Biao,众筹网站Kickstarter的创始成员在一篇文章里说的:&我们知道的动图GIF,是因为Netscape公司,还有整个互联网而红起来的,所以我要读成GIFT&&JIF是一种文件格式,而GIF是一种文化。&
【来源:好奇心日报】
1.砍柴网遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.砍柴网的原创文章,请转载时务必注明文章作者和"来源:砍柴网",不尊重原创的行为砍柴网或将追究责任;3.作者投稿可能会经砍柴网编辑修改或补充。
通过E-mail将您的想法和建议发给我们
稿件投诉:
版权建议:
砍柴网热线:400-
官方客服QQ:
微信公众号:ikanchai/ QDailyAndroid2
项目语言:JAVA
权限:read-only(如需更高权限请先加入项目)
QDailyAndroid2/
Index: QDConfigConstants.java
===================================================================
--- QDConfigConstants.java (revision 0)
+++ QDConfigConstants.java (revision 1)
@@ -0,0 +1,17 @@
+package com.qdaily.ui.
+
+/**
+ * 全局配置文件的key
+ * Created with IntelliJ IDEA.
+ * User: Felix
+ * Date: 4/14/15
+ * Time: 17:23
+ * QQ:74104
+ * Email:
+ */
+public class QDConfigConstants {
+
//保存个人用户信息的
+
public final static String KEY_USER_CENTER_ENTITY = &KEY_USER_CENTER_ENTITY&;
+
//是否启用推送消息
+
public final static String KEY_PUSH_MESSAGE_ENABLED = &KEY_PUSH_MESSAGE_ENABLED&;
+}
Index: Constants.java
===================================================================
--- Constants.java (revision 0)
+++ Constants.java (revision 1)
@@ -0,0 +1,146 @@
+package com.qdaily.ui.
+
+/**
+ * 各种烂七八糟的。
+ * Created with IntelliJ IDEA.
+ * User: Felix
+ * Date: 4/17/15
+ * Time: 17:27
+ * QQ:74104
+ * Email:
+ */
+public class Constants {
+
public static final String WEIBO = &http://m.weibo.cn/u/&;
+
public static final String TWITTER = &https://mobile.twitter.com/Qdailycom&;
+
public static final String RATE = &http://www.wandoujia.com/apps/com.qdaily.ui&;
+
public static final String ABOUT = &http://www.qdaily.com/webapp/homes/aboutus&;
+
+
* 文章列表显示策略1=小,2=大
+
* Created with IntelliJ IDEA.
+
* User: Felix
+
* Date: 4/14/15
+
* Time: 00:30
+
* QQ:74104
+
* Email:
+
public static class ArticleListImageDisplayType {
+
public final static int DISPLAY_IMAGE_SMALL = 1;
+
public final static int DISPLAY_IMAGE_BIG = 2;
+
* Created with IntelliJ IDEA.
+
* User: Felix
+
* Date: 4/10/15
+
* Time: 15:01
+
* QQ:74104
+
* Email:
+
public static class IGenreType {
+
public final static int NORMAL = 1;
+
+
public final static int COMBINATION = 2;
+
+
public final static int TOPICS = 3;
+
+
public final static int TALKING = 4;
+
+
public final static int DIGITAL = 5;
+
+
public final static int LINK = 6;
+
+
public final static int SPECIALCOLUMN = 7;
+
+
public final static int VIDEO = 8;
+
+
public final static int PODCAST = 9;
+
+
public final static int DESIGN = 10;
+
+
public final static int ADVERTISING = 11;
+
+
public final static int CARD = 12;
+
* 这个设计了不起
+
public final static int AMAZING_DESIGN = 13;
+
+
* 普通问卷
+
public final static int COMMONQUESTIONNAIRE = 1000;
+
+
* mob问卷
+
public final static int MOBQUESTIONNAIRE = 1001;
+
* 社交枚举
+
* Created with IntelliJ IDEA.
+
* User: Felix
+
* Date: 4/15/15
+
* Time: 16:12
+
* QQ:74104
+
* Email:
+
public static class SocialType {
+
public static final int SinaWeibo = 1;
+
public static final int QQ = 2;
+
public static final int Wechat = 3;
+
public static final int Twitter = 4;
+
+
public static int getSocialType(String type) {
+
if (type.equals(&SinaWeibo&)) {
+
return SinaW
+
} else if (type.equals(&QQ&)) {
+
return QQ;
+
} else if (type.equals(&Wechat&)) {
+
return W
+
} else if (type.equals(&Twitter&)) {
+
return T
+
} else {
+
return SinaW
+
}
+}
Index: FragPagerAdapter.java
===================================================================
--- FragPagerAdapter.java (revision 0)
+++ FragPagerAdapter.java (revision 1)
@@ -0,0 +1,47 @@
+ * Copyright (C) Beijing Decision Credit Technologies, Ltd
+ * ProjectName:WIKKaShen
+ * PackageName:com.woaika.kashen.common
+ * FileName:FragPagerAdapter.java
+package com.qdaily.ui.
+import android.support.v4.app.F
+import android.support.v4.app.FragmentM
+import android.support.v4.app.FragmentPagerA
+import com.qdaily.ui.QDBaseF
+ * Description: Fragment适配器
+ * Author: chencheng
+ * Date: 上午11:34:30
+ * Version:1.0
+public class FragPagerAdapter extends FragmentPagerAdapter {
private QDBaseFragment[] fragments =
public FragPagerAdapter(FragmentManager fm, QDBaseFragment[] fragments) {
super( fm );
if (fragments != null && fragments.length & 0) {
this.fragments =
throw new Exception( &this FragPagerAdapter Count must have & 0& );
} catch (Exception e) {
e.printStackTrace();
public Fragment getItem(int position) {
return fragments[ position ];
public int getCount() {
return fragments.
Index: MultiArticleModel.java
===================================================================
--- MultiArticleModel.java (revision 0)
+++ MultiArticleModel.java (revision 1)
@@ -0,0 +1,45 @@
+package com.qdaily.ui.
+import com.qdaily.ui.net.model.ArticleM
+import java.util.ArrayL
+import java.util.L
+ * 主页模板,两个小图或者一个大图。
+ * Created with IntelliJ IDEA.
+ * User: Felix
+ * Date: 4/30/15
+ * Time: 17:00
+ * QQ:74104
+ * Email:
+public class MultiArticleModel {
private ArticleMeta bigArticleMeta = new ArticleMeta();//一张大图。
private List&ArticleMeta& smallArticleMeta = new ArrayList&&();//两张小图。
private ArticleMeta amazingDesign = new ArticleMeta();//这个设计了不起。
public ArticleMeta getBigArticleMeta() {
return bigArticleM
public void setBigArticleMeta(ArticleMeta bigArticleMeta) {
this.bigArticleMeta = bigArticleM
public List&ArticleMeta& getSmallArticleMeta() {
return smallArticleM
public void setSmallArticleMeta(List&ArticleMeta& smallArticleMeta) {
this.smallArticleMeta = smallArticleM
public ArticleMeta getAmazingDesign() {
return amazingD
public void setAmazingDesign(ArticleMeta amazingDesign) {
this.amazingDesign = amazingD
Index: UserInformationManager.java
===================================================================
--- UserInformationManager.java (revision 0)
+++ UserInformationManager.java (revision 1)
@@ -0,0 +1,72 @@
+package com.qdaily.ui.
+
+import com.qdaily.supportlibrary.util.QDJsonU
+
+/**
+ * 用户行为管理者,其中包含读取缓存以及一些业务逻辑
+ * Created with IntelliJ IDEA.
+ * User: Felix
+ * Date: 4/16/15
+ * Time: 12:32
+ * QQ:74104
+ * Email:
+ */
+public class UserInformationManager {
+
private static UserInformationManager userInformationM
+
private UserInformation userI
+
+
public static UserInformationManager getInstance() {
+
if (userInformationManager == null) {
+
userInformationManager = new UserInformationManager();
+
return userInformationM
+
* 获取从本地缓存读取的用户信息。
+
* @return @see UserInformation
+
public UserInformation getUserInformation() {
+
if (userInformation == null) {
+
String json = QDConfigManager.getInstance().getString(QDConfigConstants.KEY_USER_CENTER_ENTITY, &&);
+
userInformation = QDJsonUtil.Json2Object(json, UserInformation.class);
+
} catch (Exception e) {
+
e.printStackTrace();
+
userInformation = new UserInformation();
+
return userI
+
* false = unlogin,true = login
+
* @return
+
public boolean isLogin() {
+
return getUserInformation().getCookie().length() & 0;
+
* 删除本地数据以及内存对象
+
public void removeUserInformation() {
+
QDConfigManager.getInstance().remove(QDConfigConstants.KEY_USER_CENTER_ENTITY);
+
userInformation =
+
* 网络回调解析的模板是UserCenterEntity。
+
* 需要翻译成本地的UserInformation。
+
* 然后转成json,QDJsonUtil.getJsonString(userInformation)再保存本地。
+
* @param userInformationJson
+
public boolean updateUserInformation(String userInformationJson) {
+
removeUserInformation();
+
return QDConfigManager.getInstance().saveString(QDConfigConstants.KEY_USER_CENTER_ENTITY, userInformationJson);
+
}
+
+}
Index: UserInformation.java
===================================================================
--- UserInformation.java (revision 0)
+++ UserInformation.java (revision 1)
@@ -0,0 +1,245 @@
+package com.qdaily.ui.
+import android.os.P
+import android.os.P
+import com.qdaily.ui.net.entity.UserCenterE
+ * 用戶行為,包含一系列關於用戶的信息。
+ * Created with IntelliJ IDEA.
+ * User: Felix
+ * Date: 4/3/15
+ * Time: 16:54
+ * QQ:74104
+ * Email:
+public class UserInformation implements Parcelable {
private String userIcon = &&;
private String userName = &&;
private String userDescription = &&;
private String userEmail = &&;
private int userPhone = 0;
private String cookie = &&;
private int userMessageCount = 0;//消息数量
private UserSocial userSocial = new UserSocial();
public String getUserIcon() {
return userI
public void setUserIcon(String userIcon) {
this.userIcon = userI
public String getUserName() {
return userN
public void setUserName(String userName) {
this.userName = userN
public String getUserDescription() {
return userD
public void setUserDescription(String userDescription) {
this.userDescription = userD
public String getUserEmail() {
return userE
public void setUserEmail(String userEmail) {
this.userEmail = userE
public int getUserPhone() {
return userP
public void setUserPhone(int userPhone) {
this.userPhone = userP
public int getUserMessageCount() {
return userMessageC
public void setUserMessageCount(int userMessageCount) {
this.userMessageCount = userMessageC
public UserSocial getUserSocial() {
return userS
public void setUserSocial(UserSocial userSocial) {
this.userSocial = userS
public String getCookie() {
public void setCookie(String cookie) {
this.cookie =
public int describeContents() {
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(this.userIcon);
dest.writeString(this.userName);
dest.writeString(this.userDescription);
dest.writeString(this.userEmail);
dest.writeInt(this.userPhone);
dest.writeString(this.cookie);
dest.writeInt(this.userMessageCount);
dest.writeParcelable(this.userSocial, 0);
public UserInformation() {
private UserInformation(Parcel in) {
this.userIcon = in.readString();
this.userName = in.readString();
this.userDescription = in.readString();
this.userEmail = in.readString();
this.userPhone = in.readInt();
this.cookie = in.readString();
this.userMessageCount = in.readInt();
this.userSocial = in.readParcelable(UserSocial.class.getClassLoader());
public static final Creator&UserInformation& CREATOR = new Creator&UserInformation&() {
public UserInformation createFromParcel(Parcel source) {
return new UserInformation(source);
public UserInformation[] newArray(int size) {
return new UserInformation[size];
* 用戶社交屬性
* Created with IntelliJ IDEA.
* User: Felix
* Date: 4/3/15
* Time: 17:07
* QQ:74104
public static class UserSocial implements Parcelable {
private boolean bindQQ =
private boolean bindWechat =
private boolean bindTwitter =
private boolean bindWeibo =
public boolean isBindQQ() {
return bindQQ;
public void setBindQQ(boolean bindQQ) {
this.bindQQ = bindQQ;
public boolean isBindWechat() {
return bindW
public void setBindWechat(boolean bindWechat) {
this.bindWechat = bindW
public boolean isBindTwitter() {
return bindT
public void setBindTwitter(boolean bindTwitter) {
this.bindTwitter = bindT
public boolean isBindWeibo() {
return bindW
public void setBindWeibo(boolean bindWeibo) {
this.bindWeibo = bindW
public String toString() {
return &UserSocial{& +
&bindQQ=& + bindQQ +
&, bindWechat=& + bindWechat +
&, bindTwitter=& + bindTwitter +
&, bindWeibo=& + bindWeibo +
'}';
public int describeContents() {
public void writeToParcel(Parcel dest, int flags) {
dest.writeByte(bindQQ ? (byte) 1 : (byte) 0);
dest.writeByte(bindWechat ? (byte) 1 : (byte) 0);
dest.writeByte(bindTwitter ? (byte) 1 : (byte) 0);
dest.writeByte(bindWeibo ? (byte) 1 : (byte) 0);
public UserSocial() {
private UserSocial(Parcel in) {
this.bindQQ = in.readByte() != 0;
this.bindWechat = in.readByte() != 0;
this.bindTwitter = in.readByte() != 0;
this.bindWeibo = in.readByte() != 0;
public static final Creator&UserSocial& CREATOR = new Creator&UserSocial&() {
public UserSocial createFromParcel(Parcel source) {
return new UserSocial(source);
public UserSocial[] newArray(int size) {
return new UserSocial[size];
* 服务器模板翻译成本地
* @param userCenterEntity
public UserInformation translation(UserCenterEntity userCenterEntity) {
//账户相关的才会返回cookie。
this.setCookie(userCenterEntity.getMeta().getCookie());
this.setUserDescription(userCenterEntity.getResponse().getDescription());
this.setUserEmail(userCenterEntity.getResponse().getEmail());
this.setUserIcon(userCenterEntity.getResponse().getFace());
this.setUserMessageCount(userCenterEntity.getResponse().getMessage());
this.setUserName(userCenterEntity.getResponse().getUsername());
this.setUserPhone(userCenterEntity.getResponse().getPhone());
this.getUserSocial().setBindQQ(userCenterEntity.getResponse().isQq());
this.getUserSocial().setBindTwitter(userCenterEntity.getResponse().isTwitter());
this.getUserSocial().setBindWechat(userCenterEntity.getResponse().isWechat());
this.getUserSocial().setBindWeibo(userCenterEntity.getResponse().isWeibo());
this.setUserSocial(getUserSocial());
Index: QDConfigManager.java
===================================================================
--- QDConfigManager.java (revision 0)
+++ QDConfigManager.java (revision 1)
@@ -0,0 +1,158 @@
+ * Copyright (C) Beijing Decision Credit Technologies, Ltd
+ * ProjectName:Kashen
+ * PackageName:com.woaika.kashen
+ * FileName:WIKCoreConfig.java
+package com.qdaily.ui.
+import android.content.C
+import android.content.SharedP
+import android.text.TextU
+ * @Description: 全局配置管理类
+ * @Author: Felix
+ * @Date: 日下午2:50:51
+ * @Version:1.0
+public class QDConfigManager {
private static final String TAG = &QDConfigManager&;
private static final String CONFIG_NAME = &qdaily&;
private static QDConfigM
private Context mC
* 标记是否是否显示过引导页面
public final static String KEY_HAS_SHOW_GUIDE = &KEY_HAS_SHOW_GUIDE&;
public static final boolean DEFAULT_KEY_HAS_SHOW_GUIDE =
private QDConfigManager() {
* @return the instance
public static QDConfigManager getInstance() {
if (instance == null) {
instance = new QDConfigManager();
* @param context
* @Description 初始化配置
public void initConfig(Context context) {
mContext =
SharedPreferences settings = mContext.getSharedPreferences(CONFIG_NAME,
SharedPreferences.Editor editor = settings.edit();
editor.commit();
public boolean saveString(String key, String value) {
if (TextUtils.isEmpty(key) || TextUtils.isEmpty(value)) {
SharedPreferences settings = mContext.getSharedPreferences(CONFIG_NAME,
SharedPreferences.Editor editor = settings.edit();
editor.putString(key, value);
return editor.commit();
public String getString(String key, String defaultValue) {
if (TextUtils.isEmpty(key)) {
return &&;
String value = &&;
SharedPreferences settings = mContext.getSharedPreferences(CONFIG_NAME,
value = settings.getString(key, defaultValue);
public boolean saveBoolean(String key, boolean value) {
if (TextUtils.isEmpty(key)) {
SharedPreferences settings = mContext.getSharedPreferences(CONFIG_NAME,
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean(key, value);
return editor.commit();
public boolean getBoolean(String key, boolean defaultValue) {
if (TextUtils.isEmpty(key)) {
SharedPreferences settings = mContext.getSharedPreferences(CONFIG_NAME,
return settings.getBoolean(key, defaultValue);
public boolean saveInt(String key, int value) {
if (TextUtils.isEmpty(key)) {
SharedPreferences settings = mContext.getSharedPreferences(CONFIG_NAME,
SharedPreferences.Editor editor = settings.edit();
editor.putInt(key, value);
return editor.commit();
public int getInt(String key, int defaultValue) {
if (TextUtils.isEmpty(key)) {
return -1;
SharedPreferences settings = mContext.getSharedPreferences(CONFIG_NAME,
return settings.getInt(key, defaultValue);
public boolean saveLong(String key, long value) {
if (TextUtils.isEmpty(key)) {
SharedPreferences settings = mContext.getSharedPreferences(CONFIG_NAME,
SharedPreferences.Editor editor = settings.edit();
editor.putLong(key, value);
return editor.commit();
public long getLong(String key, long defaultValue) {
if (TextUtils.isEmpty(key)) {
return -1;
SharedPreferences settings = mContext.getSharedPreferences(CONFIG_NAME,
return settings.getLong(key, defaultValue);
public void remove(String key) {
SharedPreferences settings = mContext.getSharedPreferences(CONFIG_NAME,
SharedPreferences.Editor editor = settings.edit();
editor.remove(key);
editor.commit();
public void removeAll() {
SharedPreferences settings = mContext.getSharedPreferences(CONFIG_NAME,
SharedPreferences.Editor editor = settings.edit();
editor.clear();
editor.commit();
(C)&&2013&&Alibaba&&Inc.&&All&&rights&&resvered.
Powered by}

我要回帖

更多关于 范勾娇缘故 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信