Volley 源码解析

1. 功能介绍 1.1. Volley Volley 是 Google 推出的 Android 异步网络请求框架和图片加载框架。在 Google I/O 2013 大会上发布。 名字由来:a burst or emission of many things or a large amount at once 发布演讲时候的配图 从名字由来和配图中无数急促的火箭可以看出 Volley 的特点:特别适合数据量小,通信频繁的网络操作。(个人认为 Android 应用中绝大多数的网络操作都属于这种类型)。 1.2 Volley 的主要特点 (1). 扩展性强。Volley 中大多是基于接口的设计,可配置性强。 (2). 一定程度符合 Http 规范,包括返回 ResponseCode(2xx、3xx、4xx、5xx)的处理,请求头的处理,缓存机制的支持等。并支持重试及优先级定义。 (3). 默认 Android2.3 及以上基于 HttpURLConnection,2.3 以下基于 HttpClient 实现,这两者的区别及优劣在4.2.1 Volley中具体介绍。 (4). 提供简便的图片加载工具。 2. 总体设计 2.1. 总体设计图 上面是 Volley 的总体设计图,主要是通过两种Diapatch Thread不断从RequestQueue中取出请求,根据是否已缓存调用Cache或Network这两类数据获取接口之一,从内存缓存或是服务器取得请求的数据,然后交由ResponseDelivery去做结果分发及回调处理。 2.2. Volley 中的概念 简单介绍一些概念,在详细设计中会仔细介绍。 Volley 的调用比较简单,通过 newRequestQueue(…) 函数新建并启动一个请求队列RequestQueue后,只需要往这个RequestQueue不断 add Request 即可。 ...

2015年4月8日 · 7 分钟 · 天边的星星

几个安卓开发辅助工具

本文将介绍几个对安卓开发者有用的几个工具。 设计师/开发者工具 Android Button Maker 是一个产生按钮代码的在线工具。Android API提供了由xml定义的Drawable,可以定义形状、颜色、渐变等。基于这种方式生产的按钮要比普通的png按钮速度快很多。你可以在这个工具的设置界面中自定义按钮的属性,然后获取代码。 1427680999497361.png Android Pixel Calculator 帮助你搞清楚dp, px, sp, in, mm 和pt关系以及相互转换的工具。 1427681547132533.png 优化png图片的开源工具 OptiPNG 、PNGCrush 和TinyPNG 是几个用于优化PNG图片的开源命令行工具。你可以通过各种各样的算法来压缩png图片。如果你的app高度依赖于美工设计的图片,你应该考虑使用它们来减小图片的大小。 Android Asset Studio 一个基于web的安卓资源生成工具,可以生成图标、样式等资源文件。目前可以生成: Launcher 图标 Action bar and tab 图标 Notification 图标 Navigation drawer indicator 普通图标 OTHER GENERATORS — MISCELLANEOUS ASSET CREATION TOOLS 点9图片 Official Android Device Art Generator COMMUNITY TOOLS — SIMILAR TOOLS FROM THE OPEN SOURCE COMMUNITY Android Action Bar Style Generator by Jeff Gilfelt ...

2015年4月2日 · 1 分钟 · 天边的星星

Android性能调优

本文主要分享自己在appstore项目中的性能调优点,包括同步改异步、缓存、Layout优化、数据库优化、算法优化、延迟执行等。 性能优化专题已完成五部分: 性能优化总纲——性能问题及性能调优方式 性能优化第三篇——Java(Android)代码优化 性能优化第二篇——布局优化 性能优化第一篇——数据库性能优化 性能优化实例 一、性能瓶颈点 整个页面主要由6个Page的ViewPager,每个Page为一个GridView,GridView一屏大概显示4*4的item信息(本文最后有附图)。由于网络数据获取较多且随时需要保持页面内app下载进度及状态,所以出现以下性能问题 a. ViewPager左右滑动明显卡顿 b. GridView上下滚动明显卡顿 c. 其他Activity返回ViewPager Activity较慢 d. 网络获取到展现速度较慢 ** 二、性能调试及定位** 主要使用Traceview、monkey、monkey runner调试,traceview类似java web调优的visualvm,使用方法如下: 在需要调优的activity onCreate函数中添加 1 <td class="crayon-code"> <div class="crayon-pre"> <div id="crayon-551b51a07ef3f771207698-1" class="crayon-line"> <span class="crayon-v">android</span><span class="crayon-sy">.</span><span class="crayon-v">os</span><span class="crayon-sy">.</span><span class="crayon-v">debug</span><span class="crayon-sy">.</span><span class="crayon-e">startMethodTracing</span><span class="crayon-sy">(</span><span class="crayon-s">&#8220;Entertainment&#8221;</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span> </div> </div> </td> </tr> </table> onDestrory函数中添加 1 <td class="crayon-code"> <div class="crayon-pre"> <div id="crayon-551b51a07ef54202315585-1" class="crayon-line"> <span class="crayon-v">android</span><span class="crayon-sy">.</span><span class="crayon-v">os</span><span class="crayon-sy">.</span><span class="crayon-v">debug</span><span class="crayon-sy">.</span><span class="crayon-e">stopMethodTracing</span><span class="crayon-sy">(</span><span class="crayon-sy">)</span><span class="crayon-sy">;</span> </div> </div> </td> </tr> </table> 程序退出后会在sd卡根目录下生成Entertainment.trace这个文件,cmd到android sdk的tools目录下运行traceview.bat Entertainment.trace即可,截图如下 ...

2015年4月1日 · 12 分钟 · 天边的星星

Android LayoutInflater原理分析,带你一步步深入了解View(一)

转载:http://blog.csdn.net/guolin_blog/article/details/12921889 有段时间没写博客了,感觉都有些生疏了呢。最近繁忙的工作终于告一段落,又有时间写文章了,接下来还会继续坚持每一周篇的节奏。 有不少朋友跟我反应,都希望我可以写一篇关于View的文章,讲一讲View的工作原理以及自定义View的方法。没错,承诺过的文章我是一定要兑现的,而且在View这个话题上我还准备多写几篇,尽量能将这个知识点讲得透彻一些。那么今天就从LayoutInflater开始讲起吧。 相信接触Android久一点的朋友对于LayoutInflater一定不会陌生,都会知道它主要是用于加载布局的。而刚接触Android的朋友可能对LayoutInflater不怎么熟悉,因为加载布局的任务通常都是在Activity中调用setContentView()方法来完成的。其实setContentView()方法的内部也是使用LayoutInflater来加载布局的,只不过这部分源码是internal的,不太容易查看到。那么今天我们就来把LayoutInflater的工作流程仔细地剖析一遍,也许还能解决掉某些困扰你心头多年的疑惑。 先来看一下LayoutInflater的基本用法吧,它的用法非常简单,首先需要获取到LayoutInflater的实例,有两种方法可以获取到,第一种写法如下: **[java]** [view plain](http://blog.csdn.net/guolin_blog/article/details/12921889#)[copy](http://blog.csdn.net/guolin_blog/article/details/12921889#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/118597)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/118597/fork) <div> <embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_1"> </embed> </div> </div> - LayoutInflater layoutInflater = LayoutInflater.from(context); 当然,还有另外一种写法也可以完成同样的效果: **[java]** [view plain](http://blog.csdn.net/guolin_blog/article/details/12921889#)[copy](http://blog.csdn.net/guolin_blog/article/details/12921889#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/118597)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/118597/fork) <div> <embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_2"> </embed> </div> </div> - LayoutInflater layoutInflater = (LayoutInflater) context - .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 其实第一种就是第二种的简单写法,只是Android给我们做了一下封装而已。得到了LayoutInflater的实例之后就可以调用它的inflate()方法来加载布局了,如下所示: **[java]** [view plain](http://blog.csdn.net/guolin_blog/article/details/12921889#)[copy](http://blog.csdn.net/guolin_blog/article/details/12921889#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/118597)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/118597/fork) <div> <embed id="ZeroClipboardMovie_3" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_3"> </embed> </div> </div> - layoutInflater.inflate(resourceId, root); inflate()方法一般接收两个参数,第一个参数就是要加载的布局id,第二个参数是指给该布局的外部再嵌套一层父布局,如果不需要就直接传null。这样就成功成功创建了一个布局的实例,之后再将它添加到指定的位置就可以显示出来了。 ...

2015年4月1日 · 12 分钟 · 天边的星星

Android资源推荐

AndroidDevTools Google Android官方教程 Android Training Course in Chinese Android基础 上面可能是一个比较全面系统的培训教程,对于新手们可能对某些需要着重掌握的东西比较迷茫,于是整理下个人认为新手们必须要掌握的知识点,顺便也会附带相应觉得不错的讲解博客地址。 两分钟彻底让你明白Android Activity生命周期(图文)! Activity实际开发中使用频率最高,这个必须要理解 Android四大基本组件介绍与生命周期 Android中的四大组件必须得知道,也是面试常问到的 ListView的基本使用与优化 ListView是所有控件中最常使用且对新手来说比较复杂的用法,各种Adapter的使用以及ListView的优化都是必须掌握的 Android系统用于Activity的标准Intent Intent解决了Android中四大组件的通讯,非常有用,这篇博客收集整理了系统的标准Intent Android 屏幕适配 介绍一些Android屏幕适配的基础 Android中SQLite应用详解 Android中的SQLite需要掌握,这篇博客很适合新手 Android Fragment完全解析 3.0之后新加的Fragment,必须要掌握,目前使用的场景也是越来越普遍了 Android中级 Android应用程序的生命周期 Android的应用程序的生命周期需要理解,面试也是经常会被问的 带你一步步深入了解View View做为UI开发中最常用到的,必须要深入理解 Android Service完全解析 Service作为Android四大组件之一,在每一个应用程序中都扮演着非常重要的角色 Android Gson 目前比较常用比较流行的数据格式就是json了,这篇博客教你如何使用Google Gson库来进行json解析 Android 布局优化 Android开发中经常会用到xml布局,那么布局优化方面的知识更是需要掌握的了 Android中Intent传递对象的两种方法(Serializable,Parcelable) 详细讲解了Android中Intent中如何传递对象 Android异步消息处理机制完全解析 Android开发中异步操作是经常使用的,必须理解掌握 Android AsyncTask完全解析 Android异步操作的另一种方法 Android Custom Loading 很早的一个小demo,教你如何做一个App的Loading动画 Android进阶 Android Gradle Google官方Android新的构建系统,可以很方便的管理依赖、编译打包等 Android 性能优化 一系列的性能调优教程,让你的代码以及App更畅通! 一个完整的开源项目–9GAG 一个开源客户端,教你使用Studio、Gradle以及一些流行的开源库快速开发一个不错的Android客户端 整理的Android开发资源 自己整理的一些Android开发资源,包括开发、工具、设计等,相信会对你有用的 Android设计 在开发一款Android App之前,你需要了解下Android平台的设计规范,这里有一系列关于Android Design的讲解以及Google最新推出的Material Design中文翻译版 Android Design Material Design Android兼容库 在了解了设计规范准备着手开发你的App时,你还需要考虑你的App支持的版本,如果是全新的App,从目前的市场份额来看,建议直接支持4.0+,虽然2.3的份额仍然有一部分,但是这部分真正用来使用App的人又能有多少呢。当然如果你的公司必须要求支持2.x的版本,那么也不用担心,下面整理了几个满足你适配的一些兼容库: ...

2015年4月1日 · 1 分钟 · 天边的星星

Android常用方法收集

/** 获取当前应用程序的版本号 */ private String getVersion() { String st = getResources().getString(R.string.Version_number_is_wrong); PackageManager pm = getPackageManager(); try { PackageInfo packinfo = pm.getPackageInfo(getPackageName(), 0); String version = packinfo.versionName; return version; } catch (NameNotFoundException e) { e.printStackTrace(); return st; } } 设置字符串点击启动指定Activity,部分字体高亮显示 // 创建一个 SpannableString对象 SpannableString sp = <span class="s1">new</span> SpannableString( <span class="s2"> getString(R.string.</span>activity_frogetpwd_newuserreader_str<span class="s2">));</span> // 设置超链接 <span class="s2"> Spanned.</span>SPAN_EXCLUSIVE_EXCLUSIVE<span class="s2">);</span> // 设置背景高亮样式一 // sp.setSpan(new BackgroundColorSpan(Color.RED), 17, 19, // Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // 设置高亮样式二 <span class="s2"> Spannable.</span>SPAN_EXCLUSIVE_EXCLUSIVE<span class="s2">);</span> // // 设置斜体 // sp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 27, // 29, Spannable.SPAN_EXCLUSIVE_INCLUSIVE); myTextView.setText(sp); // 设置TextView可点击 myTextView.setMovementMethod(LinkMovementMethod.getInstance()); /** * 自定义URLSpan的点击事件 * * <span class="s1">@author</span> <span class="s2">jason</span> * */ <span class="s3">private</span> <span class="s3">class</span> MyURLSpan <span class="s3">extends</span> ClickableSpan { <span class="s3">private</span> String <span class="s4">mUrl</span>; MyURLSpan(String url) { <span class="s4">mUrl</span> = url; } @Override <span class="s3">public</span> <span class="s3">void</span> onClick(View widget) { Toast.makeText(RegisterActivity.<span class="s3">this</span>, <span class="s4">mUrl</span>, Toast.<span class="s4">LENGTH_LONG</span>) .show(); widget.setBackgroundColor(Color.parseColor(<span class="s6">&#8220;#00000000&#8221;</span>)); } }

2015年3月31日 · 1 分钟 · 天边的星星

Android自定义控件系列之应用篇——圆形进度条

**一、概述** 在上一篇博文中,我们给大家介绍了Android自定义控件系列的基础篇。链接: http://www.cnblogs.com/jerehedu/p/4360066.html 这一篇博文中,我们将在基础篇的基础上,再通过重写ondraw()方法和自定义属性实现圆形进度条,效果如图所示: **二、实现步骤** 1、 编写自定义组件MyCircleProgress扩展View <span class="keyword">public</span> <span class="class"><span class="keyword">class</span></span><span class="class"> <span class="title">MyCircleProgress</span> <span class="keyword">extends</span> <span class="title">View</span> {</span> … } 2、 在MyCircleProgress类中,定制属性 <span class="keyword">public</span> <span class="keyword">int</span> progress = <span class="number"></span>;<span class="comment">//</span><span class="comment">进度实际值,当前进度</span> <span class="javadoc">/**</span><span class="javadoc"> * 自定义控件属性,可灵活的设置圆形进度条的大小、颜色、类型等 */</span> <span class="keyword">private</span> <span class="keyword">int</span> mR;<span class="comment">//</span><span class="comment">圆半径,决定圆大小</span> <span class="keyword">private</span> <span class="keyword">int</span> bgColor;<span class="comment">//</span><span class="comment">圆或弧的背景颜色</span> <span class="keyword">private</span> <span class="keyword">int</span> fgColor;<span class="comment">//</span><span class="comment">圆或弧的前景颜色,即绘制时的颜色</span> <span class="keyword">private</span> <span class="keyword">int</span> drawStyle; <span class="comment">//</span><span class="comment">绘制类型 FILL画圆形进度条,STROKE绘制弧形进度条</span> <span class="keyword">private</span> <span class="keyword">int</span> strokeWidth;<span class="comment">//</span><span class="comment">STROKE绘制弧形的弧线的宽度</span> <span class="keyword">private</span> <span class="keyword">int</span> max;<span class="comment">//</span><span class="comment">最大值,设置进度的最大值</span> <span class="javadoc">/**</span><span class="javadoc"> * 设置进度,此为线程安全控件,由于考虑多线的问题,需要同步 */</span> <span class="keyword">public</span> <span class="keyword">synchronized</span> <span class="keyword">void</span> setProgress(<span class="keyword">int</span> progress) { <span class="keyword">if</span>(progress&lt;<span class="number"></span>){ progress=<span class="number"></span>; }<span class="keyword">else</span> <span class="keyword">if</span>(progress&gt;max){ progress=max; }<span class="keyword">else</span>{ <span class="keyword">this</span>.progress = progress; } } <span class="keyword">public</span> <span class="keyword">int</span> getMax() { <span class="keyword">return</span> max; } 3、 为定制的属性编写attrs.xml资源,该资源文件放在res/values目录下,内容如下: ...

2015年3月31日 · 3 分钟 · 天边的星星

java中byte与 int、short、char、float、double之间的转换

由于java的字节序和网络字节序一致(高位在前),给出换算方法,亲测OK public static void main(String[] args) { byte[] bs=new byte[2]; short dvalue=1; Utils.putShort(bs, dvalue, 0); for (int i = 0; i < bs.length; i++) { System.out.println(bs[i]); } } /** 将32位的int值放到4字节的里 @param num @return */ public static byte[] int2byteArray(int num) { byte[] result = new byte[4]; result[0] = (byte) (num »> 24);// 取最高8位放到0下标 result[1] = (byte) (num »> 16);// 取次高8为放到1下标 result[2] = (byte) (num »> 8); // 取次低8位放到2下标 result[3] = (byte) (num); // 取最低8位放到3下标 return result; } /** ...

2015年3月30日 · 3 分钟 · 天边的星星

android多分辨率多屏幕密度下UI适配方案

相关概念 **分辨率:**整个屏幕的像素数目,为了表示方便一般用屏幕的像素宽度(水平像素数目)乘以像素高度表示,形如1280×720,反之分辨率为1280×720的屏幕,像素宽度不一定为1280 **屏幕密度:**表示单位面积内的像素个数,通常用dpi为单位,即每英寸多少个像素点 px**:**长度单位,以具体像素为单位 dp**:**长度单位,与具体屏幕密度无关,显示的时候根据具体平台屏幕密度的不同最终转换为相应的像素长度,具体转换规则是: 1dp =(目标屏幕密度/标准密度)*px,标准密度为160dpi,例如,1dp长度在密度为160dpi的平台表示一个像素的长度,而在240dpi的平台则表示1.5个像素的长度 **屏幕尺寸:**屏幕的大小,通常用屏幕对角线的长度表示 Android界面适配机制 UI界面在不同平台的适配受屏幕尺寸和屏幕密度影响,Android适配机制就是在资源后面添加对这两种因素的限定,通过不同的限定区分不同的平台资源,Android在使用资源的时候会优先选择满足本平台限定的资源,再找最接近条件的,再找默认(即不加限定),通过选择适合当前平台的资源来完成不同平台的适配。 屏幕尺寸分为:small,normal,large,xlarge分别表示小,中,大,超大屏 屏幕密度分为:ldpi,mdpi,hdpi,xhdpi,它们的标准值分别是:120dpi,160dpi,240dpi,320dpi 以上划分均表示的是一个范围: 在资源目录后面加上上面的限定就能为资源指定特定的适用平台,如下所示 表示大屏,中密度布局会选择上面那个main.xml,超大屏,中密度会选择下面那个main.xml 在实际开发过程中屏幕尺寸不够直观,android将其转换为分辨率表示,根据屏幕具体分辨率可选择相应的限定符 小结:通过加上上述限定可以实现一个apk适配几种主流的屏幕尺寸和屏幕密度,这种限定方式比较适用于对外发布应用,不知道终端具体参数的情况,但是不能做到精确适配,对于屏幕尺寸和密度相差不大的两种平台不能很好的区分。 为了解决上述问题,自Android3.2开始,引入了精确适配,理论上可以适配任意像素宽度,高度,屏幕密度的平台,需用以下方式添加限定符 其中w1280dp表示屏幕宽度为1280dp,h752dp表示屏幕高度为752dp,160dpi表示屏幕密度,其中屏幕宽,高必须以dp为单位,在知道屏幕像素宽高度的情况下可以通过公式:1dp = (目标屏幕密度/标准密度)*px 转换成dp单位。 例如:某平台屏幕宽,高分别为1920px,720px,屏幕密度为240dpi 适配该平台的限定为: 或者 根据公式1dp=(240/160)px=1.5px,宽度,高度转为dp单位分别是1280dp和480dp. Android自适应不同分辨率或不同屏幕大小的layout布局(横屏|竖屏) 一:不同的layout Android手机屏幕大小不一,有480×320, 640×360, 800×480.怎样才能让App自动适应不同的屏幕呢? 其实很简单,只需要在res目录下创建不同的layout文件夹,比如layout-640×360,layout-800×480,所有的layout文件在编译之后都会写入R.java里,而系统会根据屏幕的大小自己选择合适的layout进行使用。 二:hdpi、mdpi、ldpi 在之前的版本中,只有一个drawable,而2.1版本中有drawable-mdpi、drawable-ldpi、drawable-hdpi三个,这三个主要是为了支持多分辨率。 drawable- hdpi、drawable- mdpi、drawable-ldpi的区别: (1)drawable-hdpi里面存放高分辨率的图片,如WVGA (480×800),FWVGA (480×854) (2)drawable-mdpi里面存放中等分辨率的图片,如HVGA (320×480) (3)drawable-ldpi里面存放低分辨率的图片,如QVGA (240×320) 系统会根据机器的分辨率来分别到这几个文件夹里面去找对应的图片。 更正:应该是对应不同density 的图片 在开发程序时为了兼容不同平台不同屏幕,建议各自文件夹根据需求均存放不同版本图片。 [i]备注:三者的解析度不一样,就像你把电脑的分辨率调低,图片会变大一样,反之分辨率高,图片缩小。 [/i] 屏幕方向: 横屏竖屏自动切换: 可以在res目录下建立layout-port-800×600和layout-land两个目录,里面分别放置竖屏和横屏两种布局文件,这样在手机屏幕方向变化的时候系统会自动调用相应的布局文件,避免一种布局文件无法满足两种屏幕显示的问题。 不同分辨率横屏竖屏自动切换: 以800×600为例 可以在res目录下建立layout-port-800×600和layout-land-800×600两个目录 不切换: 以下步骤是网上流传的,不过我自己之前是通过图形化界面实现这个配置,算是殊途同归,有空我会把图片贴上来。 还要说明一点:每个activity都有这个属性screenOrientation,每个activity都需要设置,可以设置为竖屏(portrait),也可以设置为无重力感应(nosensor)。 要让程序界面保持一个方向,不随手机方向转动而变化的处理办法: 在AndroidManifest.xml里面配置一下就可以了。加入这一行android:screenOrientation=”landscape”。 例如(landscape是横向,portrait是纵向): Java代码: <?xml version=”1.0″ encoding=”utf-8″?> <manifestxmlns:android=”http://schemas.android.com/apk/res/android” package=”com.ray.linkit” android:versionCode=”1″ android:versionName=”1.0″> <application android:icon=”@drawable/icon”android:label=”@string/app_name”> 另外,android中每次屏幕的切换动会重启Activity,所以应该在Activity销毁前保存当前活动的状态,在Activity再次Create的时候载入配置,那样,进行中的游戏就不会自动重启了! 有的程序适合从竖屏切换到横屏,或者反过来,这个时候怎么办呢?可以在配置Activity的地方进行如下的配置android:screenOrientation=”portrait”。这样就可以保证是竖屏总是竖屏了,或者landscape横向。 而 有的程序是适合横竖屏切换的。如何处理呢?首先要在配置Activity的时候进行如下的配 置:android:configChanges=”keyboardHidden|orientation”,另外需要重写Activity的 onConfigurationChanged方法。实现方式如下,不需要做太多的内容: ...

2015年3月24日 · 2 分钟 · 天边的星星

oschina-app源码分析-提醒标签BadgeView使用方法https://github.com/chenupt/BezierDemo

看过oschina-app的数字提醒标签BadgeView的使用过程,才发现以前项目中的实现逻辑有问题。以前待的项目组没个牛人,从我干第一个项目就我负责开发设计和管理,可想而知,顶多也就实现功能交工。说到底就是经验不足,所以有时间还是多看看别人的代码。本来是想主要讲oschina-app里面提醒标签的实现逻辑,但我觉得标签控件BadgeView有必要说下。 BadgeView是一个开源的ui项目,其实就一个ui工具类,BadgeView是对TextView的重写,他的代码就不贴了,可以到git上下最新的吧:https://github.com/jgilfelt/android-viewbadger 在这里主要说下他的用法,它可以设置标签的背景、颜色、位置、动画、文字等,对一般的需求足以满足了,先看下git上demo的效果: 默认属性标签代码: **[java]** [view plain](http://blog.csdn.net/xiangxue336/article/details/21073571#)[copy](http://blog.csdn.net/xiangxue336/article/details/21073571#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/230977)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/230977/fork) <div> <embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_1"> </embed> </div> </div> - <span class="comment">// *** default badge ***</span> - - View target = findViewById(R.id.default_target); - BadgeView badge = <span class="keyword">new</span> BadgeView(<span class="keyword">this</span>, target); - badge.setText(<span class="string">&#8220;1&#8221;</span>); - badge.show(); 默认是显示在右上角,红色的背景白色字体,这些个默认属性是可以在BadgeView里面设置的。 设置position代码: **[java]** [view plain](http://blog.csdn.net/xiangxue336/article/details/21073571#)[copy](http://blog.csdn.net/xiangxue336/article/details/21073571#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/230977)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/230977/fork) <div> <embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="18" height="18" align="middle" name="ZeroClipboardMovie_2"> </embed> </div> </div> - <span class="comment">// *** set position ***</span> - - btnPosition = (Button) findViewById(R.id.position_target); - badge1 = <span class="keyword">new</span> BadgeView(<span class="keyword">this</span>, btnPosition); - badge1.setText(<span class="string">&#8220;12&#8221;</span>); - badge1.setBadgePosition(BadgeView.POSITION_CENTER); - btnPosition.setOnClickListener(<span class="keyword">new</span> OnClickListener() { - <span class="annotation">@Override</span> - <span class="keyword">public</span> <span class="keyword">void</span> onClick(View v) { - badge1.toggle(); - } - }); toggle方法是控制标签的现实和隐藏的。 ...

2015年3月24日 · 2 分钟 · 天边的星星