关键字:Android Lollipop AppCompat Material Theme
本文作为读书笔记的总结性内容,起因是29日看到某社交网站谷歌的Matias Duarte分享一个链接,点进去发现是blogspot更新了,于是借此机会做一个总结,所以本文内容目前是基于19月28日信息,11月3日后根据更详细的信息进行进一步修正。
—-正文的分割线—– 本文描述基于Android 5.0 Lollipop的主题以及围绕新Material Design设计规范在交互与界面上的实现问题,并且是基于Support v7 AppCompat v21类库,其最主要的目的是将新特性与交互方式兼容到4.x版本。本文的参考主要来源于:
Android 开发者网站 Android Developer
Android 开发者博客 Android Developer blogspot
引用原文与细节将在引用位置提供链接或在结尾进行详细说明。
首先在官方 Maintaining Compatibility 的描述为使用Support v7 r21类库可以实现一些Material design style。其主要包含:
1、提供一个类似于5.0的Material design风格的界面。通过Theme.AppCompat主题实现。 2、调色板应用,Color Palette。体现在主题是可以根据给定的色彩统一渲染控件,达到界面显示效果统一。 3、提供RecyclerView,由于其内部实现了LayoutManager,所以可以实现更多变的布局与动画。 4、提供CardView,主要提供类似于Android 5.0的Z轴阴影效果,也表明卡片元素在新的设计规范中的重要性。 5、Palette,在代码中的效果就是通过Palette工具可是提取主题色用于界面动态渲染(这属于界面Material动画的关键,其后进行详细说明)。 Widget渲染
界面控件渲染截止到14年10月29日支持EditText、Spinner、CheckBox、RadioButton、SwitchCompat、CheckedTextView,通过实际测试可知依旧有许多控件未完全兼容,甚至包括Dialog依旧使用系统默认风格。同时Google Design网站关于设计的细节依旧没有明确的说明,其自家应用也是每个都一个样,文档也一直处于预览版状态,希望伴随着11月3日Android 5.0 的发布,相关文档与设计规范能够跟进。
对Android 5.0新特性的支持
对于Android 5.0非常令人兴奋的功能,也没有进行完整的兼容,如Touch feedback,scene transitions animation。控件方面,Floating Action Button也没有提供。根据开发者关系小组博客上的反馈信息,这些已经列上了日程,希望在Android 5.0正式发布后会进行支持。
接下来从代码角度说明对Material主题样式的兼容。首先和兼容Actionbar一样,依赖AppCompat v21项目并使所有Activity继承ActionBarActivity,使用Theme.AppCompat.xx一系列主题,即可在视觉上达到与Android 5.0相似的效果。
在 《AppCompat v21 – Material Design for Pre-Lollipop Devices!
View Animation(Tween Animation) View Animation(Tween Animation):补间动画,给出两个关键帧,通过一些算法将给定属性值在给定的时间内在两个关键帧间渐变。
View animation只能应用于View对象,而且只支持一部分属性,如支持缩放旋转而不支持背景颜色的改变。
而且对于View animation,它只是改变了View对象绘制的位置,而没有改变View对象本身,比如,你有一个Button,坐标 (100,100),Width:200,Height:50,而你有一个动画使其变为Width:100,Height:100,你会发现动画过程中触 发按钮点击的区域仍是(100,100)-(300,150)。
View Animation就是一系列View形状的变换,如大小的缩放,透明度的改变,位置的改变,动画的定义既可以用代码定义也可以用XML定义,当然,建议用XML定义。
可以给一个View同时设置多个动画,比如从透明至不透明的淡入效果,与从小到大的放大效果,这些动画可以同时进行,也可以在一个完成之后开始另一个。
用XML定义的动画放在/res/anim/文件夹内,XML文件的根元素可以 为,,,,interpolator 元素或(表示以上几个动画的集合,set可以嵌套)。默认情况下,所有动画是同时进行的,可以通过startOffset属性设置 各个动画的开始偏移(开始时间)来达到动画顺序播放的效果。
可以通过设置interpolator属性改变动画渐变的方式,如AccelerateInterpolator,开始时慢,然后逐渐加快。默认为AccelerateDecelerateInterpolator。
定义好动画的XML文件后,可以通过类似下面的代码对指定View应用动画。
ImageView spaceshipImage = (ImageView)findViewById(R.id.spaceshipImage);<br /> Animation hyperspaceJumpAnimation=AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);<br /> spaceshipImage.startAnimation(hyperspaceJumpAnimation);
Drawable Animation(Frame Animation) Drawable Animation(Frame Animation):帧动画,就像GIF图片,通过一系列Drawable依次显示来模拟动画的效果。在XML中的定义方式如下:
``
必须以为根元素,以表示要轮换显示的图片,duration属性表示各项显示的时间。XML文件要放在/res/drawable/目录下。示例:
protected void onCreate(Bundle savedInstanceState) {<br /> // TODO Auto-generated method stub<br /> super.onCreate(savedInstanceState);<br /> setContentView(R.layout.main);<br /> imageView = (ImageView) findViewById(R.id.imageView1);<br /> imageView.setBackgroundResource(R.drawable.drawable_anim);<br /> anim = (AnimationDrawable) imageView.
Drawable Resources即可绘制的资源,可以用作例如android:drawable、android:icon等属性的值。
根据Android Developer官网,Android一共支持以下几种Drawable Resources
Bitmap File
位图文件 (.png, .jpg, or .gif)。
Nine-Patch File
能够伸缩而不影响图片质量的一种png图片 (.9.png)。
Layer List
Drawable组,通过xml将一组Drawable整合起来,一层一层的分别绘制,最后一层会显示在最上面。
State List
与Layer List类似,可以把一组Drawable整合起来,但它还有更加高级的特性,可以根据所在UI控件的状态而显示不同的Drawable
Level List
同样是将一组Drawable整合起来,但Level List可以轮换显示
Transition Drawable
可以在两个Drawable之间进行切换
Inset Drawable
内嵌的Drawable,一般是让已有的Drawable在背景的一个特定位置显示时用
Clip Drawable
把已有的Drawable进行剪切生成的新的Drawable
Scale Drawable
把已有的Drawable进行拉伸生成的新的Drawable
Shape Drawable
图形Drawable,可以画出矩形,椭圆等等之类的图形
你是不是有时候忘了锁屏密码呢?或者想做什么邪恶的事吗?现在我来教你如何清除锁屏密码。
首先声明,这个方法并不是对所有手机Android都适用,本方法适用于满足以下条件的Android手机(满足任意一条即可):
1.手机已开启USB调试并且已经root
2.手机安装了第三方Recovery(官方的Recovery部分手机也可以)
对于第一种,我们将手机通过USB连接到电脑,电脑上要有Android SDK Tool,打开命令行工具,输入
adb root
adb shell
rm data/system/gesture.key
即可。
对于第二种,方法基本同上,但在rm之前可能要先执行
mount data
进行挂载
假如已经装了类似TWRP的Recovery,直接先点 advanced,然后点 file manager,找到 /data/system/ 下的 gesture.key ,点击它,然后在接下来的界面中,点“delete”按钮,开机就没有密码了!!
假如是设置的锁屏密码,开机还是有那种 九宫格 锁屏图案的,但是你随便 滑动 一个图案就可以进入桌面哦!!一起来试试看吧!
2015 年 5 月 28 日的携程网宕机事件,可以给同行提供什么经验和教训? http://www.zhihu.com/question/30749663 (分享自知乎网)
股票这么火,是谁在亏钱? http://www.zhihu.com/question/30663091 (分享自知乎网)
最近安装了一个WordPress主题,无意中惊奇地发现在有右边栏的情况下,底部有有右边栏相似的内容,这导致了页面非常难看而且内容重复。
经过研究,终于解决了这个问题
首先,在后台点击主题,然后点击编辑,在右侧找到footer.php,如果没有这个文件,那就到它的父模板中找,我的footer.php代码如下:
'footer', 'container_div' = 'div', //'nav' or 'div' 'container_class' = '', //class for or 'menu_class' = 'list-inline dividers', //class for 'walker' = new wp_bootstrap_navwalker(), 'fallback_cb' = '', 'echo' = false, // we'll output the menu later 'depth' = 1, ) ); // If not, default one } elseif ( $xsbf_theme_options['sample_footer_menu'] ) { $nav_menu = ' ' .__( 'Top', 'flat-bootstrap' ) .' ' .
任务定义和问题分析 此问题分为五个过程:
文件的读取和字符的统计。
这个是最简单的过程,读取文件,统计每个字符的出现次数。把这些数据统计在高度为1的二叉树中,每一个字符占用一棵树。这些所有树的集合构成一个树的列表(指针)。
哈夫曼树的创建。
哈夫曼树的创建也是比较简单的,因为在我们学习哈夫曼树定义的时候,就已经给出了哈夫曼树的创建过程,只要按照其过程就能比较好地创建出哈夫曼树了。
<p style="text-align: justify;"> <span style="font-size: 10pt;">具体过程为:<br /> </span> </p> <p style="text-align: justify;"> <span style="font-size: 10pt;">每次从已有的字符树列表中找出权值最小的两个二叉树,<br /> </span> </p> <p style="text-align: justify;"> <span style="font-size: 10pt;">把它们权值相加产生一个新的高度为1的二叉树,<br /> </span> </p> <p style="text-align: justify;"> <span style="font-size: 10pt;">把新二叉树的左孩子指向之前找到的权值最小的字符所在的二叉树,右孩子指向第二小的二叉树,<br /> </span> </p> <p style="text-align: justify;"> <span style="font-size: 10pt;">然后把新产生的二叉树加入到字符树列表中,<br /> </span> </p> <p style="text-align: justify;"> <span style="font-size: 10pt;">最后从字符树列表中删除之前找到的权值最小的两棵二叉树(指针)。<br /> </span> </p> <p style="text-align: justify;"> <span style="font-size: 10pt;">反复循环,直到字符树列表中只剩下一棵二叉树。<br /> </span> </p> <p style="text-align: justify;"> <span style="font-size: 10pt;">到此,哈夫曼树的创建完成。<br /> </span> </p> <p style="text-align: justify;"> </li> <li> <div style="text-align: justify;"> <span style="font-size: 10pt;">哈夫曼编码。<br /> </span> </div> <p style="text-align: justify;"> <span style="font-size: 10pt;">哈夫曼树创建完成后,哈夫曼编码也就很简单了。从树根开始,向左记为0,向右记为1,。这里涉及到之前所做过的实验──从根节点到叶子节点的路径。方法基本类似,通过遍历可以很方便地实现。<br /> </span> </p> <p style="text-align: justify;"> </li> <li> <div style="text-align: justify;"> <span style="font-size: 10pt;">文件压缩后的写入文件的方式。<br /> </span> </div> <p style="text-align: justify;"> <span style="font-size: 10pt;">经过哈夫曼编码的压缩后,一个字符可能由不到8位甚至只有1位的空间来存储。但是,目前大部分语言都没有以位为单位的数据类型。为了解决这个问题,我们需要把二进制字符串按一定长度切割并且转换为标准类型。我采用的是把二进制字符串以32字符的长度进行切割,并把它转换为unsigned long类型,最后如果不足32位,在前面补0然后再转为unsigned long类型。<br /> </span> </p> <p style="text-align: justify;"> <span style="font-size: 10pt;">文件要想能够解压,就必须要把哈夫曼编码表保存到文件,而且每个字符+编码的长度都要固定。<br /> </span> </p> <p style="text-align: justify;"> <span style="font-size: 10pt;">开始,我是采用的char + char[]的方式,发现这样比较浪费空间,如果要完全压缩二进制文件,char[]的长度可能需要256,耗费256 + 1个字节(256个char + 1个char),所以是相当废空间。<br /> </span> </p> <p style="text-align: justify;"> <span style="font-size: 10pt;">于是,我又想了一种相对更好的方法,就是把哈夫曼编码同样转换为unsigned long[],采用char + unsigned long[] + char的方式。后一个char是用来记录哈夫曼编码的长度,便于哈夫曼编码的再读取。这样,只消耗了32+2个字节(8个unsigned long + 2个char)。<br /> </span> </p> <p style="text-align: justify;"> </li> <li> <div style="text-align: justify;"> <span style="font-size: 10pt;">解压文件。<br /> </span> </div> <p style="text-align: justify;"> <span style="font-size: 10pt;">只要先读取哈夫曼编码表,再读取文件内容,把文件内容转换为二进制字符串,再遍历二进制字符串,在哈夫曼编码表中寻找,逐个替换,再写入文件即可。<br /> </span> </p> </li></ol> <h3> <span style="font-size: 12pt;">数据结构的选择和概要设计<br /> </span> </h3> <p> 为了方便哈夫曼树的创建和哈夫曼编码,特别设计二叉树结构为 </p> <div> <table style="border-collapse: collapse;" border="0"> <colgroup> <col style="width: 691px;" /></colgroup> <tr> <td style="padding-left: 9px; padding-right: 9px; border: solid 0.
多么痛的领悟!——我的2013拾遗总结 2013即将过去,回首走过的一年,是真学生时代终结的一年,是再次步入社会开启IT工作的一年,是从东北跨到南方第一次体会四季如春的一年,最重要的是彻底告别“光棍汉”准备年末见家长论婚事的一年…… 一路走来,有过顺畅、有过坎坷;有过喜悦、有过忧伤;有过领悟,有过彷徨…… 特将一年中最深刻、最痛彻的领悟总结如下,给自己以勉励,给大家以借鉴,给未来以回忆…… 一、技术方面 1、心稳了,思路才能准 做技术不免要耗时间、费脑力,加班是常有的事情。而长时间连续的加班会影响你的思考力。中午、下午晚饭后适当的休息,欣赏楼下风景或者围着楼群走一圈都是不错的选择。当遇到难题绞尽脑汁后仍然未得到满意的答案的时候,多换一种思路或方法去尝试或许会好些,别陷入单个思路思考的误区。 笔者的几个月的预研工作感触最深就是不要浮躁,哪怕问题再难研究,沉下心来,梳理一下以前的思路为什么不行,回溯到出问题的点,多问几个为什么更有利于定位问题所在。 心静了,思路才能开阔;心稳了,思路才能准! 这点,笔者养成的习惯之一:每天下班前写下日报,包含内容1)当天的工作内容;2)当天遇到的问题;3)第二天的工作计划。这样,晚上回去睡觉会很安心,第二天一早也能很快投入的工作中。 习惯之二:每天的早上10:00前一个多小时的时间,可以预想下今天工作可能的障碍,可以求助网络罗列出解决该障碍的思路1-3个,最后敲定思路。接下来的上午及下午时间会显得很充沛,只需要把不难的部分弄完,并攻克掉已定思路的难题就ok了。 2、欲速则不达 也是笔者预研工作初期,经理给定了一个方向。方向是他的分析认为可能正确的方向。当时的我考虑项目时间紧迫,猛劲就该思路进行研究。殊不知,一个月后等有了些积累后对该方向的正确性有了怀疑? 对这种新知识、新领域、方向性不确定的预研内容领悟之—— 第一,先花几天的时间熟悉该新的领域相关知识,读项目组内别人已经分析过的文档,参考该新知识的rfc相关文档,参考领域内大牛的blog等,对概念有所理解,基本做到胸有成竹。 第二,就大方向的正确性进行多几个视角的验证,待验证完毕后以文档(列举证据)的形式提供给经理确认后再去开展研究。 “学会停下来,才会加速”,说的也是这个道理。 3、碎时间,见差距 工作后发现,时间骤减。北上广深都有的通病吧,为了房租少些,住房离公司较远,每天在路上的时间都加起来1.5-2小时。这个时候大家的节奏就变为如下的循环:起床–坐早班车–上早班—中午吃饭&休息–下午班–下午饭—做晚班车回家—午夜休息–起床。异常情况还要加上:晚上加班—坐公交或地铁回家。周末的情况不加班或许能break掉循环,不过周一——周五还是要continue的。 把坐地铁或公交的时间当做碎时间(或暗时间)的话,每个周下来还是有不少的时间。告别常人都用的惯性思维——玩游戏,打盹等。我们可以通过思考技术、非技术的东西来积累自己,精力充沛的话,可以看书。哪怕一天只有几页,要坚信书会看完的。爱因斯坦教导我们“人的差距在于业余时间!”。不觉中,我们积累了自己的厚度,也慢慢会拉开和别人的差距。 笔者的blog的标题、小标题都基本上是通过碎时间思考,记录在手机上的。待到写博文时,有了线索会一气呵成!笔者利用碎时间读完了《Shell脚本攻略》以及《思考的乐趣》,再次读完了《鸟哥Linux私房菜》。当然虽然是零散的记忆,工作你会发现,快速锁定知识点,快速网上Google、Stackoverflow查询知识盲点所需解决方案的能力很重要! 4、写博客是责任的体现 写博一年来,渐渐觉得已经离不开博客。写博的初衷是一方面是知识的积累,另一方面是为了找工作。但是,时间久了,发现写博的好处非同凡响,自己梳理思路、收获知识的同时也能给别人带去帮助,并且是持久性的。为什么说是责任的体现呢?一旦你的思路、总结发表了blog,就需要接受大家的监督,大家发现错误你要及时纠正,大家提问问题你要及时回复。这种良性的互动无疑也是提升自我,更是赢得大家信任的好的方式,所以更深层次来讲,是责任的体现。 写好博客十分不容易!笔者认为,写博客从标题、内容、段落结构到结尾都要讲究! 第一:标题内容能真实反映内容,不做“标题党”哗众取宠、华而不实,也不要碎碎念,“屁大点事儿”也写上。 第二:技术的总结,就像给别人讲清楚一个概念,还是那句话“一个问题,如果你不能给别人讲明白,十有八九是你自己还没懂”,所以一定要自己非常明白,再理清思路,段落格式明细分好,这样的博客大家才会感觉很调理或至少不乱。当然,正如论坛所说“no
picture, you say a j8!”,有图有真相的经验分享大家会很喜欢。举例来说:Windows服务器或者Samba服务器的配置,有图你会看着很容易上手。而编程语言,要技术原理细节阐述和源码展示结合会更容易让大家理解。 第三:要及时回复别人对你博客提出的任何问题。这点,经常写博的人基本都能做到。因为,良性的互动才能建立起网络的互信。你对一篇博文非常有兴趣,想就技术细节与博主讨论下,但是近半年没有回复。这种非同步、大延时的沟通大家是接受不了的。 第四:开始写博后,就是一条不归路,不要间断!对自己是技术能力总结、方便查询与回顾;对别人是“授人以渔”,何乐而不为呢? 5、这样读技术书会更好 毕业前夕,看了《Think in C++》(partII)、《深入理解计算机系统》、IBM工程师的一本C++的书、《数学之美》、《浪潮之巅》、《李开复自传——世界因你而不同》。观摩了乔帮主生前的视频、雷军的小米1、小米2的发布会、老罗的锤子手机发布会等。 笔者认为,作为IT人士,对自己从事领域的书籍肯定要深入读,同时对于计算机行业新知识、新领域、新动态也要做必要的了解。我是基本优米网刚发布就注册的,余额宝发布当天就充值的,锤子手机老罗演讲最找一批通过留链接从官网索要视频观看的,雷军从没做小米就关注的。 对于纯技术的书籍,工作以后不允许大整块的时间消化书籍,如下的读书方式会更好些: 第一:略读,花不太长的时间过一遍书籍的章节大致的内容,了解下各个章节的结构; 第二:精读,就自己工作需要的知识或关心的细节深入研读,并进行标注; 第三:形成博文,对自己反复读了几次、网上求证后才弄清楚的概念进行分析,形成笔记,并在梳理后形成博文。为什么形成博文,是因为你的盲点也有可能是大家的盲点。 纯技术的书籍,有的时候一遍、二遍是读不明白的,也不要灰心,多读几遍加深理解,至少需要的时候更很快找到对应的章节。 对于技术相关的书籍,基本可以采取快速阅读浏览的形式就可以,必要的点可以网络求证或做笔记。 二、非技术方面 1、学校和社会的大不同 从社会到学校到再次回到社会,心中些许感概!从4年前工作过的小县城,到北上求学3年,到南下的大都市再工作。各种繁杂的经历,只能说“冷暖自知”吧! 小县城工作单位机构臃肿、人员懒散、工作节奏缓慢,使我选择继续求学。求学的唯一目的是能找个体面的工作,能找回自信的自我,能给家人争口气!所以,在学校,我非常珍惜度过的每一天,知道自由支配时间的难能可贵。再次回到社会,来到自己向往的繁华的大都市,才知道社会的复杂、工作的不易、生活的辛酸! 即便感觉第二次求学已经拼劲全力,每天起早贪黑很辛苦!相比于工作后的大城市的节奏、住房与公司两点一线的穿梭,工作的压力、项目的紧迫紧急程度、每天的日报、每周的工作汇报。想想还是学校舒坦、舒适、舒服! 又充分印证了那句话,“学校和社会的本质区别是:学校是生活,社会是生存!”。 2、厚积薄发,IT男也有“春”天 很高兴自己在求学临近毕业的日子,找到我的人生的另一伴!让我再次坚信:“IT男穷屌丝”也有春天。当我在嘲笑实验室35-36的老师找不到对象,还个性签名鲜亮的写着“追求卓越,幸运将不期而至!”的时候,没想到这份幸运降临到自己身上。 3年间几乎全部的时间和精力都放到学习、技术积累上,真是无暇问爱情的事。但我们IT人士要坚信,当你有了积累、有了知识的底蕴以后,你会变得相对成熟,你会变得优秀。一旦你优秀了,身上会散发出迷人的气质,你不去找也会有人来找你的! 3、健康是福 开复老师得癌症,给IT人士敲响警钟!一天平均至少10小时对着电脑,不经常运动、饮食不规律在IT人士身上普遍存在。 无独有偶,2013年11月份报道的年轻男士提升经理的第二天猝死,网络学历图片验证该男士正是我的校友,还是我一个师姐的老乡,不禁捏了一把汗!那连续两个周末,我去爬山了,没敢去上班。四个字“非常害怕”!。 所以,回头想想,为了自己的明天,为了家人。每周抽出时间适当的运动,哪怕不运动,适当的放松也是非常有益的! 4、时间、金钱、诚信 如果让你将“时间、金钱、诚信”排个次序的话,你会如何选择?我在学校和走入社会后,都会把诚信放在第一位的。我的信条“有了诚信,你可以充分你的时间去赚更多的钱!” 工作了要考虑近几年的结婚和买房,不免要存点积蓄,积累积蓄又和交租房、同事同学间的应酬矛盾,但当花则花,不要浪费是条宗旨!因为钱而伤了感情不好,但是因为感情好而不谈钱自己会吃亏。因为我们已经工作,我是坚信“工作了就只能给家人钱,不能给家人要一分钱,哪怕你失业了,因为你毕业了!”。 诚信的问题逐渐在现代人中缺失不能不说是一种悲哀!马云先生建立淘宝、支付宝的初衷就是相信未来的人们间的信任会更好。时下的现代人被喧杂的社会所侵蚀,我只能说他们变了,但至少我还会保存“那份真”! 5、勇于承担责任 《赢在中国之蓝天碧水间》的每一期看下来,总结如下“真诚、不装,勇于承担责任,痛定思痛的绝地反击!”。毕业了,马上奔30的人了,对自己要有责任,对父母要有沉甸甸的孝敬的责任,对妹妹的付出也到了回报负责的时候,对未来媳妇更是要百分百负责。这是所有男士必备的,IT男也不例外! 6、相信未来 不管怎么样,还是要相信未来。也是马云的教导“今天很残酷、明天很残酷,但后天很美好,很多人死在明天晚上,看不到后天初升的太阳!”。所以,要活过明天,看到后天的美好! 工作的时候,会有压力,因为知识储备的不充分、业务不熟悉、经验不充分等会走弯路,但这些不应该成为前进道路上的“绊脚石”,而是撑起你“站得更高、看得更远”的基石!想到我们的工作能给用户带来方便、给客户提升价值、间接地推动了社会的发展,我们IT人还是很伟大的! 三、结语 写到这,今年的年终总结也接近尾声。我自己是信心满满,我也这么鼓励着我的媳妇,不知道你的感觉是什么? 写下奋斗不如付诸行动,未来就在前方!收拾行囊,信心百倍的征战充满挑战的2014吧! 2013-12-21 10:00——15:19终稿于家中床前,十余次更改稿件,终于定稿!