一路追梦想

热爱技术,更热爱生活


  • 首页

  • 关于

  • 标签

  • 归档

RecyclerView with header and footer

发表于 2015-11-06 | 分类于 Android

最近在实现图1这个设置页面的时候,第一眼看到设计稿的时候只是想着普通的LinearLayout加一些常见的ui控件就足够了,但是细想一下觉得这样布局里面重复的代码太多,而且后面要是再多添加几项设置或者删除某项设置,改动也挺大的,想着用RecyclerView带上header合footer实现起来更加合理,于是就使用RecyclerView实现了。

在用带header和footer的RecyclerView实现之前必须先确定好header和footer的布局,我是这样分类header和footer的,见图:

之所以把记录提醒也算到header里面而不是普通的一个item里面是因为记录提醒这个设置项点击开启之后,会在其下方出来一个提示时间的显示和修改的布局,当然这并不是说不能把记录提醒当做一个item处理,完全可以的,我只是偷点懒而已

那么选择好header和footer之后,接下来就是编程实现了,这里主要是适配器的代码来控制header,item和footer,所以只贴出适配器的代码,其他在activity为RecyclerView设置LayoutManager和适配器这部分代码都很简单了,适配器代码如下,部分地方已标注:

阅读全文 »

Android实现涟漪动画

发表于 2015-09-28 | 分类于 Android

需求

因为开发launcher的桌面启动动画的时候,根据设计师的要求,需要实现一个涟漪的效果,具体效果如下:

然后动画的具体细节要求是这样的:

阅读全文 »

来杭半年

发表于 2015-09-27 | 分类于 Twitter

时间总是过的挺快,转眼间离上次写这篇博客(来杭一个月)已经又过去了五个月,我来杭州也半年了

六个月,说长也长,说不长也不长,但是多多少少都会有一些心里上的变化,也就是人们常说的所谓成长吧。

作为一名程序员,我不擅长煽情,也不喜欢煽情,只是想简单的记录一下自己生活和心理上的变化,留着以后回头观望

阅读全文 »

ImageView.getWidth返回0的问题

发表于 2015-08-09 | 分类于 Android

我们在为Android的ImageView控件添加动画或者根据屏幕宽高进行动态调整图片的宽高的时候,经常会用到ImageView.getWidth()来获取图片的宽高,然而遗憾的是:很多时候ImageView.getWidth()得到的结果都是0

Android View的绘制流程

基本的绘制流程大体上分为如下三个阶段:

1
onMeasure()-onLayout()-onDraw()

关于三个阶段的具体细节网上有很多讲解,简单来说:onMeasure()阶段做的主要工作就是根据父视图计算View的宽高,onLayout()阶段就是根据onMeasure()阶段计算出来的宽高,对View进行布局的摆放,根据父视图确定View的位置,onDraw()顾名思义就是在准备工作都完成,计算好宽高和位置之后进行开始真正的视图绘制工作了,一般是创建一个Canvas画布,然后在其上面draw真正的view视图,当onDraw完成之后,我们就看到了显示到手机上的各个View控件。

ImageView.getWidth()返回0的原因

view还没有完成onMeasure或者onLayout

很多时候我们在onCreate或者onResume方法内调用ImageView.getWidth()的时候,由于布局视图太复杂,特别是View的宽高是相对值的时候(比如wrap_content或者match_parent),视图的onMeasure()和onLayout()方法并没有真正完成,也就是说并没有计算出视图的宽高,所以这个时候调用ImageView.getWidth()肯定会返回0

view从GONE状态到Visibilty还在渲染过程中

还有就是我们如果调用View.setViewbility(View.GONE)方法,那么View的宽和高也会再次被设置为0,那么通过setVisibility(View.Visibility)之后立即调通ImageView.getWidth(),也会返回0,因为setVisibility之后,控件要重新计算大小进行绘制,在计算大小完成之前调用getWidth()一样会返回0。

##解决办法

附上测试的几个回调方法的执行流程

1
2
3
Activity.oncreate()→Activity.onResume()→TestImageView.onMeasure()
→TestImageView.onLayout()→onGlobalLayoutListener()
→Activity.onWidnowFocusChanged()→...→TextImageView.onDraw()

省略的…部分可能会重复调用onMeasure-onLayout-onGlobalLayoutListener

Activity进入和退出时动画的一致性

发表于 2015-07-09 | 分类于 Android

今天把开发好的产品拿给设计师看,设计师说打开设置菜单的动画在不同的手机上表现不同,有的手机上是从中间展开的,有的手机是从右边出来的,有的手机上压根没有动画,说让最好统一成从右边出来的,那么既然启动设置activity的时候从右边出来,退出设置的时候应该也是从右边消失,这样才能保证动画的一致性。

都知道activity切换动画是通过overridePendingTransition(int enterAnim, int exitAnim)来实现的,重写这个方法然后传递进入和退出动画就可以实现activity启动时候的切换动画了。那假如我们现在是要在activity1启动activity2的时候加入切换动画,要求activity2从右边出现,那么就是在activity1调用startactivity之后和activity2调用finish之后分别调用overridePendingTransition然后传入两个进出动画就好了,如下图所示:


阅读全文 »

命令行编译Android应用

发表于 2015-07-08 | 分类于 Android

现在Android开发基本都是使用Android studio,Google不久前也宣布不再支持Eclipse了,所以熟悉使用Android studio的常用功能还是很有必要的。

我们知道Android应用通过gradle构建系统编译出来默认有两种模式:一种是debug模式,一种是最终的release模式,通常debug模式都是用在测试的时候,我们发布应用的时候都是使用release模式编译出正式的apk,然后签名发布
事实上无论使用哪种模式编译你的Android应用,在安装到设备或者模拟器之前你都需要先签名,debug模式有debug key,release模式有你自己私有的key。

大家都知道,通过AS编译我们的应用模块的时候,会生成可以安装到手机上的.apk文件,当在我们使用debug模式编译的时候,sdk tool会带一个debug key根据你在build.gradle文件中的debuggable true的设置自动给应用签名,但是你不能发布一个使用debug key签名的应用,当你使用release编译类型编译出一个未签名的apk文件时,你必须用你的私有key手动给它签名,可以使用模块的build.gradle文件中的Keytool和Jarsigner,下面就讲讲怎么在命令行中通过release模式编译出一个未签名的apk,然后手动签名的过程(下文讲解都是基于mac环境)。

阅读全文 »

Android定时任务Timer失效?

发表于 2015-05-22 | 分类于 Android

Android上定时任务这个需求肯定是经常有的,之前一遇到定时任务,就首选Timer,也没觉得有什么不好的。
后来有一次我测试的时候无意间把系统时间往前调(系统时间调早一点)了一些,发现定时任务的打印停止了,觉得很好奇,以为是进程被干掉了,也就没有在意,又重启了一下应用进程,但是后来再一次出现了这样的事,于是就不淡定了,然后就看了一下Android官方网站上关于Timer的说明,又顺便Google了一下,发现原来是这样的:

在Timer定时器中是以System.currentTimeMillis()来获取当前时间,然后和TimerTask任务下次要执行的时间进行比较,如果时间到了就执行下一次重复任务,比如我用Timer设定的是每隔1s执行一次定时任务,如果你把时间往前调了1个小时,那么Timer定时器在准备执行下次任务的时候获取到的当前时间就比定时器的间隔时间1s大了很多,这样定时器就会等到1个小时零1s才会执行下一次的定时任务,如果你将时间往后调肯定不所以这就是为什么时间往前调Timer定时器会”失效”而往后调不会”失效”的原因

阅读全文 »

反编译odex文件

发表于 2015-05-21 | 分类于 Android

今天使用某加密加密应用之后,发现应用安装之后在/data/data/package/目录下有一个xxx(apk名).dex文件,好奇想看看加密之后到底什么效果,是不是还可以看到源码之类的,就把这个xxx.dex文件通过adb pull到本地了。
接着就想用dex2jar工具转换成jar文件,发现居然报错了:

1
2
3
com.googlecode.dex2jar.DexException: dex-translator not
support translate an odex file, please refere smali
http://code.google.com/p/smali/ to convert odex to dex

错误信息很明了,虽然这个文件后缀是.dex,但是这是一个odex文件,dex2jar工具不支持转换,需要先将odex转换成dex文件才行

根据提示到http://code.google.com/p/smali/下载对应的工具,以下是反编译odex文件的步骤:

阅读全文 »

来杭一个月

发表于 2015-04-26 | 分类于 Twitter

一个月前,深圳机场,匆忙地和基友gzh告别之后踏上了深圳飞往杭州的飞机,等待自己的是新的工作,新的生活,新的一切。一个月后,沈阳机场,还是匆忙地基友gzh告别之后踏上返回杭州的飞机,继续自己的杭州生活。除了地点不同,心中大部分感觉是相同的,有些时候想想,很多东西都蛮戏剧化的

登上飞机之后,闲来无事,就打开电脑打算完成这篇自己承诺来杭州一个月的时候写一篇关于感受和体会的博客
认真地说,来杭州整一个月的时间应该是4月24号,也就是前天,本打算前天夜里完成这篇博客,但是因为当天加班回去有点晚,而且第二天也就是昨天早上要赶早上10点的飞机到沈阳参加一位大学好友的婚礼,于是就打算在今天返回杭州的飞机上完成这篇博客

阅读全文 »

Resources Shrinking in Android

发表于 2015-04-02 | 分类于 Android

Android Gradle构建系统支持Resource Shrinking一种在构建的时候自动删除打包的APP中无用的资源的规则。其最大的优点是它不仅仅自动可以删除你自己代码中的无用资源,而且还可以删除你为了增强你自己APP的一些功能而使用的外部jar包中你的APP没有用到的资源,大家在开发自己的APP的过程中可以试试,下面讲讲怎么使用

自动Resource Shrinking功能默认是关闭的,要打开这个功能,需要在你的buildType中添加shrinkResources true,需要特别注意的是:这个功能依赖于代码削减,所以需要先打开minifyEnabled,整体代码如下:

1
2
3
4
5
6
7
8
9
android {
...
buildTypes {
release {
minifyEnabled true
shrinkResources true
}
}
}

1234…7
picksomething

picksomething

专注Android,Java,RN,Python

65 日志
17 分类
148 标签
RSS
© 2018 PICKSOMETHING
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4