android之interpolator的用法详解

android:interpolator Interpolator 被用来修饰动画效果,定义动画的变化率,可以使存在的动画效果accelerated(加速),decelerated(减速),repeated(重复),bounced(弹跳)等。 android中的文档内容如下: ![](http://img.blog.csdn.net/20131117161350500?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamFzb24wNTM5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast) AccelerateDecelerateInterpolator 在动画开始与结束的地方速率改变比较慢,在中间的时候加速 AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速 AnticipateInterpolator 开始的时候向后然后向前甩 AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值 BounceInterpolator 动画结束的时候弹起 CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线 DecelerateInterpolator 在动画开始的地方快然后慢 LinearInterpolator 以常量速率改变 OvershootInterpolator 向前甩一定值后再回到原来位置 如果android定义的interpolators不符合你的效果也可以自定义interpolators   Android中的Interpolator nterpolator用于动画中的时间插值,其作用就是把0到1的浮点值变化映射到另一个浮点值变化。 本文列出Android API提供的Interpolator的若干种实现,列出源码,并且用一个程序绘制出其数学曲线。(项目链接附在文后)。 AccelerateDecelerateInterpolator ![复制代码](http://common.cnblogs.com/images/copycode.gif) ``` /** An interpolator where the rate of change starts and ends slowly but accelerates through the middle. */ public class AccelerateDecelerateInterpolator implements Interpolator { public AccelerateDecelerateInterpolator() { } @SuppressWarnings({"UnusedDeclaration"}) public AccelerateDecelerateInterpolator(Context context, AttributeSet attrs) { } public float getInterpolation(float input) { return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f; } } ...

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

用户手势检测-GestureDetector使用详解

一、概述 当用户触摸屏幕的时候,会产生许多手势,例如down,up,scroll,filing等等。 一般情况下,我们知道View类有个View.OnTouchListener内部接口,通过重写他的onTouch(View v, MotionEvent event)方法,我们可以处理一些touch事件,但是这个方法太过简单,如果需要处理一些复杂的手势,用这个接口就会很麻烦(因为我们要自己根据用户触摸的轨迹去判断是什么手势)。 Android sdk给我们提供了GestureDetector(Gesture:手势Detector:识别)类,通过这个类我们可以识别很多的手势,主要是通过他的onTouchEvent(event)方法完成了不同手势的识别。虽然他能识别手势,但是不同的手势要怎么处理,应该是提供给程序员实现的。 GestureDetector这个类对外提供了两个接口和一个外部类 接口:OnGestureListener,OnDoubleTapListener 内部类:SimpleOnGestureListener 这个外部类,其实是两个接口中所有函数的集成,它包含了这两个接口里所有必须要实现的函数而且都已经重写,但所有方法体都是空的;不同点在于:该类是static class,程序员可以在外部继承这个类,重写里面的手势处理方法。 下面我们先看OnGestureListener接口; 二、GestureDetector.OnGestureListener—接口 1、基本讲解 如果我们写一个类并implements OnGestureListener,会提示有几个必须重写的函数,加上之后是这个样子的: **[java]** [view plain](http://blog.csdn.net/harvic880925/article/details/39520901#)[copy](http://blog.csdn.net/harvic880925/article/details/39520901#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/475851)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/475851/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="keyword">private</span> <span class="keyword">class</span> gesturelistener <span class="keyword">implements</span> GestureDetector.OnGestureListener{ - - <span class="keyword">public</span> <span class="keyword">boolean</span> onDown(MotionEvent e) { - <span class="comment">// TODO Auto-generated method stub</span> - <span class="keyword">return</span> <span class="keyword">false</span>; - } - - <span class="keyword">public</span> <span class="keyword">void</span> onShowPress(MotionEvent e) { - <span class="comment">// TODO Auto-generated method stub</span> - - } - - <span class="keyword">public</span> <span class="keyword">boolean</span> onSingleTapUp(MotionEvent e) { - <span class="comment">// TODO Auto-generated method stub</span> - <span class="keyword">return</span> <span class="keyword">false</span>; - } - - <span class="keyword">public</span> <span class="keyword">boolean</span> onScroll(MotionEvent e1, MotionEvent e2, - <span class="keyword">float</span> distanceX, <span class="keyword">float</span> distanceY) { - <span class="comment">// TODO Auto-generated method stub</span> - <span class="keyword">return</span> <span class="keyword">false</span>; - } - - <span class="keyword">public</span> <span class="keyword">void</span> onLongPress(MotionEvent e) { - <span class="comment">// TODO Auto-generated method stub</span> - - } - - <span class="keyword">public</span> <span class="keyword">boolean</span> onFling(MotionEvent e1, MotionEvent e2, <span class="keyword">float</span> velocityX, - <span class="keyword">float</span> velocityY) { - <span class="comment">// TODO Auto-generated method stub</span> - <span class="keyword">return</span> <span class="keyword">false</span>; - } - - } 可见,这里总共重写了六个函数,这些函数都在什么情况下才会触发呢,下面讲一下: ...

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

Android Scroller简单用法

Android里Scroller类是为了实现View平滑滚动的一个Helper类。通常在自定义的View时使用,在View中定义一个私有成员mScroller = new Scroller(context)。设置mScroller滚动的位置时,并不会导致View的滚动,通常是用mScroller记录/计算View滚动的位置,再重写View的computeScroll(),完成实际的滚动。 相关API介绍如下 Java代码 <embed src="http://ipjmc.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" type="application/x-shockwave-flash" width="14" height="15"> </embed> <a title="收藏这段代码">![收藏代码](http://ipjmc.iteye.com/images/icon_star.png)</a> </div> - mScroller.getCurrX() <span class="comment">//获取mScroller当前水平滚动的位置</span> - mScroller.getCurrY() <span class="comment">//获取mScroller当前竖直滚动的位置</span> - mScroller.getFinalX() <span class="comment">//获取mScroller最终停止的水平位置</span> - mScroller.getFinalY() <span class="comment">//获取mScroller最终停止的竖直位置</span> - mScroller.setFinalX(<span class="keyword">int</span> newX) <span class="comment">//设置mScroller最终停留的水平位置,没有动画效果,直接跳到目标位置</span> - mScroller.setFinalY(<span class="keyword">int</span> newY) <span class="comment">//设置mScroller最终停留的竖直位置,没有动画效果,直接跳到目标位置</span> - - <span class="comment">//滚动,startX, startY为开始滚动的位置,dx,dy为滚动的偏移量, duration为完成滚动的时间</span> - mScroller.startScroll(<span class="keyword">int</span> startX, <span class="keyword">int</span> startY, <span class="keyword">int</span> dx, <span class="keyword">int</span> dy) <span class="comment">//使用默认完成时间250ms</span> - mScroller.startScroll(<span class="keyword">int</span> startX, <span class="keyword">int</span> startY, <span class="keyword">int</span> dx, <span class="keyword">int</span> dy, <span class="keyword">int</span> duration) - - mScroller.computeScrollOffset() <span class="comment">//返回值为boolean,true说明滚动尚未完成,false说明滚动已经完成。这是一个很重要的方法,通常放在View.computeScroll()中,用来判断是否滚动是否结束。</span> 举例说明,自定义一个CustomView,使用Scroller实现滚动: ...

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

Android 4.4从图库选择图片,获取图片路径并裁剪

 最近在做一个从图库选择图片或拍照,然后裁剪的功能.本来是没问题的,一直在用 **[java]** [view plain](http://blog.csdn.net/tempersitu/article/details/20557383#)[copy](http://blog.csdn.net/tempersitu/article/details/20557383#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/219069)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/219069/fork) - Intent intent=<span class="keyword">new</span> Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 的方式来做,是调用系统图库来做,但是发现如果有图片是同步到google相册的话,图库里面能看到一个auto backup的目录,点进去选图片的话是无法获取到图片的路径的.因为那些图片根本就不存在于手机上.然后看到无论是百度贴吧,Instagram,或者还有些会选取图片做修改的app,都是用一个很漂亮的图片选择器(4.4以上,4.3的还是用系统旧的图库). 而这个图片选择器可以屏蔽掉那个auto backup的目录.所以就开始打算用这个图片选择器来选图片了. 这个方法就是 **[java]** [view plain](http://blog.csdn.net/tempersitu/article/details/20557383#)[copy](http://blog.csdn.net/tempersitu/article/details/20557383#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/219069)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/219069/fork) - Intent intent=<span class="keyword">new</span> Intent(Intent.ACTION_GET_CONTENT);<span class="comment">//ACTION_OPEN_DOCUMENT</span> - intent.addCategory(Intent.CATEGORY_OPENABLE); - intent.setType(<span class="string">&#8220;image/jpeg&#8221;</span>); - <span class="keyword">if</span>(android.os.Build.VERSION.SDK_INT>=android.os.Build.VERSION_CODES.KITKAT){ - startActivityForResult(intent, SELECT_PIC_KITKAT); - }<span class="keyword">else</span>{ - startActivityForResult(intent, SELECT_PIC); - } 为什么要分开不同版本呢?其实在4.3或以下可以直接用ACTION_GET_CONTENT的,在4.4或以上,官方建议用ACTION_OPEN_DOCUMENT,但其实都不算太大区别,区别是他们返回的Uri,那个才叫大区别.这就是困扰了我一整天的问题所在了. 4.3或以下,选了图片之后,根据Uri来做处理,很多帖子都有了,我就不详细说了.主要是4.4,如果使用上面pick的原生方法来选图,返回的uri还是正常的,但如果用ACTION_GET_CONTENT的方法,返回的uri跟4.3是完全不一样的,4.3返回的是带文件路径的,而4.4返回的却是content://com.android.providers.media.documents/document/image:3951这样的,没有路径,只有图片编号的uri.这就导致接下来无法根据图片路径来裁剪的步骤了. 还好找了很多方法,包括加权限啊什么的,中间还试过用一些方法,自己的app没崩溃,倒是让系统图库崩溃了,引发了java.lang.SecurityException. **[java]** [view plain](http://blog.csdn.net/tempersitu/article/details/20557383#)[copy](http://blog.csdn.net/tempersitu/article/details/20557383#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/219069)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/219069/fork) - Caused by: java.lang.SecurityException: Permission Denial: opening provider com.android.providers.media.MediaDocumentsProvider from ProcessRecord{437b5d88 <span class="number">9494</span>:com.google.android.gallery3d/u0a20} (pid=<span class="number">9494</span>, uid=<span class="number">10020</span>) requires android.permission.MANAGE_DOCUMENTS or android.permission.MANAGE_DOCUMENTS 看来4.4的系统还是有些bug.重点来了,4.4得到的uri,需要以下方法来获取文件的路径 ...

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

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 分钟 · 天边的星星

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 分钟 · 天边的星星