Android获取短信验证码倒计时

目前越来越多的app在注册或是进行对应操作时,要求获取短信验证码,在点击了获取短信验证码的按钮后,就是出现倒计时,比如倒计时120S,在倒计时 期间内,按钮点击是无效的,当倒计时结束后,如果你没有获取到验证码,可以再次点击。实现倒计时的方法很多,我们今天就通过继承 android. os.CountDownTimer类来实现! 首先看下我们封装的倒计时工具类,主要为了在多个地方用到的话,用了多个构造方法,就是为了使用更灵活,只要传入对数就可以调用了: [?](http://www.open-open.com/code/view/1426335036826#) <table border="0" cellspacing="0" cellpadding="0"> <tr> <td class="gutter"> <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> <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> <div class="line number34 index33 alt1"> 34 </div> <div class="line number35 index34 alt2"> 35 </div> <div class="line number36 index35 alt1"> 36 </div> <div class="line number37 index36 alt2"> 37 </div> <div class="line number38 index37 alt1"> 38 </div> <div class="line number39 index38 alt2"> 39 </div> <div class="line number40 index39 alt1"> 40 </div> <div class="line number41 index40 alt2"> 41 </div> <div class="line number42 index41 alt1"> 42 </div> <div class="line number43 index42 alt2"> 43 </div> <div class="line number44 index43 alt1"> 44 </div> <div class="line number45 index44 alt2"> 45 </div> <div class="line number46 index45 alt1"> 46 </div> <div class="line number47 index46 alt2"> 47 </div> <div class="line number48 index47 alt1"> 48 </div> <div class="line number49 index48 alt2"> 49 </div> <div class="line number50 index49 alt1"> 50 </div> <div class="line number51 index50 alt2"> 51 </div> <div class="line number52 index51 alt1"> 52 </div> <div class="line number53 index52 alt2"> 53 </div> <div class="line number54 index53 alt1"> 54 </div> <div class="line number55 index54 alt2"> 55 </div> <div class="line number56 index55 alt1"> 56 </div> <div class="line number57 index56 alt2"> 57 </div> <div class="line number58 index57 alt1"> 58 </div> <div class="line number59 index58 alt2"> 59 </div> <div class="line number60 index59 alt1"> 60 </div> <div class="line number61 index60 alt2"> 61 </div> <div class="line number62 index61 alt1"> 62 </div> <div class="line number63 index62 alt2"> 63 </div> <div class="line number64 index63 alt1"> 64 </div> </td> <td class="code"> <div class="container"> <div class="line number1 index0 alt2"> `public` `class` `MyCountTimer ``extends` `CountDownTimer {` </div> <div class="line number2 index1 alt1"> `public` `static` `final` `int` `TIME_COUNT = ``121000``;``//时间防止从119s开始显示(以倒计时120s为例子)` </div> <div class="line number3 index2 alt2"> `private` `TextView btn;` </div> <div class="line number4 index3 alt1"> `private` `int` `endStrRid;` </div> <div class="line number5 index4 alt2"> `private` `int` `normalColor, timingColor;``//未计时的文字颜色,计时期间的文字颜色` </div> <div class="line number6 index5 alt1"> </div> <div class="line number7 index6 alt2"> `/**` </div> <div class="line number8 index7 alt1"> `* 参数 millisInFuture 倒计时总时间(如60S,120s等)` </div> <div class="line number9 index8 alt2"> `* 参数 countDownInterval 渐变时间(每次倒计1s)` </div> <div class="line number10 index9 alt1"> </div> <div class="line number11 index10 alt2"> ` ``* 参数 btn 点击的按钮(因为Button是TextView子类,为了通用我的参数设置为TextView)` </div> <div class="line number12 index11 alt1"> </div> <div class="line number13 index12 alt2"> ` ``* 参数 endStrRid 倒计时结束后,按钮对应显示的文字` </div> <div class="line number14 index13 alt1"> `*/` </div> <div class="line number15 index14 alt2"> `public` `MyCountTimer (``long` `millisInFuture, ``long` `countDownInterval, TextView btn, ``int` `endStrRid) {` </div> <div class="line number16 index15 alt1"> `super``(millisInFuture, countDownInterval);` </div> <div class="line number17 index16 alt2"> `this``.btn = btn;` </div> <div class="line number18 index17 alt1"> `this``.endStrRid = endStrRid;` </div> <div class="line number19 index18 alt2"> `}` </div> <div class="line number20 index19 alt1"> </div> <div class="line number21 index20 alt2"> </div> <div class="line number22 index21 alt1"> `/**` </div> <div class="line number23 index22 alt2"> </div> <div class="line number24 index23 alt1"> ` ``*参数上面有注释` </div> <div class="line number25 index24 alt2"> `*/` </div> <div class="line number26 index25 alt1"> `public` `MyCountTimer (TextView btn, ``int` `endStrRid) {` </div> <div class="line number27 index26 alt2"> `super``(TIME_COUNT, ``1000``);` </div> <div class="line number28 index27 alt1"> `this``.btn = btn;` </div> <div class="line number29 index28 alt2"> `this``.endStrRid = endStrRid;` </div> <div class="line number30 index29 alt1"> `}` </div> <div class="line number31 index30 alt2"> </div> <div class="line number32 index31 alt1"> `public` `MyCountTimer (TextView btn) {` </div> <div class="line number33 index32 alt2"> `super``(TIME_COUNT, ``1000``);` </div> <div class="line number34 index33 alt1"> `this``.btn = btn;` </div> <div class="line number35 index34 alt2"> `this``.endStrRid = R.string.txt_getMsgCode_validate;` </div> <div class="line number36 index35 alt1"> `}` </div> <div class="line number37 index36 alt2"> </div> <div class="line number38 index37 alt1"> </div> <div class="line number39 index38 alt2"> `public` `MyCountTimer (TextView tv_varify, ``int` `normalColor, ``int` `timingColor) {` </div> <div class="line number40 index39 alt1"> `this``(tv_varify);` </div> <div class="line number41 index40 alt2"> `this``.normalColor = normalColor;` </div> <div class="line number42 index41 alt1"> `this``.timingColor = timingColor;` </div> <div class="line number43 index42 alt2"> `}` </div> <div class="line number44 index43 alt1"> </div> <div class="line number45 index44 alt2"> `// 计时完毕时触发` </div> <div class="line number46 index45 alt1"> `@Override` </div> <div class="line number47 index46 alt2"> `public` `void` `onFinish() {` </div> <div class="line number48 index47 alt1"> `if``(normalColor &gt; ````){` </div> <div class="line number49 index48 alt2"> `btn.setTextColor(normalColor);` </div> <div class="line number50 index49 alt1"> `}` </div> <div class="line number51 index50 alt2"> `btn.setText(endStrRid);` </div> <div class="line number52 index51 alt1"> `btn.setEnabled(``true``);` </div> <div class="line number53 index52 alt2"> `}` </div> <div class="line number54 index53 alt1"> </div> <div class="line number55 index54 alt2"> `// 计时过程显示` </div> <div class="line number56 index55 alt1"> `@Override` </div> <div class="line number57 index56 alt2"> `public` `void` `onTick(``long` `millisUntilFinished) {` </div> <div class="line number58 index57 alt1"> `if``(timingColor &gt; ````){` </div> <div class="line number59 index58 alt2"> `btn.setTextColor(timingColor);` </div> <div class="line number60 index59 alt1"> `}` </div> <div class="line number61 index60 alt2"> `btn.setEnabled(``false``);` </div> <div class="line number62 index61 alt1"> `btn.setText(millisUntilFinished / ``1000` `+ ``"s"``);` </div> <div class="line number63 index62 alt2"> `}` </div> <div class="line number64 index63 alt1"> `}` </div> </div> </td> </tr> </table> ...

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

Android LayoutInflate深度解析 给你带来全新的认识

1、 题外话 相信大家对LayoutInflate都不陌生,特别在ListView的Adapter的getView方法中基本都会出现,使用inflate方法去加载一个布局,用于ListView的每个Item的布局。Inflate有三个参数,我在初学Android的时候这么理解的: 对于Inflate的三个参数(int resource, ViewGroup root, boolean attachToRoot) 如果inflate(layoutId, null )则layoutId的最外层的控件的宽高是没有效果的 如果inflate(layoutId, root, false ) 则认为和上面效果是一样的 如果inflate(layoutId, root, true ) 则认为这样的话layoutId的最外层控件的宽高才能正常显示 如果你也这么认为,那么你有就必要好好阅读这篇文章,因为这篇文章首先会验证上面的理解是 错误的 ,然后从源码角度去解释,最后会从ViewGroup与View的角度去解释。 2、 实践是验证真理的唯一标准 下面我写一个特别常见的例子来验证上面的理解是错误的,一个特别简单的ListView,每个Item中放一个按钮: Activity的布局文件: <span class="tag">&lt;<span class="title">ListView</span> <span class="attribute">xmlns:android</span>=<span class="value">"http://schemas.android.com/apk/res/android"</span> <span class="attribute">xmlns:tools</span>=<span class="value">"http://schemas.android.com/tools"</span> <span class="attribute">android:id</span>=<span class="value">"@+id/id_listview"</span> <span class="attribute">android:layout_width</span>=<span class="value">"fill_parent"</span> <span class="attribute">android:layout_height</span>=<span class="value">"wrap_content"</span> &gt;</span> <span class="tag">&lt;/<span class="title">ListView</span>&gt;</span> ListView的Item的布局文件: <span class="tag">&lt;<span class="title">Button</span> <span class="attribute">xmlns:android</span>=<span class="value">"http://schemas.android.com/apk/res/android"</span> <span class="attribute">xmlns:tools</span>=<span class="value">"http://schemas.android.com/tools"</span> <span class="attribute">android:id</span>=<span class="value">"@+id/id_btn"</span> <span class="attribute">android:layout_width</span>=<span class="value">"120dp"</span> <span class="attribute">android:layout_height</span>=<span class="value">"120dp"</span> &gt;</span> <span class="tag">&lt;/<span class="title">Button</span>&gt;</span> ListView的适配器: <span class="keyword">package</span> com.example.zhy_layoutinflater; <span class="keyword">import</span> java.util.List; <span class="keyword">import</span> android.content.Context; <span class="keyword">import</span> android.view.LayoutInflater; <span class="keyword">import</span> android.view.View; <span class="keyword">import</span> android.view.ViewGroup; <span class="keyword">import</span> android.widget.BaseAdapter; <span class="keyword">import</span> android.widget.Button; <span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">MyAdapter</span> <span class="keyword">extends</span> <span class="title">BaseAdapter</span> {</span> <span class="keyword">private</span> LayoutInflater mInflater; <span class="keyword">private</span> List&lt;String&gt; mDatas; <span class="keyword">public</span> MyAdapter(Context context, List&lt;String&gt; datas) { mInflater = LayoutInflater.from(context); mDatas = datas; } <span class="annotation">@Override</span> <span class="keyword">public</span> <span class="keyword">int</span> getCount() { <span class="keyword">return</span> mDatas.size(); } <span class="annotation">@Override</span> <span class="keyword">public</span> Object getItem(<span class="keyword">int</span> position) { <span class="keyword">return</span> mDatas.get(position); } <span class="annotation">@Override</span> <span class="keyword">public</span> <span class="keyword">long</span> getItemId(<span class="keyword">int</span> position) { <span class="keyword">return</span> position; } <span class="annotation">@Override</span> <span class="keyword">public</span> View getView(<span class="keyword">int</span> position, View convertView, ViewGroup parent) { ViewHolder holder = <span class="keyword">null</span>; <span class="keyword">if</span> (convertView == <span class="keyword">null</span>) { holder = <span class="keyword">new</span> ViewHolder(); convertView = mInflater.inflate(R.layout.item, <span class="keyword">null</span>); <span class="comment">// convertView = mInflater.inflate(R.layout.item, parent ,false);</span> <span class="comment">// convertView = mInflater.inflate(R.layout.item, parent ,true);</span> holder.mBtn = (Button) convertView.findViewById(R.id.id_btn); convertView.setTag(holder); } <span class="keyword">else</span> { holder = (ViewHolder) convertView.getTag(); } holder.mBtn.setText(mDatas.get(position)); <span class="keyword">return</span> convertView; } <span class="keyword">private</span> <span class="keyword">final</span> <span class="class"><span class="keyword">class</span> <span class="title">ViewHolder</span> {</span> Button mBtn; } } 主Activity: ...

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

Adapter的getViewTypeCount和getItemViewType 使用

通过本篇文章,让你掌握新的技巧,请不用只看看一点,希望能够看完,让你很快明白不同的使用场景 ListView 和 Adapter 的基础 工作原理: ListView 针对List中每个item,要求 adapter “给我一个视图” (getView)。 一个新的视图被返回并显示 如果我们有上亿个项目要显示怎么办?为每个项目创建一个新视图?NO!这不可能! 实际上Android为你缓存了视图。 Android中有个叫做Recycler的构件,下图是他的工作原理: 如果你有10亿个项目(item),其中只有可见的项目存在内存中,其他的在Recycler中。 ListView先请求一个type1视图(getView)然后请求其他可见的项目。convertView在getView中是空(null)的。 当item1滚出屏幕,并且一个新的项目从屏幕低端上来时,ListView再请求一个type1视图。convertView此时不是空值了,它的值是item1。你只需设定新的数据然后返回convertView,不必重新创建一个视图。 请看下面的示例代码,这里在getView中使用了System.out进行输出 [?](http://www.aitinan.com/3885.html#) <table border="0" cellspacing="0" cellpadding="0"> <tr> <td class="gutter"> <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> <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> <div class="line number34 index33 alt1"> 34 </div> <div class="line number35 index34 alt2"> 35 </div> <div class="line number36 index35 alt1"> 36 </div> <div class="line number37 index36 alt2"> 37 </div> <div class="line number38 index37 alt1"> 38 </div> <div class="line number39 index38 alt2"> 39 </div> <div class="line number40 index39 alt1"> 40 </div> <div class="line number41 index40 alt2"> 41 </div> <div class="line number42 index41 alt1"> 42 </div> <div class="line number43 index42 alt2"> 43 </div> <div class="line number44 index43 alt1"> 44 </div> <div class="line number45 index44 alt2"> 45 </div> <div class="line number46 index45 alt1"> 46 </div> <div class="line number47 index46 alt2"> 47 </div> <div class="line number48 index47 alt1"> 48 </div> <div class="line number49 index48 alt2"> 49 </div> <div class="line number50 index49 alt1"> 50 </div> <div class="line number51 index50 alt2"> 51 </div> <div class="line number52 index51 alt1"> 52 </div> <div class="line number53 index52 alt2"> 53 </div> <div class="line number54 index53 alt1"> 54 </div> <div class="line number55 index54 alt2"> 55 </div> <div class="line number56 index55 alt1"> 56 </div> <div class="line number57 index56 alt2"> 57 </div> <div class="line number58 index57 alt1"> 58 </div> <div class="line number59 index58 alt2"> 59 </div> <div class="line number60 index59 alt1"> 60 </div> <div class="line number61 index60 alt2"> 61 </div> <div class="line number62 index61 alt1"> 62 </div> <div class="line number63 index62 alt2"> 63 </div> <div class="line number64 index63 alt1"> 64 </div> <div class="line number65 index64 alt2"> 65 </div> </td> <td class="code"> <div class="container"> <div class="line number1 index0 alt2"> `public` `class` `MultipleItemsListextends ListActivity {` </div> <div class="line number2 index1 alt1"> ` ` </div> <div class="line number3 index2 alt2"> ` ``private` `MyCustomAdapter mAdapter;` </div> <div class="line number4 index3 alt1"> ` ` </div> <div class="line number5 index4 alt2"> ` ``@Override` </div> <div class="line number6 index5 alt1"> ` ``public` `void` `onCreate(Bundle savedInstanceState) {` </div> <div class="line number7 index6 alt2"> ` ``super``.onCreate(savedInstanceState);` </div> <div class="line number8 index7 alt1"> ` ``mAdapter = ``new` `MyCustomAdapter();` </div> <div class="line number9 index8 alt2"> ` ``for` `(``int` `i = ````; i &lt; ``50``; i++) {` </div> <div class="line number10 index9 alt1"> ` ``mAdapter.addItem(``"item "` `+ i);` </div> <div class="line number11 index10 alt2"> ` ``}` </div> <div class="line number12 index11 alt1"> ` ``setListAdapter(mAdapter);` </div> <div class="line number13 index12 alt2"> ` ``}` </div> <div class="line number14 index13 alt1"> ` ` </div> <div class="line number15 index14 alt2"> ` ``private` `class` `MyCustomAdapterextends BaseAdapter {` </div> <div class="line number16 index15 alt1"> ` ` </div> <div class="line number17 index16 alt2"> ` ``private` `ArrayList mData = ``new` `ArrayList();` </div> <div class="line number18 index17 alt1"> ` ``private` `LayoutInflater mInflater;` </div> <div class="line number19 index18 alt2"> ` ` </div> <div class="line number20 index19 alt1"> ` ``public` `MyCustomAdapter() {` </div> <div class="line number21 index20 alt2"> ` ``mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);` </div> <div class="line number22 index21 alt1"> ` ``}` </div> <div class="line number23 index22 alt2"> ` ` </div> <div class="line number24 index23 alt1"> ` ``public` `void` `addItem(``final` `String item) {` </div> <div class="line number25 index24 alt2"> ` ``mData.add(item);` </div> <div class="line number26 index25 alt1"> ` ``notifyDataSetChanged();` </div> <div class="line number27 index26 alt2"> ` ``}` </div> <div class="line number28 index27 alt1"> ` ` </div> <div class="line number29 index28 alt2"> ` ``@Override` </div> <div class="line number30 index29 alt1"> ` ``public` `int` `getCount() {` </div> <div class="line number31 index30 alt2"> ` ``return` `mData.size();` </div> <div class="line number32 index31 alt1"> ` ``}` </div> <div class="line number33 index32 alt2"> ` ` </div> <div class="line number34 index33 alt1"> ` ``@Override` </div> <div class="line number35 index34 alt2"> ` ``public` `String getItem(``int` `position) {` </div> <div class="line number36 index35 alt1"> ` ``return` `mData.get(position);` </div> <div class="line number37 index36 alt2"> ` ``}` </div> <div class="line number38 index37 alt1"> ` ` </div> <div class="line number39 index38 alt2"> ` ``@Override` </div> <div class="line number40 index39 alt1"> ` ``public` `long` `getItemId(``int` `position) {` </div> <div class="line number41 index40 alt2"> ` ``return` `position;` </div> <div class="line number42 index41 alt1"> ` ``}` </div> <div class="line number43 index42 alt2"> ` ` </div> <div class="line number44 index43 alt1"> ` ``@Override` </div> <div class="line number45 index44 alt2"> ` ``public` `View getView(``int` `position, View convertView, ViewGroup parent) {` </div> <div class="line number46 index45 alt1"> ` ``System.out.println(``"getView "` `+ position + ``" "` `+ convertView);` </div> <div class="line number47 index46 alt2"> ` ``ViewHolder holder = ``null``;` </div> <div class="line number48 index47 alt1"> ` ``if` `(convertView == ``null``) {` </div> <div class="line number49 index48 alt2"> ` ``convertView = mInflater.inflate(R.layout.item1, ``null``);` </div> <div class="line number50 index49 alt1"> ` ``holder = ``new` `ViewHolder();` </div> <div class="line number51 index50 alt2"> ` ``holder.textView = (TextView)convertView.findViewById(R.id.text);` </div> <div class="line number52 index51 alt1"> ` ``convertView.setTag(holder);` </div> <div class="line number53 index52 alt2"> ` ``}``else` `{` </div> <div class="line number54 index53 alt1"> ` ``holder = (ViewHolder)convertView.getTag();` </div> <div class="line number55 index54 alt2"> ` ``}` </div> <div class="line number56 index55 alt1"> ` ``holder.textView.setText(mData.get(position));` </div> <div class="line number57 index56 alt2"> ` ``return` `convertView;` </div> <div class="line number58 index57 alt1"> ` ``}` </div> <div class="line number59 index58 alt2"> ` ` </div> <div class="line number60 index59 alt1"> ` ``}` </div> <div class="line number61 index60 alt2"> ` ` </div> <div class="line number62 index61 alt1"> ` ``public` `static` `class` `ViewHolder {` </div> <div class="line number63 index62 alt2"> ` ``public` `TextView textView;` </div> <div class="line number64 index63 alt1"> ` ``}` </div> <div class="line number65 index64 alt2"> `}` </div> </div> </td> </tr> </table> </div> </div> </div> 执行程序,然后在Logcat中查看日志 ...

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

android TypedValue.applyDimension()的作用

android TypedValue.applyDimension()的作用 这个方法是转变为标准尺寸的一个函数,例如 int size = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20, context.getResources().getDisplayMetrics()); 这里COMPLEX_UNIT_SP是单位,20是数值,也就是20sp。 int size = (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 20, context.getResources().getDisplayMetrics()); 这里COMPLEX_UNIT_DIP是单位,20是数值,也就是20dp。

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

高仿微信对话列表滑动删除效果

转载:http://blog.csdn.net/singwhatiwanna/article/details/17515543 前言 用过微信的都知道,微信对话列表滑动删除效果是很不错的,这个效果我们也可以有。思路其实很简单,弄个ListView,然后里面的每个item做成一个可以滑动的自定义控件即可。由于ListView是上下滑动而item是左右滑动,因此会有滑动冲突,也许你需要了解下android中点击事件的派发流程,请参考Android源码分析-点击事件派发机制。我的解决思路是这样的:重写ListView的onInterceptTouchEvent方法,在move的时候做判断,如果是左右滑动就返回false,否则返回true;重写SlideView(即自定义item控件)的onTouchEvent方法来处理滑动。整个思路没有问题,滑动冲突也解决了,可是ListView无法得到焦点了,也就是ListView无法处理点击事件了。让我们回想下问题出在哪里:我的理解是这样的,上述处理滑动本身没有问题,但是有一个副作用,就是会让外层View失去焦点且无法处理点击事件。常见的滑动冲突场景,比如launcher内部嵌入ListView却是没有问题的,因为这个时候launcher不需要获得焦点,需要获得焦点的是内部的ListView。因此,上述处理方式对于外部需要获得焦点的情况(比如外部是ListView)就不太适合了。于是我就和ttdevs探讨,发现他采用了另外一种思路,我从来没有想过还可以这样玩。下面介绍他的思路。 新的思路 不考虑那么复杂,不采用主流玩法,所有的事件均由外层的ListView做拦截,同时把事件传递给SlideView做滑动,这种实现的确可以达到效果,而且代码很简单,根本不需要处理什么复杂的滑动冲突。 效果 下面分别为微信和高仿效果 代码分析 先看SlideView是如何实现的 看layout xml: **[html]** [view plain](http://blog.csdn.net/singwhatiwanna/article/details/17515543#)[copy](http://blog.csdn.net/singwhatiwanna/article/details/17515543#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/125514)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/125514/fork) - <span class="tag"><?</span><span class="tag-name">xml</span> <span class="attribute">version</span>=<span class="attribute-value">&#8220;1.0&#8221;</span> <span class="attribute">encoding</span>=<span class="attribute-value">&#8220;utf-8&#8221;</span><span class="tag">?></span> - <span class="tag"><</span><span class="tag-name">merge</span> <span class="attribute">xmlns:android</span>=<span class="attribute-value">&#8220;http://schemas.android.com/apk/res/android&#8221;</span> - <span class="attribute">android:layout_width</span>=<span class="attribute-value">&#8220;match_parent&#8221;</span> - <span class="attribute">android:layout_height</span>=<span class="attribute-value">&#8220;match_parent&#8221;</span> <span class="tag">></span> - - <span class="tag"><</span><span class="tag-name">LinearLayout</span> - <span class="attribute">android:id</span>=<span class="attribute-value">&#8220;@+id/view_content&#8221;</span> - <span class="attribute">android:layout_width</span>=<span class="attribute-value">&#8220;match_parent&#8221;</span> - <span class="attribute">android:layout_height</span>=<span class="attribute-value">&#8220;match_parent&#8221;</span> - <span class="attribute">android:orientation</span>=<span class="attribute-value">&#8220;horizontal&#8221;</span> <span class="tag">></span> - <span class="tag"></</span><span class="tag-name">LinearLayout</span><span class="tag">></span> - - <span class="tag"><</span><span class="tag-name">RelativeLayout</span> - <span class="attribute">android:id</span>=<span class="attribute-value">&#8220;@+id/holder&#8221;</span> - <span class="attribute">android:layout_width</span>=<span class="attribute-value">&#8220;120dp&#8221;</span> - <span class="attribute">android:layout_height</span>=<span class="attribute-value">&#8220;match_parent&#8221;</span> - <span class="attribute">android:clickable</span>=<span class="attribute-value">&#8220;true&#8221;</span> - <span class="attribute">android:background</span>=<span class="attribute-value">&#8220;@drawable/holder_bg&#8221;</span><span class="tag">></span> - - <span class="tag"><</span><span class="tag-name">TextView</span> - <span class="attribute">android:id</span>=<span class="attribute-value">&#8220;@+id/delete&#8221;</span> - <span class="attribute">android:layout_width</span>=<span class="attribute-value">&#8220;wrap_content&#8221;</span> - <span class="attribute">android:layout_height</span>=<span class="attribute-value">&#8220;wrap_content&#8221;</span> - <span class="attribute">android:drawableLeft</span>=<span class="attribute-value">&#8220;@drawable/del_icon_normal&#8221;</span> - <span class="attribute">android:layout_centerInParent</span>=<span class="attribute-value">&#8220;true&#8221;</span> - <span class="attribute">android:gravity</span>=<span class="attribute-value">&#8220;center&#8221;</span> - <span class="attribute">android:textColor</span>=<span class="attribute-value">&#8220;@color/floralwhite&#8221;</span> - <span class="attribute">android:text</span>=<span class="attribute-value">&#8220;删除&#8221;</span> <span class="tag">/></span> - <span class="tag"></</span><span class="tag-name">RelativeLayout</span><span class="tag">></span> - - <span class="tag"></</span><span class="tag-name">merge</span><span class="tag">></span> 上述xml文件中,所有的view都会被放在view_content中,而holder是放置诸如删除按钮之类的东西,我们的SlideView会加载这个布局。 ...

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

TCP密集IO吞吐压力测试工具

# [smark](http://www.cnblogs.com/smark/) [https://github.com/IKende/](https://github.com/IKende/) ## [TCP密集IO吞吐压力测试工具](http://www.cnblogs.com/smark/archive/2013/01/08/2850900.html) <div class="postText"> <div id="cnblogs_post_body"> 一 般在写一些网络服务应用的时候都比较关注服务在网络同时读写的能力,为了方便对这方面应用的测试所以写了这样一个测试的工具。工具的主要作用可以通过不同 的连接数来对一个服务应用进行一个读写压力请求,并实时查看当前IO的读写次数和每次请求的延时情况等。为大家介绍的这个工具是第二版,相对于第一版主要 引入了beetle 2.7提供更强的测试效能,在界面上也做了调整使其查看结果直观。 ## 工具应用界面 ![](http://images.cnitblog.com/blog/254151/201301/08122659-247f9367b4d44adb9053c7929de117b8.jpg) ### 功能简介 工具是测试服务端的网络读写能力,主要原理先向服务端发送一个请求,服务端根据请求进行一个应答;工具在得到应答后会再次进入下一次请求,通过这样一个循还来得到一个服务端的请求应答数量;用户可以根据自己的需要设置对应测试的连接数。 ### 发送数据定义 组件提供两种数据发送方式 String 通过UTF8对string编码后进行发送. base64String 由于工具不提供基于二制度的发送,所以提供一个基于base64String的发送方式,用户可以把需要发送的byte[]转成base64String即可。 添加头描述 如果有需要可以给发送数据添加一个int(4节字长度的头),其值是消息长度+4 ### 测试结果 工具并不会提供一个完全整的测试结果,它只反映服务端的应答情况,如:总请求数,秒应答数和每个连接请求延时等。这些结果只是反映出服务端的网络读写效能。对于怎样的一个数值才算是好呢,这个就要根据硬件来评定。以下提供一个E1230下的网络处理效能的结果参考 ![](http://images.cnitblog.com/blog/254151/201301/08124458-d5d82f98baed4cd4b996b80148bcf97d.jpg) [下载工具](http://blog.henryfan.net/file.axd?file=2013%2f1%2fTCPPerformanceTest1.2.rar) (运行环境.net 4.0) 对工具有什么意见可以提一下,我会进一步完善它。 </div> <div id="MySignature"> 个人站:[www.ikende.com](http://www.ikende.com/) 个人开源项目github.com/IKende [elastic communication component for .net](http://ec.ikende.com/) c#组件设计交流群:47164588 c# socket :136485198 微博http://weibo.com/ikende

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

android仿通讯录

friend.xml **[java]** [view plain](http://blog.csdn.net/csh159/article/details/8955029#)[copy](http://blog.csdn.net/csh159/article/details/8955029#)[print](http://blog.csdn.net/csh159/article/details/8955029#)[?](http://blog.csdn.net/csh159/article/details/8955029#) <div> <embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" type="application/x-shockwave-flash" width="29" height="15" align="middle" name="ZeroClipboardMovie_1"> </embed> </div> </div> - <?xml version=<span class="string">&#8220;1.0&#8221;</span> encoding=<span class="string">&#8220;utf-8&#8221;</span>?> - <LinearLayout xmlns:android=<span class="string">&#8220;http://schemas.android.com/apk/res/android&#8221;</span> - android:layout_width=<span class="string">&#8220;match_parent&#8221;</span> - android:layout_height=<span class="string">&#8220;match_parent&#8221;</span> - android:orientation=<span class="string">&#8220;vertical&#8221;</span> > - <RelativeLayout - android:layout_width=<span class="string">&#8220;fill_parent&#8221;</span> - android:layout_height=<span class="string">&#8220;fill_parent&#8221;</span> - android:orientation=<span class="string">&#8220;vertical&#8221;</span> > - - <ListView - android:id=<span class="string">&#8220;@+id/list_view&#8221;</span> - android:layout_width=<span class="string">&#8220;fill_parent&#8221;</span> - android:layout_height=<span class="string">&#8220;wrap_content&#8221;</span> - android:scrollbars=<span class="string">&#8220;none&#8221;</span> > - </ListView> - - <com.example.menu.MyLetterListView - android:id=<span class="string">&#8220;@+id/my_list_view&#8221;</span> - android:layout_width=<span class="string">&#8220;30dip&#8221;</span> - android:layout_height=<span class="string">&#8220;fill_parent&#8221;</span> - android:layout_alignParentRight=<span class="string">&#8220;true&#8221;</span> - /> - </RelativeLayout> - - </LinearLayout> friend_header.xml ...

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

把excel数据生成sql insert语句

excel表格中有A、B、C三列数据,希望导入到数据库users表中,对应的字段分别是name,sex,age 。 在你的excel表格中增加一列,利用excel的公式自动生成sql语句,方法如下: 1、增加一列(D列) 2、在第一行的D列,就是D1中输入公式: =CONCATENATE(&#8220;insert into users (name,sex,age) values (&#8216;&#8221;,A1,&#8221;&#8216;,'&#8221;,B1,&#8221;&#8216;,'&#8221;,C1,&#8221;&#8216;);&#8221;) 3、此时D1已经生成了如下的sql语句: &#8220;insert into users (name,sex,age) values (&#8216;ls&#8217;,&#8217;女&#8217;,&#8217;24&#8217;)&#8221;; 4、将D1的公式复制到所有行的D列 5、此时D列已经生成了所有的sql语句 6、把D列复制到一个纯文本文件中 7、去掉SQL语句的双引号

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

java中无符号类型的处理

在Java中,不存在Unsigned无符号数据类型,但可以轻而易举的完成Unsigned转换。 方案一:如果在Java中进行流(Stream)数据处理,可以用DataInputStream类对Stream中的数据以Unsigned读取。 Java在这方面提供了支持,可以用java.io.DataInputStream类对象来完成对流内数据的Unsigned读取,该类提供了如下方法:(1)int readUnsignedByte() //从流中读取一个0255(0xFF)的单字节数据,并以int数据类型的数据返回。返回的数据相当于C/C++语言中所谓的“BYTE”。(2)int readUnsignedShort() //从流中读取一个065535(0xFFFF)的双字节数据,并以int数据类型的数据返回。返回的数据相当于C/C++语言中所谓的“WORD”, 并且是以“低地址低字节”的方式返回的,所以程序员不需要额外的转换。 方案二:利用Java位运算符,完成Unsigned转换。 正常情况下,Java提供的数据类型是有符号signed类型的,可以通过位运算的方式得到它们相对应的无符号值,参见几个方法中的代码: public int getUnsignedByte (byte data){ //将data字节型数据转换为0255 (0xFF 即BYTE)。return data&0x0FF;} public int getUnsignedByte (short data){ //将data字节型数据转换为065535 (0xFFFF 即 WORD)。return data&0x0FFFF;} public long getUnsignedIntt (int data){ //将int数据转换为0~4294967295 (0xFFFFFFFF即DWORD)。return data&0x0FFFFFFFFl;} 灵活的运用这些技法,根本不存“二进制在Java中得不到全面支持”的论断!

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

Android Lock Pattern 源码解析

内容来自:https://github.com/android-cn/android-open-project-analysis 1. 介绍 1.1 关于 Android 的图案密码解锁,通过手势连接 3 * 3 的点矩阵绘制图案表示解锁密码。基于 Android Source Code。 1.2 特点 支持: Android 1.6+ (API 4+)。 无特殊依赖。 支持手机与平板的布局。 Stealth mode (invisible pattern)。 包含 5 种主题: Dark/Light Light with dark action bar (API 14+) Dark/Light dialogs 有验证码模式。 1.3 使用 1.3.1 Manifest 配置 <activity android:name="com.haibison.android.lockpattern.LockPatternActivity" android:theme="@style/Alp.42447968.Theme.Dark" /> 1.3.2 创建图形锁模式 private static final int REQ_CREATE_PATTERN = 1; Intent intent = new Intent(LockPatternActivity.ACTION_CREATE_PATTERN, null, your-context, LockPatternActivity.class); startActivityForResult(intent, REQ_CREATE_PATTERN); @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case REQ_CREATE_PATTERN: { if (resultCode == RESULT_OK) { char[] pattern = data.getCharArrayExtra( LockPatternActivity.EXTRA_PATTERN); ... } break; } } } 1.3.3 验证图形锁 private static final int REQ_ENTER_PATTERN = 2; char[] savedPattern = ... Intent intent = new Intent(LockPatternActivity.ACTION_COMPARE_PATTERN, null, your-context, LockPatternActivity.class); intent.putExtra(LockPatternActivity.EXTRA_PATTERN, savedPattern); startActivityForResult(intent, REQ_ENTER_PATTERN); @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { case REQ_ENTER_PATTERN: { switch (resultCode) { case RESULT_OK: // The user passed break; case RESULT_CANCELED: // The user cancelled the task break; case LockPatternActivity.RESULT_FAILED: // The user failed to enter the pattern break; case LockPatternActivity.RESULT_FORGOT_PATTERN: // The user forgot the pattern and invoked your recovery Activity. break; } int retryCount = data.getIntExtra( LockPatternActivity.EXTRA_RETRY_COUNT, 0); break; } } } 2. 总体设计 本项目较为简单,总体设计略过,具体实现请参考下面的分析。 ...

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