Android有趣的全透明效果–Activity及Dialog的全透明(附android系统自带图标大全)

1.Activity全透明 同学zzm给了这个有趣的代码,现在公布出来。 先在res/values下建colors.xml文件,写入:** **** ** [?](http://www.oschina.net/question/54100_30266#) <table style="font-weight: normal !important;" border="0" cellspacing="0" cellpadding="0"> <tr> <td class="gutter" style="color: #afafaf !important;"> <div class="line number1 index0 alt2"> 1 </div> <div class="line number2 index1 alt1"> 2 </div> <div class="line number3 index2 alt2"> 3 </div> <div class="line number4 index3 alt1"> 4 </div> </td> <td class="code"> <div class="container"> <div class="line number1 index0 alt2"> `&lt;? ``xml` `version` `= ``"1.0"` `encoding` `= ``"UTF-8"` `?&gt; ` </div> <div class="line number2 index1 alt1"> `&lt;``resources``&gt; ` </div> <div class="line number3 index2 alt2"> ` ``&lt;``color` `name` `= ``"transparent"``&gt; #9000 &lt;/``color``&gt; ` </div> <div class="line number4 index3 alt1"> `&lt;/``resources``&gt;` </div> </div> </td> </tr> </table> ...

2014年11月19日 · 9 分钟 · 天边的星星

GridView+Viewpage实现一切上下滑动

一个布局。。上面是一个自动播放的ViewPager,,下面是一个GridView。。 怎么实现ViewPager和GridView一起上下滑动,,而不是向上滑动时,,ViewPager会覆盖GridView。 重写gridview 和 ScrollView public class MyGridView extends GridView { public MyGridView(Context context, AttributeSet attrs) { super(context, attrs); } public MyGridView(Context context) { super(context); } public MyGridView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE » 2, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, expandSpec); } } —————————————————————————————————– public class MyScrollView extends ScrollView { // 滑动距离及坐标 private float xDistance, yDistance, xLast, yLast; public MyScrollView(Context context, AttributeSet attrs) { super(context, attrs); } ...

2014年11月18日 · 1 分钟 · 天边的星星

Android开发实践:自定义带消息循环(Looper)的工作线程

Android也提供了封装有消息循环(Looper)的HandlerThread类,这种线程,可以绑定Handler()对象,并通过 Handler的sendMessage()函数向线程发送消息,通过handleMessage()函数,处理线程接收到的消息。这么说比较抽象,那 么,本文就利用基础的Java类库,实现一个带消息循环(Looper)的线程,以帮助初学者理解这样一个Looper到底是怎么工作的。 1. 首先,我们完成一个简单的线程框架。 1 <div class="line number2 index1 alt1"> 2 </div> <div class="line number3 index2 alt2"> 3 </div> <div class="line number4 index3 alt1"> 4 </div> <div class="line number5 index4 alt2"> 5 </div> <div class="line number6 index5 alt1"> 6 </div> <div class="line number7 index6 alt2"> 7 </div> <div class="line number8 index7 alt1"> 8 </div> <div class="line number9 index8 alt2"> 9 </div> <div class="line number10 index9 alt1"> 10 </div> <div class="line number11 index10 alt2"> 11 </div> <div class="line number12 index11 alt1"> 12 </div> <div class="line number13 index12 alt2"> 13 </div> <div class="line number14 index13 alt1"> 14 </div> <div class="line number15 index14 alt2"> 15 </div> <div class="line number16 index15 alt1"> 16 </div> <div class="line number17 index16 alt2"> 17 </div> <div class="line number18 index17 alt1"> 18 </div> <div class="line number19 index18 alt2"> 19 </div> <div class="line number20 index19 alt1"> 20 </div> <div class="line number21 index20 alt2"> 21 </div> <div class="line number22 index21 alt1"> 22 </div> <div class="line number23 index22 alt2"> 23 </div> <div class="line number24 index23 alt1"> 24 </div> <div class="line number25 index24 alt2"> 25 </div> <div class="line number26 index25 alt1"> 26 </div> <div class="line number27 index26 alt2"> 27 </div> <div class="line number28 index27 alt1"> 28 </div> <div class="line number29 index28 alt2"> 29 </div> <div class="line number30 index29 alt1"> 30 </div> <div class="line number31 index30 alt2"> 31 </div> <div class="line number32 index31 alt1"> 32 </div> <div class="line number33 index32 alt2"> 33 </div> </td> <td class="code"> <div class="container"> <div class="line number1 index0 alt2"> `public` `class` `LooperThread {` </div> <div class="line number2 index1 alt1"> ` ` </div> <div class="line number3 index2 alt2"> ` ``private` `volatile` `boolean` `mIsLooperQuit = ``false``;` </div> <div class="line number4 index3 alt1"> ` ` </div> <div class="line number5 index4 alt2"> ` ``private` `Thread mThread; ` </div> <div class="line number6 index5 alt1"> ` ` </div> <div class="line number7 index6 alt2"> ` ``public` `void` `start() { ` </div> <div class="line number8 index7 alt1"> ` ``if``( mThread != ``null` `) {` </div> <div class="line number9 index8 alt2"> ` ``return``;` </div> <div class="line number10 index9 alt1"> ` ``} ` </div> <div class="line number11 index10 alt2"> ` ``mIsLooperQuit = ``false``;` </div> <div class="line number12 index11 alt1"> ` ``mThread = ``new` `Thread(mLooperRunnable);` </div> <div class="line number13 index12 alt2"> ` ``mThread.start(); ` </div> <div class="line number14 index13 alt1"> ` ``}` </div> <div class="line number15 index14 alt2"> ` ` </div> <div class="line number16 index15 alt1"> ` ``public` `void` `stop() { ` </div> <div class="line number17 index16 alt2"> ` ``if``( mThread == ``null` `) {` </div> <div class="line number18 index17 alt1"> ` ``return``;` </div> <div class="line number19 index18 alt2"> ` ``} ` </div> <div class="line number20 index19 alt1"> ` ``mIsLooperQuit = ``true``;` </div> <div class="line number21 index20 alt2"> ` ``mThread = ``null``; ` </div> <div class="line number22 index21 alt1"> ` ``}` </div> <div class="line number23 index22 alt2"> </div> <div class="line number24 index23 alt1"> ` ``protected` `Runnable mLooperRunnable = ``new` `Runnable() { ` </div> <div class="line number25 index24 alt2"> </div> <div class="line number26 index25 alt1"> ` ``@Override` </div> <div class="line number27 index26 alt2"> ` ``public` `void` `run() {` </div> <div class="line number28 index27 alt1"> ` ``while``( !mIsLooperQuit ) {` </div> <div class="line number29 index28 alt2"> ` ` </div> <div class="line number30 index29 alt1"> ` ``}` </div> <div class="line number31 index30 alt2"> ` ``}` </div> <div class="line number32 index31 alt1"> ` ``}; ` </div> <div class="line number33 index32 alt2"> `}` </div> </div> </td> </tr> </table> ...

2014年11月17日 · 9 分钟 · 天边的星星

ym——安卓巴士总结了近百个Android优秀开源项

1、Android团队提供的示例项目 如果不是从学习Android SDK中提供的那些样例代码开始,可能没有更好的方法来掌握在Android这个框架上开发。由Android的核心开发团队提供了15个优秀的示例项目,包含了游戏、图像处理、时间显示、开始菜单快捷方式等。 地址:http://www.apkbus.com/android-13506-1-1.html 2、Remote Droid RemoteDroid是一个Android应用,能够让用户使用自己的无线网络使用无线键盘、触摸屏操作手机。这个项目为开发者提供了如网络连接、触摸屏手指运动等很好的样例。 地址:http://www.apkbus.com/android-13507-1-1.html 3、TorProxy和Shadow TorProxy应用实现了Android手机无线电电传通讯(TOR),和Shadow应用一起使用,可以使用手机匿名上网。从该项目源代码中,可以掌握socket连接、管理cookie等方法。 地址:http://www.apkbus.com/android-13510-1-1.html 4、Android SMSPopup SMSPopup可以截获短信内容显示在一个泡泡形状的窗口中。从这个项目中可以掌握到如何使用内置的短信SMS接口。 地址:http://www.apkbus.com/android-13513-1-1.html 5、Standup Timer Standup Timer应用用于控制站立会议时间,类似秒表倒计时,可以提醒每个人的讲话时间已到,从而保证每个与会者使用时间一样。从该项目的代码中,可以学会如何使用时间函数。另外,这个项目的代码是采用视图view、模型model严格分离的设计思路。 地址:http://www.apkbus.com/android-13514-1-1.html 6、Foursquare 是Foursquare.com的一个客户端应用,该应用主要分为两个模块:API(com.joelapenna.foursquare)和界面前端(com.joelapenna.foursquared)两部分。从该项目代码中,可以学会如何同步、多线程、HTTP连接等技术。 地址:http://www.apkbus.com/android-13516-1-1.html 7、Pedometer Pedometer应用用于记录你每天走路步数的。尽管记录不一定精准,但是从这个项目中,可以学习几个不同的技术:加速器交互、语音更新、后台运行服务等。 地址:http://www.apkbus.com/android-13515-1-1.html 8、OpenSudoku-android OpenSudoku是一个简单的九宫格数独游戏。从代码中可以学习到如何在视图中显示表格数据,以及如何和一个网站交互等技术。 地址:http://www.apkbus.com/android-13517-1-1.html 9、ConnectBot ConnectBot是Android平台的一个客户端安全壳应用。从该项目代码中,可以学习到很多Android安全方面的内容,这些是你在开发应用时经常需要考虑的安全问题。 地址:http://www.apkbus.com/android-13518-1-1.html 10、WordPress的Android应用 当然在最后不能不提WordPress的Android应用了,这是WordPress官方开发团队提供的一个项目。从代码中可以学习到XMLRPC调用(当然还有更多的优秀内容)。 地址:http://www.apkbus.com/android-13520-1-1.html Android PDF 阅读器 http://sourceforge.net/projects/andpdf/files/ 个人记账工具 OnMyMeans http://sourceforge.net/projects/onmymeans/develop Android电池监控 Android Battery Dog [http://sourceforge.net/projects/andbatdog/](http://sourceforge.net/projects/andbatdog/) RSS阅读软件 Android RSS [http://code.google.com/p/android-rss/](http://code.google.com/p/android-rss/) Android的PDF阅读器 DroidReader [http://code.google.com/p/droidreader/](http://code.google.com/p/droidreader/) AndroidScripting Environment [http://code.google.com/p/android-scripting/](http://code.google.com/p/android-scripting/) Android小游戏 Android Shapes [http://sourceforge.net/projects/shapes/](http://sourceforge.net/projects/shapes/) AndroidJSON RPC [http://code.google.com/p/android-json-rpc/](http://code.google.com/p/android-json-rpc/) AndroidVNC [http://code.google.com/p/android-vnc/](http://code.google.com/p/android-vnc/) 魅族M8的Android移植 M8 Android [http://code.google.com/p/m8-android-kernel/](http://code.google.com/p/m8-android-kernel/) Android游戏 Amazed [http://code.google.com/p/apps-for-android/](http://code.google.com/p/apps-for-android/) Android的社交网络 HelloWorld goes mobile [http://sourceforge.net/projects/helloworldgm/](http://sourceforge.net/projects/helloworldgm/) 手机聊天程序 Android jChat [http://code.google.com/p/jchat4android/](http://code.google.com/p/jchat4android/) Android的GPS轨迹记录 MyTracks [http://code.google.com/p/mytracks/](http://code.google.com/p/mytracks/) Android国际象棋游戏 Honzovy achy [http://sourceforge.net/projects/honzovysachy/](http://sourceforge.net/projects/honzovysachy/) Android旅行记录软件 AndTripLog [http://sourceforge.net/projects/andtriplog/](http://sourceforge.net/projects/andtriplog/) 音乐播放器 Ambient [http://sourceforge.net/projects/ambientmp/](http://sourceforge.net/projects/ambientmp/) Android的邮件客户端 K9mail [http://code.google.com/p/k9mail/](http://code.google.com/p/k9mail/) 多平台应用开发库 QuickConnect [http://sourceforge.net/projects/quickconnect/](http://sourceforge.net/projects/quickconnect/) gPhone手机空战游戏 [http://code.google.com/p/wireless-apps/](http://code.google.com/p/wireless-apps/) Android照片小软件 Panoramio [http://code.google.com/p/apps-for-android/](http://code.google.com/p/apps-for-android/) i-jetty [http://code.google.com/p/i-jetty/](http://code.google.com/p/i-jetty/) Android小游戏 DivideAndConquer [http://code.google.com/p/apps-for-android/](http://code.google.com/p/apps-for-android/) Android全球时间 AndroidGlobalTime [http://code.google.com/p/apps-for-android/](http://code.google.com/p/apps-for-android/) Android2D游戏引擎 Android Angle [http://code.google.com/p/angle/](http://code.google.com/p/angle/) AndroidRuby [http://code.google.com/p/android-ruby/](http://code.google.com/p/android-ruby/) Android-N810 [http://sourceforge.net/projects/android-n810/](http://sourceforge.net/projects/android-n810/) Android的短信应用 Ecclesia [http://sourceforge.net/projects/ecclesia](http://sourceforge.net/projects/ecclesia) Android平台上的JXTA客户端 Peerdroid [http://code.google.com/p/peerdroid/](http://code.google.com/p/peerdroid/) Android游戏引擎 libgdx [http://code.google.com/p/libgdx/](http://code.google.com/p/libgdx/) Android照片小软件 Photostream [http://code.google.com/p/apps-for-android/](http://code.google.com/p/apps-for-android/) Alien3dlogo Android 3D游戏引擎 Alien3d [http://code.google.com/p/alien3d/](http://code.google.com/p/alien3d/) WinampRemote Android Server [http://sourceforge.net/projects/winampdroid](http://sourceforge.net/projects/winampdroid) Android的Facebook客户端 Andrico [http://code.google.com/p/andrico/](http://code.google.com/p/andrico/) AndroidApplications Manager [http://sourceforge.net/projects/aam/](http://sourceforge.net/projects/aam/) Java3D图形引擎 Catcake [http://code.google.com/p/catcake/](http://code.google.com/p/catcake/) android-gcc-objc2-0 [http://code.google.com/p/android-gcc-objc2-0/](http://code.google.com/p/android-gcc-objc2-0/) 九宫格数独游戏 OpenSudoku [http://code.google.com/p/opensudoku-android/](http://code.google.com/p/opensudoku-android/) Android铃声扩展工具 RingsExtended [http://code.google.com/p/apps-for-android/](http://code.google.com/p/apps-for-android/) JavaEyeAndroid client [http://code.google.com/p/javaeye-android-client/](http://code.google.com/p/javaeye-android-client/) RemoteDroid [http://code.google.com/p/remotedroid/](http://code.google.com/p/remotedroid/) Android小游戏 Clickin2DaBeat [http://code.google.com/p/apps-for-android/](http://code.google.com/p/apps-for-android/) 中医大夫助理信息系统 zz-doctor [http://code.google.com/p/zz-doctor/](http://code.google.com/p/zz-doctor/) FacebookConnect for Android [http://code.google.com/p/fbconnect-android/](http://code.google.com/p/fbconnect-android/) AndroidSMSPopup [http://code.google.com/p/android-smspopup/](http://code.google.com/p/android-smspopup/) FreeTTS-Android [http://sourceforge.net/projects/freettsandroidi](http://sourceforge.net/projects/freettsandroidi) Foursquare.com的客户端 Foursquar [http://code.google.com/p/foursquared/](http://code.google.com/p/foursquared/) 条形码扫描仪 Android PC_BCR [http://code.google.com/p/android-pcbcr/](http://code.google.com/p/android-pcbcr/) android天气预报源码[http://www.apkbus.com/android-2240-1-1.html](http://www.apkbus.com/android-2240-1-1.html) android源码之电影购票源码[http://www.apkbus.com/android-2506-1-1.html](http://www.apkbus.com/android-2506-1-1.html) android的基站、WIFI、GPS定位集合,源码下载[。](http://www.apkbus.com/android-15281-1-1.html):[http://www.apkbus.com/android-15281-1-1.html](http://www.apkbus.com/android-15281-1-1.html) 一个100行代码写的android计算器:[http://www.apkbus.com/android-2231-1-1.html](http://www.apkbus.com/android-2231-1-1.html) Android卷曲翻页效果Demo:[http://www.apkbus.com/android-3738-1-2.html](http://www.apkbus.com/android-3738-1-2.html) android文件浏览器代码:[http://www.apkbus.com/android-2242-1-2.html](http://www.apkbus.com/android-2242-1-2.html) android源码超炫的3D特效程序管理功能:[http://www.apkbus.com/android-2046-1-2.html](http://www.apkbus.com/android-2046-1-2.html) Android手机平台重力感应Demo :[http://www.apkbus.com/android-45-1-2.html](http://www.apkbus.com/android-45-1-2.html) 一个android阅读器的源码[CoolReader](http://www.apkbus.com/android-2078-1-1.html):[http://www.apkbus.com/android-2078-1-2.html](http://www.apkbus.com/android-2078-1-2.html) 国外开源android音乐播放器[http://www.apkbus.com/android-2072-1-2.html](http://www.apkbus.com/android-2072-1-2.html) 一个综合了各个类型的对话框的demo :[http://www.apkbus.com/android-2086-1-2.html](http://www.apkbus.com/android-2086-1-2.html) 分享27个各种类型的demo:[http://www.apkbus.com/android-2083-1-2.html](http://www.apkbus.com/android-2083-1-2.html) android bluetooth [安卓](http://www.apkbus.com/)蓝牙源码下载:[http://www.apkbus.com/android-16841-1-2.html](http://www.apkbus.com/android-16841-1-2.html) android豆瓣手机客户端源码:[http://www.apkbus.com/android-1495-1-3.html](http://www.apkbus.com/android-1495-1-3.html) 转自:http://blog.csdn.net/cym492224103/article/details/38469251

2014年11月17日 · 1 分钟 · 天边的星星

Android开发实践:自定义带动画的View

对于一个自定义View来说,onMeasure只是用来计算View尺寸,onDraw()才是真正执行View的绘制,所以一般我们都需要重写 onDraw()函数来绘制我们期望的UI界面。下面我以一个具体的例子探索自定义View的onDraw()的实现过程和关键点。 我们的目标是制作一个柱状图动画,View的动画启动后,会显示一排柱状图增长的画面,这种动画多用于财务类或者统计类的APP中,效果如图所示(截屏的格式转换过程导致有些变形,还好不影响演示,图中设置了反复播放,真机上只会播放一次): 1. 首先,自定义View的派生类 ** ** 1 <div class="line number2 index1 alt1"> 2 </div> <div class="line number3 index2 alt2"> 3 </div> <div class="line number4 index3 alt1"> 4 </div> <div class="line number5 index4 alt2"> 5 </div> <div class="line number6 index5 alt1"> 6 </div> <div class="line number7 index6 alt2"> 7 </div> <div class="line number8 index7 alt1"> 8 </div> <div class="line number9 index8 alt2"> 9 </div> <div class="line number10 index9 alt1"> 10 </div> <div class="line number11 index10 alt2"> 11 </div> <div class="line number12 index11 alt1"> 12 </div> <div class="line number13 index12 alt2"> 13 </div> <div class="line number14 index13 alt1"> 14 </div> <div class="line number15 index14 alt2"> 15 </div> <div class="line number16 index15 alt1"> 16 </div> <div class="line number17 index16 alt2"> 17 </div> <div class="line number18 index17 alt1"> 18 </div> <div class="line number19 index18 alt2"> 19 </div> <div class="line number20 index19 alt1"> 20 </div> <div class="line number21 index20 alt2"> 21 </div> <div class="line number22 index21 alt1"> 22 </div> <div class="line number23 index22 alt2"> 23 </div> <div class="line number24 index23 alt1"> 24 </div> <div class="line number25 index24 alt2"> 25 </div> </td> <td class="code"> <div class="container"> <div class="line number1 index0 alt2"> `public` `class` `AnimatorView ``extends` `View {` </div> <div class="line number2 index1 alt1"> </div> <div class="line number3 index2 alt2"> ` ``private` `Paint mPaint; ` </div> <div class="line number4 index3 alt1"> ` ` </div> <div class="line number5 index4 alt2"> ` ``public` `AnimatorView(Context context) {` </div> <div class="line number6 index5 alt1"> ` ``super``(context); ` </div> <div class="line number7 index6 alt2"> ` ``initialize();` </div> <div class="line number8 index7 alt1"> ` ``}` </div> <div class="line number9 index8 alt2"> </div> <div class="line number10 index9 alt1"> ` ``public` `AnimatorView(Context context, AttributeSet attrs) {` </div> <div class="line number11 index10 alt2"> ` ``super``(context, attrs);` </div> <div class="line number12 index11 alt1"> ` ``initialize();` </div> <div class="line number13 index12 alt2"> ` ``}` </div> <div class="line number14 index13 alt1"> ` ` </div> <div class="line number15 index14 alt2"> ` ``public` `AnimatorView(Context context, AttributeSet attrs, ``int` `defStyle) {` </div> <div class="line number16 index15 alt1"> ` ``super``(context, attrs, defStyle);` </div> <div class="line number17 index16 alt2"> ` ``initialize();` </div> <div class="line number18 index17 alt1"> ` ``}` </div> <div class="line number19 index18 alt2"> ` ` </div> <div class="line number20 index19 alt1"> ` ``protected` `void` `initialize() {` </div> <div class="line number21 index20 alt2"> ` ``mPaint = ``new` `Paint(); ` </div> <div class="line number22 index21 alt1"> ` ``mPaint.setAntiAlias(``true``);` </div> <div class="line number23 index22 alt2"> ` ``mPaint.setStyle(Style.FILL); ` </div> <div class="line number24 index23 alt1"> ` ``} ` </div> <div class="line number25 index24 alt2"> `}` </div> </div> </td> </tr> </table> 注: Paint是用来绘图的画笔,可以设置其样式、画面的粗细、填充模式、颜色等等。 ...

2014年11月17日 · 7 分钟 · 天边的星星

Android开发实践:为什么要继承onMeasure()

Android开发中偶尔会用到自定义View,一般情况下,自定义View都需要继承View类的onMeasure方法,那么,为什么要继承 onMeasure()函数呢?什么情况下要继承onMeasure()?系统默认的onMeasure()函数行为是怎样的 ?本文就探究探究这些问题。 首先,我们写一个自定义View,直接调用系统默认的onMeasure函数,看看会是怎样的现象: 1 <div class="line number2 index1 alt1"> 2 </div> <div class="line number3 index2 alt2"> 3 </div> <div class="line number4 index3 alt1"> 4 </div> <div class="line number5 index4 alt2"> 5 </div> <div class="line number6 index5 alt1"> 6 </div> <div class="line number7 index6 alt2"> 7 </div> <div class="line number8 index7 alt1"> 8 </div> <div class="line number9 index8 alt2"> 9 </div> <div class="line number10 index9 alt1"> 10 </div> <div class="line number11 index10 alt2"> 11 </div> <div class="line number12 index11 alt1"> 12 </div> <div class="line number13 index12 alt2"> 13 </div> <div class="line number14 index13 alt1"> 14 </div> <div class="line number15 index14 alt2"> 15 </div> <div class="line number16 index15 alt1"> 16 </div> <div class="line number17 index16 alt2"> 17 </div> <div class="line number18 index17 alt1"> 18 </div> <div class="line number19 index18 alt2"> 19 </div> <div class="line number20 index19 alt1"> 20 </div> <div class="line number21 index20 alt2"> 21 </div> <div class="line number22 index21 alt1"> 22 </div> </td> <td class="code"> <div class="container"> <div class="line number1 index0 alt2"> `package` `com.titcktick.customview;` </div> <div class="line number2 index1 alt1"> </div> <div class="line number3 index2 alt2"> `import` `android.content.Context;` </div> <div class="line number4 index3 alt1"> `import` `android.util.AttributeSet;` </div> <div class="line number5 index4 alt2"> `import` `android.view.View;` </div> <div class="line number6 index5 alt1"> </div> <div class="line number7 index6 alt2"> `public` `class` `CustomView ``extends` `View {` </div> <div class="line number8 index7 alt1"> ` ` </div> <div class="line number9 index8 alt2"> ` ``public` `CustomView(Context context) {` </div> <div class="line number10 index9 alt1"> ` ``super``(context); ` </div> <div class="line number11 index10 alt2"> ` ``}` </div> <div class="line number12 index11 alt1"> </div> <div class="line number13 index12 alt2"> ` ``public` `CustomView(Context context, AttributeSet attrs) {` </div> <div class="line number14 index13 alt1"> ` ``super``(context, attrs); ` </div> <div class="line number15 index14 alt2"> ` ``}` </div> <div class="line number16 index15 alt1"> ` ` </div> <div class="line number17 index16 alt2"> ` ``@Override` </div> <div class="line number18 index17 alt1"> ` ``protected` `void` `onMeasure(``int` `widthMeasureSpec, ``int` `heightMeasureSpec) { ` </div> <div class="line number19 index18 alt2"> ` ``super``.onMeasure(widthMeasureSpec, heightMeasureSpec);` </div> <div class="line number20 index19 alt1"> ` ``}` </div> <div class="line number21 index20 alt2"> </div> <div class="line number22 index21 alt1"> `}` </div> </div> </td> </tr> </table> ...

2014年11月17日 · 7 分钟 · 天边的星星

Android开发实践:自定义ViewGroup的onLayout()分析

Android开发中,对于自定义View,分为两种,一种 是自定义控件(继承View类),另一种是自定义布局容器(继承ViewGroup)。如果是自定义控件,则一般需要重载两个方法,一个是 onMeasure(),用来测量控件尺寸,另一个是onDraw(),用来绘制控件的UI。而自定义布局容器,则一般需要实现/重载三个方法,一个是 onMeasure(),也是用来测量尺寸;一个是onLayout(),用来布局子控件;还有一个是dispatchDraw(),用来绘制UI。 本文主要分析自定义ViewGroup的onLayout()方法的实现。 ViewGroup 类的onLayout()函数是abstract型,继承者必须实现,由于ViewGroup的定位就是一个容器,用来盛放子控件的,所以就必须定义要以 什么的方式来盛放,比如LinearLayout就是以横向或者纵向顺序存放,而RelativeLayout则以相对位置来摆放子控件,同样,我们的自 定义ViewGroup也必须给出我们期望的布局方式,而这个定义就通过onLayout()函数来实现。 我们通过实现一个水平优先布局的视图容器来更加深入地了解onLayout()的实现吧,效果如图所示(黑色方块为子控件,白色部分为自定义布局容器)。该容器的布局方式是,首先水平方向上摆放子控件,水平方向放不下了,则另起一行继续水平摆放。 ** 1. 自定义ViewGroup的派生类** 第一步,则是自定ViewGroup的派生类,继承默认的构造函数。 1 <div class="line number2 index1 alt1"> 2 </div> <div class="line number3 index2 alt2"> 3 </div> <div class="line number4 index3 alt1"> 4 </div> <div class="line number5 index4 alt2"> 5 </div> <div class="line number6 index5 alt1"> 6 </div> <div class="line number7 index6 alt2"> 7 </div> <div class="line number8 index7 alt1"> 8 </div> <div class="line number9 index8 alt2"> 9 </div> <div class="line number10 index9 alt1"> 10 </div> <div class="line number11 index10 alt2"> 11 </div> <div class="line number12 index11 alt1"> 12 </div> <div class="line number13 index12 alt2"> 13 </div> <div class="line number14 index13 alt1"> 14 </div> </td> <td class="code"> <div class="container"> <div class="line number1 index0 alt2"> `public` `class` `CustomViewGroup ``extends` `ViewGroup {` </div> <div class="line number2 index1 alt1"> ` ` </div> <div class="line number3 index2 alt2"> ` ``public` `CustomViewGroup(Context context) {` </div> <div class="line number4 index3 alt1"> ` ``super``(context); ` </div> <div class="line number5 index4 alt2"> ` ``}` </div> <div class="line number6 index5 alt1"> ` ` </div> <div class="line number7 index6 alt2"> ` ``public` `CustomViewGroup(Context context, AttributeSet attrs) {` </div> <div class="line number8 index7 alt1"> ` ``super``(context, attrs); ` </div> <div class="line number9 index8 alt2"> ` ``}` </div> <div class="line number10 index9 alt1"> ` ` </div> <div class="line number11 index10 alt2"> ` ``public` `CustomViewGroup(Context context, AttributeSet attrs, intdefStyle) {` </div> <div class="line number12 index11 alt1"> ` ``super``(context, attrs, defStyle);` </div> <div class="line number13 index12 alt2"> ` ``}` </div> <div class="line number14 index13 alt1"> `}` </div> </div> </td> </tr> </table> ...

2014年11月17日 · 13 分钟 · 天边的星星

android ListView 设置分割线 Divider

这是一个极其隐蔽的 BUG 首先需求是:用 ColorDrawable 设置 ListView 分割线 ``` listView.setDivider(new ColorDrawable(0xffd4d5d6)); ``` 这样原理上绝对说得过去,但是你怎么都看不到效果,为什么呢,看源码吧! ![复制代码](http://common.cnblogs.com/images/copycode.gif) public void setDivider(Drawable divider) { if (divider != null) { mDividerHeight = divider.getIntrinsicHeight(); } else { mDividerHeight = 0; } //.... ![复制代码](http://common.cnblogs.com/images/copycode.gif) mDividerHeight 是分割线的高度,我们再看 [Drawable](eclipse-javadoc:%E2%98%82=MopoGameLauncher/E:%5C/adt-bundle-windows-x86_64-20130219%5C/sdk%5C/platforms%5C/android-17%5C/android.jar%3Candroid.graphics.drawable(Drawable.class%E2%98%83Drawable).getIntrinsicHeight() ``` public int getIntrinsicHeight() { return -1; } ``` 返回 -1,而 ColorDrawable 并没有重载此方法! 有些人运气好,在后面加了一句 listView.setDividerHeight(2); 这样问题就解决了,但是当你把这句放前面,就不知道为什么了! 所以正确方法是: ``` listView.setDivider(new ColorDrawable(0xffd4d5d6)); listView.setDividerHeight(2); ```

2014年11月13日 · 1 分钟 · 天边的星星

Android Volley完全解析(一),初识Volley的基本用法

1. Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高。 不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码。于是乎,一些Android网络通信框架也就应运而生,比如说AsyncHttpClient,它把HTTP所有的通信细节全部封装在了内部,我们只需要简单调用几行代码就可以完成通信操作了。再比如Universal-Image-Loader,它使得在界面上显示网络图片的操作变得极度简单,开发者不用关心如何从网络上获取图片,也不用关心开启线程、回收图片资源等细节,Universal-Image-Loader已经把一切都做好了。 Android开发团队也是意识到了有必要将HTTP的通信操作再进行简单化,于是在2013年Google I/O大会上推出了一个新的网络通信框架——Volley。Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。 下图所示的这些应用都是属于数据量不大,但网络通信频繁的,因此非常适合使用Volley。 2. 下载Volley 介绍了这么多理论的东西,下面我们就准备开始进行实战了,首先需要将Volley的jar包准备好,如果你的电脑上装有Git,可以使用如下命令下载Volley的源码: **[plain]** [view plain](http://blog.csdn.net/guolin_blog/article/details/17482095#)[copy](http://blog.csdn.net/guolin_blog/article/details/17482095#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/284210)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/284210/fork) <div style="color: #000000;"> </div> </div> - <span style="color: black;">git clone https://android.googlesource.com/platform/frameworks/volley </span> 下载完成后将它导入到你的Eclipse工程里,然后再导出一个jar包就可以了。如果你的电脑上没有Git,那么也可以直接使用我导出好的jar包,下载地址是:http://www.kwstu.com/ResourcesView/kwstu_201441183330928 。 新建一个Android项目,将volley.jar文件复制到libs目录下,这样准备工作就算是做好了。 3. StringRequest的用法 前面已经说过,Volley的用法非常简单,那么我们就从最基本的HTTP通信开始学习吧,即发起一条HTTP请求,然后接收HTTP响应。首先需要获取到一个RequestQueue对象,可以调用如下方法获取到: **[java]** [view plain](http://blog.csdn.net/guolin_blog/article/details/17482095#)[copy](http://blog.csdn.net/guolin_blog/article/details/17482095#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/284210)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/284210/fork) <div style="color: #000000;"> </div> </div> - <span style="color: black;">RequestQueue mQueue = Volley.newRequestQueue(context); </span> 注意这里拿到的RequestQueue是一个请求队列对象,它可以缓存所有的HTTP请求,然后按照一定的算法并发地发出这些请求。RequestQueue内部的设计就是非常合适高并发的,因此我们不必为每一次HTTP请求都创建一个RequestQueue对象,这是非常浪费资源的,基本上在每一个需要和网络交互的Activity中创建一个RequestQueue对象就足够了。 接下来为了要发出一条HTTP请求,我们还需要创建一个StringRequest对象,如下所示: **[java]** [view plain](http://blog.csdn.net/guolin_blog/article/details/17482095#)[copy](http://blog.csdn.net/guolin_blog/article/details/17482095#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/284210)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/284210/fork) <div style="color: #000000;"> </div> </div> - <span style="color: black;">StringRequest stringRequest = <span class="keyword" style="font-weight: bold; color: #006699;">new</span> StringRequest(<span class="string" style="color: blue;">&#8220;http://www.baidu.com&#8221;</span>, </span> - <span class="keyword" style="font-weight: bold; color: #006699;">new</span> Response.Listener<String>() { - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> onResponse(String response) { - <span style="color: black;"> Log.d(<span class="string" style="color: blue;">&#8220;TAG&#8221;</span>, response); </span> - } - <span style="color: black;"> }, <span class="keyword" style="font-weight: bold; color: #006699;">new</span> Response.ErrorListener() { </span> - <span class="annotation" style="color: #646464;">@Override</span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: #006699;">public</span> <span class="keyword" style="font-weight: bold; color: #006699;">void</span> onErrorResponse(VolleyError error) { </span> - Log.e(<span class="string" style="color: blue;">&#8220;TAG&#8221;</span>, error.getMessage(), error); - <span style="color: black;"> } </span> - }); 可以看到,这里new出了一个StringRequest对象,StringRequest的构造函数需要传入三个参数,第一个参数就是目标服务器的URL地址,第二个参数是服务器响应成功的回调,第三个参数是服务器响应失败的回调。其中,目标服务器地址我们填写的是百度的首页,然后在响应成功的回调里打印出服务器返回的内容,在响应失败的回调里打印出失败的详细信息。 ...

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

算法整理(二)—快速排序的两种实现方式:双边扫描和单边扫描

首先简单谈下快速排序的特点,时间复杂度O(nLog n),最差时间复杂度O(n^2),平均时间O(nLog n).因为用到了函数栈,空间复杂度为O(lg n),最差为O(n).是一种不稳定的排序方法。基本思想是分治法,这位大大的http://blog.csdn.net/morewindows/article/details/6684558 讲的非常清楚了,分治法+挖坑法,我就不多说了。就是以某个数为参照,使得左边的都小于他,右边的数都大于他。然后对他的左右两个区间采取同样的方法进行递归。 就其整体实现而言,有两大种思路,一是双边扫描,二是单边扫描。下面分别来上程序: 一、双边扫描 双边扫描是谭浩强书中的方法,个人觉得比下面的单边扫描更好理解,也是博文里采用的方法。下面看程序: **[cpp]** [view plain](http://blog.csdn.net/yanzi1225627/article/details/36045001#)[copy](http://blog.csdn.net/yanzi1225627/article/details/36045001#)[print](http://blog.csdn.net/yanzi1225627/article/details/36045001#)[?](http://blog.csdn.net/yanzi1225627/article/details/36045001#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/412329)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/412329/fork) <div> </div> </div> - <span style="color: black;"><span style=<span class="string" style="color: red;">&#8220;font-family:Comic Sans MS;font-size:18px;&#8221;</span>><span class="keyword" style="font-weight: bold; color: blue;">void</span> quickSort1(<span class="datatypes" style="font-weight: bold; color: #2e8b57;">int</span>* x, <span class="datatypes" style="font-weight: bold; color: #2e8b57;">int</span> l, <span class="datatypes" style="font-weight: bold; color: #2e8b57;">int</span> r){ </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(l < r){ </span> - <span style="color: black;"> <span class="datatypes" style="font-weight: bold; color: #2e8b57;">int</span> i = l, j = r, key = x[l]; </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">while</span>(i < j){ </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">while</span>( i < j && x[j] >= key){ </span> - <span style="color: black;"> j&#8211;; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(i < j){ </span> - <span style="color: black;"> x[i++] = x[j]; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">while</span>(i < j && x[i] <= key){ </span> - <span style="color: black;"> i++; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="font-weight: bold; color: blue;">if</span>(i < j){ </span> - <span style="color: black;"> x[j&#8211;] = x[i]; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> cout<<<span class="string" style="color: red;">&#8220;i = &#8220;</span> <<i<<<span class="string" style="color: red;">&#8221; j = &#8220;</span><<j<<endl; </span> - <span style="color: black;"> x[i] = key; </span> - <span style="color: black;"> quickSort1(x, l, i-1); </span> - <span style="color: black;"> quickSort1(x, i+1, r); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;">}</span> </span> 双边扫描非常直观,首先进到程序里判断是否l<r,当满足条件才进去。这也是用递归的一个必要条件,一定要让函数有尽头,有边界。然后进入大while循环,接着进入小while循环,先从右边找,只要满足数字大于key就一直让j往左移。直到第一个不满足条件的,就是第一个小于key的数跳出while循环,将它放在左边挖的“坑”上。同时让坑的索引+1,接着从左边开始扫描,找到第一个大于key的数,再将它填到右边的坑上。右边的坑索引-1,接着再从右边扫描。直到最后跳出大while循环,此时i = j。也就是完成了一次快速排序的扫描。之后将最初的key放到x[i],其实放到x[j]也是一样的。因为i等于j么,此时!然后进行递归,对区间[l, i – 1], [i+1, r]进行同样的操作。 ...

2014年10月27日 · 9 分钟 · 天边的星星