CircleIndicator

使用ViewPager的时候,经常需要一些小圆点作为指示器。现成的 Android-ViewPagerIndicator 太过庞大。 Nexus 5桌面(Google Now Launcher)的指示器效果就挺不错的,但我没有找到类似的项目,于是就写了个CircleIndicator可以自定义大小、形状和动画。感觉有这几点基本上就可以配置出各种不同的效果了。 兼容Android低版本,动画需要依赖NineOldAndroids。Gradledependencies { compile 'com.nineoldandroids:library:2.4.+' compile 'me.relex:circleindicator:1.0.0@aar' }…

Read this article

Android Underline

以为手机UI设计里一般不会碰到使用下划线的情况,但断断续续还是有不少使用下划线的情况。我是不太喜欢下划线的样式,以前搞前端时表现网页链接,也喜欢仅仅使用颜色区分。即使要使用下划线也避免用text-decoration:underline,而是使用border-bottom的绘制。为了还原设计稿上的下划线,在Android上要实现类似border-bottom的下划线其实也不是很复杂。首先得了解一下字体相关的知识,默认的下划线一般是绘制在Baseline下,为了调整下划线和字体的间距,决定将下划线绘制在Descender Line下。想了两套方案: 类似ImageSpan的形式:将要显示下划线的文字用图片绘制,同时绘制下划线,使用SpannableString替换TextView的文字。  优点:灵活使用,可以在任意TextView或EditText中使用。 缺点:不支持换行,文字不能编辑。文字转图片开销有点不划算。   自定义控件:在onDraw时绘制下划线。这种方式最简单啦,又能支持换行。(偷懒就让所有文字都显示下划线,要个别文字显示下划线还得查找字符测量宽度慢慢计算)。 具体代码参见 github,预览图:…

Read this article

keepattributes Signature

以前有一个问题非常让人困扰。应用开发测试的时候没有问题,打包apk后,经常莫名其妙的崩溃。检查log,发现抛出的错误如下:java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to me.relex.jsonparse.modle.ClassModle 根据log定位是使用jackson的ObjectMapper解析json时类型转换错误,只要一混淆就会崩溃…… 为了能尽快修复索性就不用ObjectMapper,改用Streaming解析。最近想起来这个问题,趴在地上找找资料,一定是proguard哪里没有设置。终于关键性的就是下面这个-keepattributes Signature 来自 gson proguard example的解释Gson uses generic type information stored in a class file when working with fields. Proguard removes such…

Read this article

Android 测量字符宽度的几种方法和场景

Android在测量计算字符的宽度有几种方法,稍微记录一下。详细见下面的代码。总结一下:measureTextWidth:用来测量普通文字的宽度,调用native层去测量。getTextBounds:会按严格按照Paint的样式,绘制出文字的边界(设置倾斜后,绘制的文字被截断,但仍然能得到倾斜后的实际宽度),同样也是native层去测量。Layout.desiredWidth:能测量包含Spanned的文字宽度,实际是调用TextLine的measure()计算。…

Read this article

自定义SwipeRefreshLayout

上次试用了一下v4包中新加入的SwipeRefreshLayout控件。虽然ActionBar-PullToRefresh没有强大,但后者使用实在太麻烦,与Actionbar耦合在一起,兼容性维护等等。于是有空就修改一下SwipeRefreshLayout,顺便看看控件源码什么的。猜想实际使用可能遇到的需求扩展一下。增加下拉的HeaderView,可以往里面放一些下拉彩蛋、广告什么的。调整下拉逻辑,下拉到100%后不立刻执行刷新,松手后才开始刷新。修正下拉悬停抖动……可以设置下拉时,子控件不跟随。(只有progressBar变化)增加OnPullDownListener,监听下拉高度变化Demo地址(注意需要切换到modify_swipe_refresh_layout分支)关于修正下拉悬停抖动源代码根据mTouchSlop的值来判断是否有滑动动作。mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();然后在onTouchEvent里前后两次滑动的差值与mTouchSlop判断,所以会忽略微小的滑动,导致下拉悬停抖动。 所以我就把mTouchSlop去掉了………

Read this article