AndroidUI设计 之 图片浏览器

图片浏览器效果图 : 源码下载地址 : — CSDN : http://download.csdn.net/detail/han1202012/6875083 — GitHub : https://github.com/han1202012/AndroidPictureViewer.git . 作者 :**万境绝尘 ** 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . 一. 图片浏览器显示界面ImageView介绍 1. ImageView的上下继承结构 下面是API中的结构: [java.lang.Object](http://developer.android.com/reference/java/lang/Object.html) ↳ <td class="jd-inheritance-class-cell" colspan="2"> [android.view.View](http://developer.android.com/reference/android/view/View.html) </td> <td class="jd-inheritance-space"> </td> <td class="jd-inheritance-class-cell" colspan="1"> android.widget.ImageView </td> [![](http://developer.android.com/assets/images/triangle-closed.png)](http://developer.android.com/reference/android/widget/ImageView.html#)Known Direct Subclasses <div id="subclasses-direct"> <div id="subclasses-direct-list" class="jd-inheritedlinks"> [ImageButton](http://developer.android.com/reference/android/widget/ImageButton.html), [QuickContactBadge](http://developer.android.com/reference/android/widget/QuickContactBadge.html) </div> </div> </td> [![](http://developer.android.com/assets/images/triangle-closed.png)](http://developer.android.com/reference/android/widget/ImageView.html#)Known Indirect Subclasses <div id="subclasses-indirect"> <div id="subclasses-indirect-list" class="jd-inheritedlinks"> [ZoomButton](http://developer.android.com/reference/android/widget/ZoomButton.html) </div> </div> </td> ...

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

Android开发学习之ImageView手势拖拽、缩放、旋转

在Android应用中,图片随手势的拖拽、缩放、旋转在很多场景中都会用到,今天我们要做的就是在ImageView的基础上实现一个可以拖拽、缩放、转转的TouchView。 一、实现原理 OnTouch事件捕捉+Matrix矩阵变换 二、核心方法 拖拽:Matrix.postTranslate(DeltalX, DeltalY); 缩放:Matrix.postScale(mScale, mScale, mPoint.x, mPoint.y); 旋转:Matrix.postRotate(Angle, mPoint.x, mPoint.y); 三、具体实现 package com.Android.TouchView; /* * Android多点触控技术练习 * @Author:Robin * @Date:2013年12月29日 * @边界处理暂时不知道怎么写啊 * 目前的问题有: * 手势识别不是很顺畅,经常出现该放缩时放缩不了的情况 * 由于没有边界判断,程序可能会出现崩溃 */ import android.annotation.SuppressLint; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PaintFlagsDrawFilter; import android.graphics.PointF; import android.util.DisplayMetrics; import android.util.FloatMath; import android.view.MotionEvent; import android.widget.ImageView; @SuppressLint({ "ViewConstructor", "FloatMath" }) public class MultiTouchView extends ImageView { //本地图像资源 private int mDrawable; //图像位图 private Bitmap mBitmap; //屏幕宽度 private int ScreenWidth; //屏幕高度 private int ScreenHeight; //原始图像矩阵 private Matrix mMatrix=new Matrix(); //过程图像矩阵 private Matrix mSavedMatrix=new Matrix(); //结果图像矩阵 private Matrix mResultMatrix=new Matrix(); //定义三种模式:None、Drag、Zoom public static final int Mode_None=0; public static final int Mode_Drag=1; public static final int Mode_Zoom=2; //当前操作模式 private int mMode=Mode_None; //当前坐标 private float mDownX,mDownY; //存储两点间的距离 private float mDistance=0f; //存储旋转角 @SuppressWarnings("unused") private float mAngle=0f; //存储中点 private PointF mPoint; //最大缩放比例 //private float MaxScale=3f; //最小缩放比例 //private float MinScale=0.5f; public MultiTouchView(Activity mActivity ,int Drawable) { super(mActivity); //设置当前图片资源 this.mDrawable=Drawable; //获取Bitmap mBitmap=BitmapFactory.decodeResource(getResources(), mDrawable); DisplayMetrics dm=new DisplayMetrics(); mActivity.getWindowManager().getDefaultDisplay().getMetrics(dm); //获取屏幕宽度和高度 ScreenWidth=dm.widthPixels; ScreenHeight=dm.heightPixels; mMatrix=new Matrix(); } @SuppressLint("DrawAllocation") @Override protected void onDraw(Canvas canvas) { //消除图像锯齿 canvas.setDrawFilter(new PaintFlagsDrawFilter(0,Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG)); canvas.save(); //绘制图像 canvas.drawBitmap(mBitmap, mMatrix, null); canvas.restore(); } @Override public boolean onTouchEvent(MotionEvent Event) { switch(Event.getAction()) { //单点触控处理 case MotionEvent.ACTION_DOWN: //设置当前操作模式为Drag mMode=Mode_Drag; //获取当前坐标 mDownX=Event.getX(); mDownY=Event.getY(); mSavedMatrix.set(mMatrix); break; //多点触控处理 case MotionEvent.ACTION_POINTER_DOWN: mMode=Mode_Zoom; //获取两点间距离 mDistance=getDistance(Event); //获取旋转角 mAngle=getAngle(Event); //获取中点 mPoint=getMidPoint(Event); mSavedMatrix.set(mMatrix); break; case MotionEvent.ACTION_MOVE: //缩放处理 if(mMode==Mode_Zoom) { mResultMatrix.set(mSavedMatrix); //获取缩放比率 float mScale=getDistance(Event)/mDistance; //获取旋转角,这里可以不用 //float Angle=getAngle(Event)-mAngle; //以中点为中心,进行缩放 mResultMatrix.postScale(mScale, mScale, mPoint.x, mPoint.y); //以中点为中心,进行旋转,这里可以不用 //mResultMatrix.postRotate(Angle, mPoint.x, mPoint.y); mMatrix.set(mResultMatrix); invalidate(); }else if(mMode==Mode_Drag)//平移处理 { mResultMatrix.set(mSavedMatrix); //计算平移量 float DeltalX=Event.getX()-mDownX; float DeltalY=Event.getY()-mDownY; //平移 mResultMatrix.postTranslate(DeltalX, DeltalY); mMatrix.set(mResultMatrix); invalidate(); } break; case MotionEvent.ACTION_UP: //这里要不要处理呢,如果需要,怎么办 case MotionEvent.ACTION_POINTER_UP: mMode = Mode_None; break; } return true; } //返回两点间的距离 public float getDistance(MotionEvent Event) { //计算X的变化量 float DeltalX=Event.getX(0)-Event.getX(1); //计算Y的变化量 float DeltalY=Event.getY(0)-Event.getY(1); //计算距离 return FloatMath.sqrt(DeltalX*DeltalX+DeltalY*DeltalY); } //返回两点的中点 @SuppressLint("FloatMath") public PointF getMidPoint(MotionEvent Event) { float X=Event.getX(0)+Event.getX(1); float Y=Event.getY(0)+Event.getY(1); return new PointF(X/2,Y/2); } //获得旋转角 public float getAngle(MotionEvent Event) { double DeltalX=Event.getX(0)-Event.getX(1); double DeltalY=Event.getY(0)-Event.getY(1); return (float)Math.atan2(DeltalX, DeltalY); } //边界处理,暂时没找到比较好的方法 public boolean CheckBounary() { return false; } //存储当前图片 public Bitmap SaveImage() { Bitmap mBitmap = Bitmap.createBitmap(ScreenWidth, ScreenHeight,Config.ARGB_8888); Canvas mCanvas = new Canvas(mBitmap); mCanvas.drawBitmap(mBitmap, mMatrix, null); mCanvas.save(Canvas.ALL_SAVE_FLAG); mCanvas.restore(); return mBitmap; } } ...

2014年12月18日 · 2 分钟 · 天边的星星

Android中用Matrix实现ImageView里的图片平移和缩放动画

注: 这里说的图片的平移和缩放不是对ImageView整个view进行的,而是对ImageView里面的图片进行的(view本身没有什么变化),所以Android自带的动画效果不能满足需求。 **功能点**: 1、一开始可以像centerCrop一样显示图片(觉得scaleType为centerCrop时显示效果比较好,图片会铺满整个View,而且图片本身的分辨率不变) 2、对ImageView里的图片平移或放大 3、将这个平移或放大做成一个动画效果 **一、在ScaleType为matrix的情况下实现centerCrop的显示效果** 要充分利用Android的源码,看ImageView的源代码就可以简单很多,在configureBounds()方法中: ![Android中用Matrix实现ImageView里的图片平移和缩放动画 - Johnny - Lucky Johnnys blog](http://img1.ph.126.net/0bRpjujvQhurl7HNuYa99g==/4826169950781049609.png) 不过为了之后的平移,要保证图片的宽度比View的宽度大 <span class="kwd">public</span> <span class="kwd">void</span><span class="pln"> setImage </span><span class="pun">(</span> <span class="typ">Drawable</span><span class="pln"> drawable </span><span class="pun">)</span> <span class="pun">{</span> <span class="kwd">if</span> <span class="pun">(</span> <span class="kwd">null</span> <span class="pun">==</span><span class="pln"> drawable </span><span class="pun">)</span> <span class="kwd">return</span><span class="pun">;</span> <span class="kwd">int</span><span class="pln"> dwidth </span><span class="pun">=</span><span class="pln"> drawable</span><span class="pun">.</span><span class="pln">getIntrinsicWidth </span><span class="pun">();</span> <span class="kwd">int</span><span class="pln"> dheight </span><span class="pun">=</span><span class="pln"> drawable</span><span class="pun">.</span><span class="pln">getIntrinsicHeight </span><span class="pun">();</span> <span class="kwd">int</span><span class="pln"> vwidth </span><span class="pun">=</span><span class="pln"> mWidth</span><span class="pun">;</span> <span class="kwd">int</span><span class="pln"> vheight </span><span class="pun">=</span><span class="pln"> mHeight</span><span class="pun">;</span> <span class="kwd">float</span><span class="pln"> scale </span><span class="pun">=</span> <span class="lit">1.0f</span><span class="pun">;</span> <span class="kwd">float</span><span class="pln"> dx </span><span class="pun">=</span> <span class="lit"></span><span class="pun">,</span><span class="pln"> dy </span><span class="pun">=</span> <span class="lit"></span><span class="pun">;</span> <span class="kwd">if</span> <span class="pun">(</span><span class="pln"> dwidth </span><span class="pun">*</span><span class="pln"> vheight </span><span class="pun">></span><span class="pln"> vwidth </span><span class="pun">*</span><span class="pln"> dheight </span><span class="pun">)</span> <span class="pun">{</span> <span class="pln"> scale </span><span class="pun">=</span> <span class="pun">(</span> <span class="kwd">float</span> <span class="pun">)</span><span class="pln"> vheight </span><span class="pun">/</span> <span class="pun">(</span> <span class="kwd">float</span> <span class="pun">)</span><span class="pln"> dheight</span><span class="pun">;</span> <span class="pln"> dx </span><span class="pun">=</span> <span class="pun">(</span><span class="pln"> vwidth </span><span class="pun">&#8211;</span><span class="pln"> dwidth </span><span class="pun">*</span><span class="pln"> scale </span><span class="pun">)</span> <span class="pun">*</span> <span class="lit">0.5f</span> <span class="pun">+</span> <span class="lit">0.5f</span><span class="pun">;</span> <span class="pun">}</span> <span class="kwd">else</span> <span class="pun">{</span> <span class="pln"> scale </span><span class="pun">=</span> <span class="pun">(</span> <span class="kwd">float</span> <span class="pun">)</span><span class="pln"> vwidth </span><span class="pun">/</span> <span class="pun">(</span> <span class="kwd">float</span> <span class="pun">)</span><span class="pln"> dwidth</span><span class="pun">;</span> <span class="pln"> dy </span><span class="pun">=</span> <span class="pun">(</span><span class="pln"> vheight </span><span class="pun">&#8211;</span><span class="pln"> dheight </span><span class="pun">*</span><span class="pln"> scale </span><span class="pun">)</span> <span class="pun">*</span> <span class="lit">0.5f</span> <span class="pun">+</span> <span class="lit">0.5f</span><span class="pun">;</span> <span class="pun">}</span> <span class="kwd">if</span> <span class="pun">(</span><span class="pln"> dwidth </span><span class="pun">*</span><span class="pln"> scale </span><span class="pun"><</span> <span class="lit">2</span> <span class="pun">*</span><span class="pln"> vwidth </span><span class="pun">)</span> <span class="pun">{</span> <span class="pln"> scale </span><span class="pun">=</span> <span class="pun">(</span> <span class="kwd">float</span> <span class="pun">)</span><span class="pln"> vwidth </span><span class="pun">/</span> <span class="pun">(</span> <span class="lit">2.0f</span> <span class="pun">*</span><span class="pln"> dwidth </span><span class="pun">);</span> <span class="pln"> dx </span><span class="pun">=</span> <span class="pun">&#8211;</span><span class="pln"> dwidth </span><span class="pun">/</span> <span class="lit">2</span><span class="pun">;</span> <span class="pln"> dy </span><span class="pun">=</span> <span class="pun">(</span><span class="pln"> vheight </span><span class="pun">&#8211;</span><span class="pln"> dheight </span><span class="pun">*</span><span class="pln"> scale </span><span class="pun">)</span> <span class="pun">*</span> <span class="lit">0.5f</span> <span class="pun">+</span> <span class="lit">0.5f</span><span class="pun">;</span> <span class="pun">}</span> <span class="typ">Matrix</span><span class="pln"> matrix </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">Matrix</span> <span class="pun">();</span> <span class="pln"> matrix</span><span class="pun">.</span><span class="pln">setScale </span><span class="pun">(</span><span class="pln"> scale</span><span class="pun">,</span><span class="pln"> scale </span><span class="pun">);</span> <span class="pln"> matrix</span><span class="pun">.</span><span class="pln">postTranslate </span><span class="pun">(</span><span class="pln"> dx</span><span class="pun">,</span><span class="pln"> dy </span><span class="pun">);</span> <span class="pln"> mImage</span><span class="pun">.</span><span class="pln">setImageMatrix </span><span class="pun">(</span><span class="pln"> matrix </span><span class="pun">);</span> <span class="pln"> mImage</span><span class="pun">.</span><span class="pln">setImageDrawable </span><span class="pun">(</span><span class="pln"> drawable </span><span class="pun">);</span> <span class="pun">}</span> <span class="com">// vwidth和vheight使用确定的值,因为如果在应用初始化时view.getWidth()可能为0</span> **二、利用Matrix实现平移和放大** 平移和放大都是在当前图片的基础上,先用mImage.getImageMatrix()得到当前的matrix,再用Matrix的postTranslate或postScale方法就可以了。 需要注意的是: 如果用Matrix matrix = mImage.getImageMatrix (); //matrix只是得到一个对象的引用 应该用Matrix matrix = new Matrix ( mImage.getImageMatrix () );//这样才是得到一个克隆对象 **三、用ValueAnimator实现动画效果** 1、平移 dx为负是向左平移,为正是向右平移 因为图片的宽度设置为至少是view的2倍,所以向左和向右平移的最大距离都是vwidth / 2。 <span class="kwd">private</span> <span class="kwd">class</span> <span class="typ">MyTransXAnimatorListener</span> <span class="kwd">implements</span> <span class="typ">AnimatorUpdateListener</span> <span class="pun">{</span> <span class="kwd">private</span> <span class="typ">Matrix</span><span class="pln"> mPrimaryMatrix</span><span class="pun">;</span> <span class="kwd">public</span> <span class="typ">MyTransXAnimatorListener</span> <span class="pun">(</span> <span class="typ">Matrix</span><span class="pln"> matrix </span><span class="pun">)</span> <span class="pun">{</span> <span class="pln"> mPrimaryMatrix </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">Matrix</span> <span class="pun">(</span><span class="pln"> matrix </span><span class="pun">);</span> <span class="pun">}</span> <span class="lit">@Override</span> <span class="kwd">public</span> <span class="kwd">void</span><span class="pln"> onAnimationUpdate </span><span class="pun">(</span> <span class="typ">ValueAnimator</span><span class="pln"> animation </span><span class="pun">)</span> <span class="pun">{</span> <span class="kwd">int</span><span class="pln"> dx </span><span class="pun">=</span> <span class="pun">(</span> <span class="typ">Integer</span> <span class="pun">)</span><span class="pln"> animation</span><span class="pun">.</span><span class="pln">getAnimatedValue </span><span class="pun">();</span> <span class="typ">Matrix</span><span class="pln"> matrix </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">Matrix</span> <span class="pun">(</span><span class="pln"> mPrimaryMatrix </span><span class="pun">);</span> <span class="pln"> matrix</span><span class="pun">.</span><span class="pln">postTranslate </span><span class="pun">(</span><span class="pln"> dx</span><span class="pun">,</span> <span class="lit"></span> <span class="pun">);</span> <span class="pln"> mImage</span><span class="pun">.</span><span class="pln">setImageMatrix </span><span class="pun">(</span><span class="pln"> matrix </span><span class="pun">);</span> <span class="pun">}</span> <span class="pun">}</span> <span class="kwd">public</span> <span class="kwd">void</span><span class="pln"> setTranslateAnimation </span><span class="pun">()</span> <span class="pun">{</span> <span class="typ">ValueAnimator</span><span class="pln"> animator </span><span class="pun">=</span> <span class="typ">ValueAnimator</span><span class="pun">.</span><span class="pln">ofInt </span><span class="pun">(</span> <span class="lit"></span><span class="pun">,</span> <span class="pun">&#8211;</span> <span class="lit">60</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">addUpdateListener </span><span class="pun">(</span> <span class="kwd">new</span> <span class="typ">MyTransXAnimatorListener</span> <span class="pun">(</span><span class="pln"> mImage</span><span class="pun">.</span><span class="pln">getImageMatrix</span><span class="pun">()</span> <span class="pun">)</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">setDuration </span><span class="pun">(</span> <span class="lit">1000</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">setInterpolator </span><span class="pun">(</span> <span class="kwd">new</span> <span class="typ">DecelerateInterpolator</span> <span class="pun">()</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">setStartDelay </span><span class="pun">(</span> <span class="lit">500</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">start </span><span class="pun">();</span> <span class="pun">}</span> 2、放大 放大要设置中心点为ImageView的中心 <span class="kwd">private</span> <span class="kwd">class</span> <span class="typ">MyScaleAnimatorListener</span> <span class="kwd">implements</span> <span class="typ">AnimatorUpdateListener</span> <span class="pun">{</span> <span class="kwd">private</span> <span class="typ">Matrix</span><span class="pln"> mPrimaryMatrix</span><span class="pun">;</span> <span class="kwd">public</span> <span class="typ">MyScaleAnimatorListener</span> <span class="pun">(</span> <span class="typ">Matrix</span><span class="pln"> matrix </span><span class="pun">)</span> <span class="pun">{</span> <span class="pln"> mPrimaryMatrix </span><span class="pun">=</span><span class="pln"> matrix</span><span class="pun">;</span> <span class="pun">}</span> <span class="lit">@Override</span> <span class="kwd">public</span> <span class="kwd">void</span><span class="pln"> onAnimationUpdate </span><span class="pun">(</span> <span class="typ">ValueAnimator</span><span class="pln"> animation </span><span class="pun">)</span> <span class="pun">{</span> <span class="kwd">float</span><span class="pln"> scale </span><span class="pun">=</span> <span class="pun">(</span> <span class="typ">Float</span> <span class="pun">)</span><span class="pln"> animation</span><span class="pun">.</span><span class="pln">getAnimatedValue </span><span class="pun">();</span> <span class="typ">Matrix</span><span class="pln"> matrix </span><span class="pun">=</span> <span class="kwd">new</span> <span class="typ">Matrix</span> <span class="pun">(</span><span class="pln"> mPrimaryMatrix </span><span class="pun">);</span> <span class="pln"> matrix</span><span class="pun">.</span><span class="pln">postScale </span><span class="pun">(</span><span class="pln"> scale</span><span class="pun">,</span><span class="pln"> scale</span><span class="pun">,</span><span class="pln"> mWidth </span><span class="pun">/</span> <span class="lit">2</span><span class="pun">,</span><span class="pln"> mHeight </span><span class="pun">/</span> <span class="lit">2</span> <span class="pun">);</span> <span class="pln"> mImage</span><span class="pun">.</span><span class="pln">setImageMatrix </span><span class="pun">(</span><span class="pln"> matrix </span><span class="pun">);</span> <span class="pun">}</span> <span class="pun">}</span> <span class="kwd">public</span> <span class="kwd">void</span><span class="pln"> setScaleAnimation </span><span class="pun">()</span> <span class="pun">{</span> <span class="typ">ValueAnimator</span><span class="pln"> animator </span><span class="pun">=</span> <span class="typ">ValueAnimator</span><span class="pun">.</span><span class="pln">ofFloat </span><span class="pun">(</span> <span class="lit">1.0f</span><span class="pun">,</span> <span class="lit">1.2f</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">addUpdateListener </span><span class="pun">(</span> <span class="kwd">new</span> <span class="typ">MyScaleAnimatorListener</span> <span class="pun">(</span><span class="pln"> mImage</span><span class="pun">.</span><span class="pln">getImageMatrix </span><span class="pun">()</span> <span class="pun">)</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">setDuration </span><span class="pun">(</span> <span class="lit">1000</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">setInterpolator </span><span class="pun">(</span> <span class="kwd">new</span> <span class="typ">DecelerateInterpolator</span> <span class="pun">()</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">setStartDelay </span><span class="pun">(</span> <span class="lit">500</span> <span class="pun">);</span> <span class="pln"> animator</span><span class="pun">.</span><span class="pln">start </span><span class="pun">();</span> <span class="pun">}</span> 转自:http://xie2010.blog.163.com/blog/static/2113173652014221240951/

2014年12月18日 · 5 分钟 · 天边的星星

Android浏览图片,点击放大至全屏效果

最近做一个项目类似于QQ空间,做到照片浏览的功能,对于QQ空间中点击图片放大至全屏,感觉效果很赞,于是也做了个类似的效果。如下。 我不知道QQ那个是怎么做的,我的思路如下: 首先,从图片缩略界面跳转到图片详情页面,应该是从一个Activity跳转到另外一个Activity,应该图片详情页面也有很多操作,用View或者Dialog不是很好。所以现在难点就是,如何使得前一个界面的ImageView在另外一个界面做缩放切割动画。 一般缩略界面的ImageView的是如上图所示的正方形的,并且是CENTER_CROP缩放属性的。CENTER_CROP属性会导致ImageView中显示的Bitmap有被切割达到填充的效果。 而详情页面的ImageView一般都是FIT_CENTER的缩放属性。所以要保证这个跳转动画的流畅,要做如下的变化: 1、Bitmap的缩放,因为缩略图和详情图的缩放比例肯定不一样 2、Bitmap位置的平移,因为缩略图的位置是不确定的,我们要使他平移到中间 3、Bitmap的切割,因为CENTER_CROP是切割过得,而FIT_CENTER是没有切割的,那么两幅图显示的内容区域是不同的,所以也要显示区域的平滑变换。 要完成上面的效果,如果单单是指对ImageView做一个动画变换,我觉得是完成不了这个要求的。所以自己重写了ImageView来完成上述的变换。 直接贴上主要的ImageView **[java]** [view plain](http://blog.csdn.net/lonelyroamer/article/details/25497737#)[copy](http://blog.csdn.net/lonelyroamer/article/details/25497737#)[![在CODE上查看代码片](https://code.csdn.net/assets/CODE_ico.png)](https://code.csdn.net/snippets/338428)[![派生到我的代码片](https://code.csdn.net/assets/ico_fork.svg)](https://code.csdn.net/snippets/338428/fork) package com.roamer.ui.view; import android.animation.Animator; import android.animation.PropertyValuesHolder; ...

2014年12月17日 · 6 分钟 · 天边的星星

Android Studio安装以及Fetching android sdk component information超时的解决方案

在经过两年的开发之本后,Google 公司终于发布了 Android Studio 1.0,喜欢折腾的童鞋们,抓紧折腾吧。。。。。 一、下载Android Studio 1.0: 1)可以在谷歌Android官网下载Android Studio 1.0(链接)。下载不了的童鞋可以到百度网盘上下载(链接)。 2)下载后,Android Studio 1.0 二、安装Android Studio 1.0: <span style="color: #0000ff;"> <span style="color: #000000;">1)直接双击![](http://images.cnitblog.com/blog/695756/201412/100950433845238.png)进行安装。</span></span> <span style="color: #0000ff;"><span style="color: #000000;"> 2)直接一直下一步就可以。中间如果想修改安装目录的可以进行修改:</span></span> <span style="color: #0000ff;"><span style="color: #000000;"> ![](http://images.cnitblog.com/blog/695756/201412/100953418063713.png) </span></span> # <span style="color: #0000ff;">三、解决Fetching android sdk component information加载过久问题</span> <span style="color: #0000ff;"><span style="color: #000000;"> 安装完成后,如果直接启动,Android Studio会去获取 android sdk 组件信息,这个过程相当慢,还经常加载失败,导致Android Studio启动不起开。解决办法就是不去获取android sdk 组件信息。方法如下:</span></span> <span style="color: #0000ff;"><span style="color: #000000;"> 1)进入刚安装的Android Studio目录下的bin目录。找到idea.properties文件,用文本编辑器打开。</span></span> <span style="color: #0000ff;"><span style="color: #000000;"> 2)在idea.properties文件末尾添加一行:<span style="color: #ff0000;">disable.android.first.run=true</span>,然后保存文件。</span></span> <span style="color: #0000ff;"><span style="color: #000000;"> 3)关闭Android Studio后重新启动,便可进入界面。</span></span> <span style="color: #0000ff;"><span style="color: #000000;"> ![](http://images.cnitblog.com/blog/695756/201412/101004062754693.png)</span></span> # <span style="color: #0000ff;">四、新建一个Android工程项目</span> <span style="color: #0000ff;"><span style="color: #000000;"> 1)启动Android Studio后的界面:</span></span> <span style="color: #0000ff;"><span style="color: #000000;"> ![](http://images.cnitblog.com/blog/695756/201412/101004436962892.png)</span></span> <span style="color: #ff0000;">备注:这里需要配置下sdk,感谢博客园朋友们的提醒:</span> a、点击进入configure: ![](http://images.cnitblog.com/blog/695756/201412/101957450712770.png) b、进入界面后,再点击project Defaults: ![](http://images.cnitblog.com/blog/695756/201412/101959196185054.png) c、进入界面后,再点击Project Structure: ![](http://images.cnitblog.com/blog/695756/201412/102002137759526.png) d、进入界面后,设置Android SDK和JDK的路径。 ![](http://images.cnitblog.com/blog/695756/201412/102003264781538.png) 2)点击start a new android studio project,创建一个Android项目(可以修改工程的工作空间) ![](http://images.cnitblog.com/blog/695756/201412/101009122288363.png) 3)直接下一步 ![](http://images.cnitblog.com/blog/695756/201412/101011291038680.png) 4)再下一步 ![](http://images.cnitblog.com/blog/695756/201412/101012503219925.png) 5)再下一步 ![](http://images.cnitblog.com/blog/695756/201412/101014228535095.png) 6)点击finish完成工程项目的创建。工程项目整体结构如下: ![](http://images.cnitblog.com/blog/695756/201412/101016289159573.png) <span style="color: #0000ff;">完,</span> 转自:http://www.cnblogs.com/sonyi/p/4154797.html

2014年12月16日 · 1 分钟 · 天边的星星

Android HTTPS详解

前言 最近有一个跟Https相关的问题需要解决,因此花时间学习了一下Android平台Https的使用,同时也看了一些Https的原理,这里分享一下学习心得。 HTTPS原理 HTTPS(Hyper Text Transfer Protocol Secure),是一种基于SSL/TLS的HTTP,所有的HTTP数据都是在SSL/TLS协议封装之上进行传输的。HTTPS协议是在HTTP协议的基础上,添加了SSL/TLS握手以及数据加密传输,也属于应用层协议。所以,研究HTTPS协议原理,最终其实就是研究SSL/TLS协议。 SSL/TLS协议作用 不使用SSL/TLS的HTTP通信,就是不加密的通信,所有的信息明文传播,带来了三大风险: 窃听风险:第三方可以获知通信内容。 篡改风险:第三方可以修改通知内容。 冒充风险:第三方可以冒充他人身份参与通信。 SSL/TLS协议是为了解决这三大风险而设计的,希望达到: 所有信息都是加密传输,第三方无法窃听。 具有校验机制,一旦被篡改,通信双方都会立刻发现。 配备身份证书,防止身份被冒充。 基本的运行过程 SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。但是这里需要了解两个问题的解决方案。 如何保证公钥不被篡改? 解决方法:将公钥放在数字证书中。只要证书是可信的,公钥就是可信的。 公钥加密计算量太大,如何减少耗用的时间? 解决方法:每一次对话(session),客户端和服务器端都生成一个“对话密钥”(session key),用它来加密信息。由于“对话密钥”是对称加密,所以运算速度非常快,而服务器公钥只用于加密“对话密钥”本身,这样就减少了加密运算的消耗时间。 因此,SSL/TLS协议的基本过程是这样的: 客户端向服务器端索要并验证公钥。 双方协商生成“对话密钥”。 双方采用“对话密钥”进行加密通信。 上面过程的前两布,又称为“握手阶段”。 握手阶段的详细过程 “握手阶段”涉及四次通信,需要注意的是,“握手阶段”的所有通信都是明文的。 客户端发出请求(ClientHello) 首先,客户端(通常是浏览器)先向服务器发出加密通信的请求,这被叫做ClientHello请求。在这一步中,客户端主要向服务器提供以下信息: 支持的协议版本,比如TLS 1.0版 一个客户端生成的随机数,稍后用于生成“对话密钥”。 支持的加密方法,比如RSA公钥加密。 支持的压缩方法。 这里需要注意的是,客户端发送的信息之中不包括服务器的域名。也就是说,理论上服务器只能包含一个网站,否则会分不清应用向客户端提供哪一个网站的数字证书。这就是为什么通常一台服务器只能有一张数字证书的原因。 服务器回应(ServerHello) 服务器收到客户端请求后,向客户端发出回应,这叫做ServerHello。服务器的回应包含以下内容: 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。 一个服务器生成的随机数,稍后用于生成“对话密钥”。 确认使用的加密方法,比如RSA公钥加密。 服务器证书。 除了上面这些信息,如果服务器需要确认客户端的身份,就会再包含一项请求,要求客户端提供“客户端证书”。比如,金融机构往往只允许认证客户连入自己的网络,就会向正式客户提供USB密钥,里面就包含了一张客户端证书。 客户端回应 客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁发,或者证书中的域名与实际域名不一致,或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。 如果证书没有问题,客户端就会从证书中取出服务器的公钥。然后,向服务器发送下面三项消息。 一个随机数。该随机数用服务器公钥加密,防止被窃听。 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项通常也是前面发送的所有内容的hash值,用来供服务器校验。 上面第一项随机数,是整个握手阶段出现的第三个随机数,又称“pre-master key”。有了它以后,客户端和服务器就同时有了三个随机数,接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把“会话密钥”。 服务器的最后回应 服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所用的“会话密钥”。然后,向客户端最后发送下面信息。 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发生的所有内容的hash值,用来供客户端校验。 握手结束 至此,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用“会话密钥”加密内容。 服务器基于Nginx搭建HTTPS虚拟站点 之前一篇文章详细介绍了在服务器端如何生成SSL证书,并基于Nginx搭建HTTPS服务器,链接:Nginx搭建HTTPS服务器 Android实现HTTPS通信 由于各种原因吧,这里使用HttpClicent类讲解一下Android如何建立HTTPS连接。代码demo如下。 MainActivity.java ``` package com.example.photocrop; import java.io.BufferedReader; import java.io.InputStreamReader; ...

2014年12月15日 · 12 分钟 · 天边的星星

android studio 自动更新失败解决办法

自从GoogleI/O之后,很多开发者开始转向使用android studio开发项目,但是每当选择check updates的时候你总是会得到一个失败结果:Connection failed. Please check your network connection and try again 。很明显,我们生活在围城里面的人又有特殊待遇了。 网上找了一下解决办法,都说用代理,我用goagent试了一下好像不是很成功,后来发现可以配置一个更新地址来处理,方法如下: 我是用Mac OS的 , 选择你的android studio.app 显示包内容 打开Content/Info.plist 文件找到 VMOptions 在内容里面增加以下几个参数 -Djava.net.preferIPv4Stack=true -Didea.updates.url=http://dl.google.com/android/studio/patches/updates.xml -Didea.patches.url=http://dl.google.com/android/studio/patches/ 如图: 保存,如果你的android studio是开着的要重启一下。 然后检查更新,一切搞定。 如果你是Windows平台,这个文件在你android studio下面的/bin/studio.exe.vmoptions。 转载:http://www.cnblogs.com/mudoot/p/android_studio_check_updates.html Android Studio更新升级方法 自从2013 Google I/O大会之后,笔者就将android ide开发工具从eclipse迁移到Android Studio了,android studio一直在更新完善,为了与时俱进,我们当然要将工具更新到最新版本啦!其实更新本来是很简单,只要从Android Studio Help菜单中选择Check for Update即可: 但是你会收到如下提示: 小伙伴们这是为什么呢?因为“伟大的墙”!!!下面介绍笔者的解决方法。 1.获取自己电脑上安装的Android Studio 的Build Number 如果已经安装了Android Studio,那么我们只需要增量更新即可。所以下载更新jar包即可,首先要知道自己当前的Android Studio的版本号,Help-》About 注意Build #AI-130.745757,比如笔者的版本号为 130.745757 2.查询目前Android Studio的最新版本号是多少 (1)访问网站http://tools.android.com/recent可查看最新的Build Number,或者 (2)访问https://dl.google.com/android/studio/patches/updates.xml查看最新的版本号,目前笔者获得的最新xml数据如下 从返回的xml数据可知目前最新的Build Number 为132.809981 ...

2014年12月14日 · 1 分钟 · 天边的星星

android上类似与excel的效果

最近做了个项目 需要类似与excel的数据显示效果 就是最左边的已列只能上下滑动 最顶部的一行只能左右滑动!于是查了些资料做了个长的还才不多的效果 和大家分享分享! 附上demo源码 - [TestTableShow.zip](http://dl.iteye.com/topics/download/ae68552b-0d39-3015-9202-cf143b287782) (689.1 KB) 转自:http://793101503-qq-com.iteye.com/blog/1678183

2014年12月14日 · 1 分钟 · 天边的星星

Android实现类似Excel显示数据功能(支持拖动改变列宽)v 1.0

/** DemoListView @version 1.0 @author WuXx @Time 2014-08-15 / / 一、实现功能: (1)当列数较多,超过一屏时,整体视图支持左右滑动; (2)当单列数据较长,可以通过拖拽表头改变列宽; (3)为表格中每一项添加点击事件。 &nbsp; 二、效果图: <span style="color: #000000;">图片有些小。</span> 三、搭建布局: 四、主要代码: 由易到难顺序:MyOnItemClickListener、MyListView、MyAdapter (1)MyOnItemClickListener,回调函数机制。由MyAdapter调用。 **[java]** [view plain](http://blog.csdn.net/hello1234123/article/details/38590073#)[copy](http://blog.csdn.net/hello1234123/article/details/38590073#)[print](http://blog.csdn.net/hello1234123/article/details/38590073#)[?](http://blog.csdn.net/hello1234123/article/details/38590073#) <div> </div> </div> </div> - <span style="color: black;"><span style=<span class="string" style="color: blue;">&#8220;font-weight: normal;&#8221;</span>><span class="keyword" style="color: #006699;">public</span> <span class="keyword" style="color: #006699;">interface</span> MyOnItemClickListener { </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">public</span> <span class="keyword" style="color: #006699;">void</span> OnItemClickListener(View view,<span class="keyword" style="color: #006699;">int</span> line,<span class="keyword" style="color: #006699;">int</span> row,<span class="keyword" style="color: #006699;">long</span> id); </span> - <span style="color: black;">} </span> - <span style="color: black;"></span> </span> (2)MyListView,表头滑动事件,滑动事件会与HorizontalScrollView的滑动冲突,解决方案:在MotionEvent.ACTION_DOWN,设置一下HorizontalScrollView的touch不监听就好了。 **[java]** [view plain](http://blog.csdn.net/hello1234123/article/details/38590073#)[copy](http://blog.csdn.net/hello1234123/article/details/38590073#)[print](http://blog.csdn.net/hello1234123/article/details/38590073#)[?](http://blog.csdn.net/hello1234123/article/details/38590073#) <div> </div> </div> </div> - <span style="color: black;"><span style=<span class="string" style="color: blue;">&#8220;font-weight: normal;&#8221;</span>><span class="comment" style="color: #008200;">/**</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * Set TouchListener on tile ,if ACTION_MOVE is called ,the listView will change its columnWidth</span> </span> - <span style="color: black;"><span class="comment" style="color: #008200;"> * */</span> </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">private</span> <span class="keyword" style="color: #006699;">void</span> setTitleTouchListener(View v) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// TODO Auto-generated method stub</span> </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">for</span>(<span class="keyword" style="color: #006699;">int</span> i=<span class="number" style="color: #c00000;"></span>;i<titles.length;i++){ </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">final</span> <span class="keyword" style="color: #006699;">int</span> column = i; </span> - <span style="color: black;"> v.findViewById(titles[i]).setOnTouchListener(<span class="keyword" style="color: #006699;">new</span> OnTouchListener() { </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">int</span> x = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">int</span> x1 = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">int</span> width = <span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">boolean</span> isMoved = <span class="keyword" style="color: #006699;">false</span>; </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">int</span> t = <span class="number" style="color: #c00000;">20</span>; </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@SuppressLint</span>(<span class="string" style="color: blue;">&#8220;NewApi&#8221;</span>)</span> </span> - <span style="color: black;"> <span style=<span class="string" style="color: blue;">&#8220;font-weight: normal;&#8221;</span>> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">public</span> <span class="keyword" style="color: #006699;">boolean</span> onTouch(View v, MotionEvent event) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// TODO Auto-generated method stub</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">//two teps</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// 1.when touch down and move, change the width of head;</span> </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// 2.touch up ,change the width of the columns ;</span> </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">if</span> (event.getAction() == MotionEvent.ACTION_DOWN) { </span> - <span style="color: black;"> x = (<span class="keyword" style="color: #006699;">int</span>) event.getX(); </span> - <span style="color: black;"> hs.requestDisallowInterceptTouchEvent(<span class="keyword" style="color: #006699;">true</span>); </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">return</span> <span class="keyword" style="color: #006699;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">if</span> (event.getAction() == MotionEvent.ACTION_MOVE) { </span> - <span style="color: black;"> x1 = (<span class="keyword" style="color: #006699;">int</span>) event.getX(); </span> - <span style="color: black;"> width= v.getMeasuredWidth()+(x1-x)+t; </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">if</span>(t!=<span class="number" style="color: #c00000;"></span>) </span> - <span style="color: black;"> t=<span class="number" style="color: #c00000;"></span>; </span> - <span style="color: black;"> v.setLayoutParams(<span class="keyword" style="color: #006699;">new</span> LinearLayout.LayoutParams(width,v.getMeasuredHeight())); </span> - <span style="color: black;"> x = x1; </span> - <span style="color: black;"> isMoved = <span class="keyword" style="color: #006699;">true</span>; </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">return</span> <span class="keyword" style="color: #006699;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">if</span>(event.getAction()==MotionEvent.ACTION_UP){ </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">if</span>(isMoved) </span> - <span style="color: black;"> adapter.setColumnWidth(column, width); </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">return</span> <span class="keyword" style="color: #006699;">true</span>; </span> - <span style="color: black;"> </span> - <span style="color: black;"> } </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">if</span>(event.getAction()==MotionEvent.ACTION_CANCEL){ </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">if</span>(isMoved) </span> - <span style="color: black;"> adapter.setColumnWidth(column, width); </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">return</span> <span class="keyword" style="color: #006699;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">return</span> <span class="keyword" style="color: #006699;">true</span>; </span> - <span style="color: black;"> } </span> - <span style="color: black;"> }); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> }</span> </span> (3)MyAdapter,这个有点小麻烦。参考SimpleAdapter来写的,不过略有不同。与SimpleAdapter重复部分不再赘述。详细内容请下载源代码看吧。 数据以及点击事件的添加,其实是很简单的。 **[java]** [view plain](http://blog.csdn.net/hello1234123/article/details/38590073#)[copy](http://blog.csdn.net/hello1234123/article/details/38590073#)[print](http://blog.csdn.net/hello1234123/article/details/38590073#)[?](http://blog.csdn.net/hello1234123/article/details/38590073#) <div> </div> </div> </div> - <span style="color: black;"><span class="keyword" style="color: #006699;">private</span> <span class="keyword" style="color: #006699;">void</span> bindView(<span class="keyword" style="color: #006699;">int</span> position, View v) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// TODO Auto-generated method stub</span> </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">for</span> (<span class="keyword" style="color: #006699;">int</span> i = <span class="number" style="color: #c00000;"></span>; i < mFrom.length; i++) { </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">final</span> <span class="keyword" style="color: #006699;">int</span> line = position; </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">final</span> <span class="keyword" style="color: #006699;">int</span> row = i; </span> - <span style="color: black;"> TextView txt = (TextView) v.findViewById(mTo[i]); </span> - <span style="color: black;"> txt.setText((String) mData.get(position).get(mFrom[i])); </span> - <span style="color: black;"> txt.setOnClickListener(<span class="keyword" style="color: #006699;">new</span> OnClickListener() { </span> - <span style="color: black;"> <span class="annotation" style="color: #646464;">@Override</span> </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">public</span> <span class="keyword" style="color: #006699;">void</span> onClick(View v) { </span> - <span style="color: black;"> <span class="comment" style="color: #008200;">// TODO Auto-generated method stub</span> </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">if</span> (MyAdapter.<span class="keyword" style="color: #006699;">this</span>.listener != <span class="keyword" style="color: #006699;">null</span>) </span> - <span style="color: black;"> MyAdapter.<span class="keyword" style="color: #006699;">this</span>.listener.OnItemClickListener(v, line, </span> - <span style="color: black;"> row, <span class="number" style="color: #c00000;"></span>); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> }); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> 修改列宽,当MyListView滑动表头时修改表格主体的列宽。 **[java]** [view plain](http://blog.csdn.net/hello1234123/article/details/38590073#)[copy](http://blog.csdn.net/hello1234123/article/details/38590073#)[print](http://blog.csdn.net/hello1234123/article/details/38590073#)[?](http://blog.csdn.net/hello1234123/article/details/38590073#) <div> </div> </div> </div> - <span style="color: black;"><span class="keyword" style="color: #006699;">public</span> <span class="keyword" style="color: #006699;">void</span> setColumnWidth(<span class="keyword" style="color: #006699;">int</span> column, <span class="keyword" style="color: #006699;">int</span> width) { </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">for</span> (<span class="keyword" style="color: #006699;">int</span> i = <span class="number" style="color: #c00000;"></span>; i < viewList.size(); i++) { </span> - <span style="color: black;"> View v = viewList.get(i); </span> - <span style="color: black;"> TextView txt = (TextView) v.findViewById(mTo[column]); </span> - <span style="color: black;"> txt.setLayoutParams(<span class="keyword" style="color: #006699;">new</span> LinearLayout.LayoutParams(width, txt </span> - <span style="color: black;"> .getHeight())); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> 好吧,问题来了。当使用此方法进行显示时,当你滑动表头修改列宽,你再下拉查看未显示的数据,这个时候惊喜来了,空白?嗯是的。发现有一行的部分数据项是空白的,当你继续下拉,你会发现这个空白会循环的出现在你屏幕上,也许你猜到了这其中的原因。我们可以举一个例子,假如你的ListView第一次加载出来,屏幕上显示的item数量为23个,但是,getView调用了24次,当然,我这么说是不负责的,好吧,准确的说是生成了24个View(就是你的item),why 24?因为有一个影藏的。第24个View的产生是因为安卓内部有一个recycler机制,实现了View的循环使用,显而易见,23个是无法实现循环的。这里我借鉴网上的一张图,大家就一目了然了。 这时,聪明的你发现了,我们没有涉及到如何在getView中找出影藏的View。其实这个问题我也没有特别好的解决方案,目前我采取的方案,可以在把空白问题出现的概率控制在比较小的范围。这种方案是通过5、6次调试通过log日志得出的,有一定的局限性。 通过getView给出的参数,position、parent以及用来存储视图的ViewList,进行判断影藏的View。代码如下: **[java]** [view plain](http://blog.csdn.net/hello1234123/article/details/38590073#)[copy](http://blog.csdn.net/hello1234123/article/details/38590073#)[print](http://blog.csdn.net/hello1234123/article/details/38590073#)[?](http://blog.csdn.net/hello1234123/article/details/38590073#) <div> </div> </div> </div> - <span style="color: black;"><span class="keyword" style="color: #006699;">if</span>(lastViewsSize==viewList.size()){ </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">if</span>(position!=<span class="number" style="color: #c00000;"></span>){ </span> - <span style="color: black;"> <span class="keyword" style="color: #006699;">if</span>(position==parent.getChildCount()&&position==viewList.size()-<span class="number" style="color: #c00000;">1</span>){ </span> - <span style="color: black;"> setWidth(v); </span> - <span style="color: black;"> } </span> - <span style="color: black;"> } </span> - <span style="color: black;"> }<span class="keyword" style="color: #006699;">else</span> { </span> - <span style="color: black;"> lastViewsSize = viewList.size(); </span> - <span style="color: black;"> } </span> 大概描述一下: 首先申明,当ListView在一个屏幕上显示23个时,它并不只是调用24次Adapter的getView,正常情况应该是23(或者说是24,这个值我不能确定)的3、4倍,为什么有这么多呢?其中有一次是用于确定布局的宽度和高度用于draw的,其他的我不清楚。 但是,可以确定当最后一次调用getView时是用于显示的,我们如何确定这一次呢,通过log日志可以看出,此时viewList.size()已经为常值,所以第一个判断条件便是如此产生的,当然我们需要排除掉position为0的干扰,最后我们找出我们影藏的View,然后setWidth,游戏就这样结束了。我觉得有必要把调试过程中log日志也贴出来: 源代码:http://download.csdn.net/detail/hello1234123/7765011 &nbsp; 转自:http://blog.csdn.net/hello1234123/article/details/38590073

2014年12月14日 · 6 分钟 · 天边的星星

Android开源项目第五篇——优秀个人和团体篇

本文为那些不错的Android开源项目第五篇——优秀个人和团体篇,主要介绍那些乐于分享并且有一些很不错的开源项目的个人和组织(公司) 最新内容请访问[AndroidOpenProject@Github](https://github.com/Trinea/android-open-project),欢迎Star和Fork。 对你有帮助的话,去知乎点个赞让更多人了解:Android 优秀开源项目及特效推荐。 Android开源项目系列汇总已完成,包括: [Android开源项目第一篇——个性化控件(View)篇](http://www.trinea.cn/android/android-open-source-projects-view/) Android开源项目第二篇——工具库篇 Android开源项目第三篇——优秀项目篇 Android开源项目第四篇——开发及测试工具篇 Android开源项目第五篇——优秀个人和团体篇 Follow大神,深挖大神的项目和following,你会发现很多。长期更新,欢迎大家补充和推荐^_^ **一、个人** **1. JakeWharton 就职于Square** Github地址:https://github.com/JakeWharton 代表作:ActionBarSherlock,Android-ViewPagerIndicator,Nine Old Androids,SwipeToDismissNOA,hugo,butterknife,Android-DirectionalViewPager pidcat另外对square及其他开源项目有很多贡献 博客:http://jakewharton.com/ 绝对牛逼的大神,项目主要集中在Android版本兼容,ViewPager及开发工具上. **2. Chris Banes** Github地址:https://github.com/chrisbanes 代表作:ActionBar-PullToRefresh,PhotoView,Android-BitmapCache,Android-PullToRefresh 博客:http://chris.banes.me/ **3. Koushik Dutta就职于ClockworkMod** Github地址:https://github.com/koush 代表作:Superuser,AndroidAsync,UrlImageViewHelper,ion, 另外对https://github.com/CyanogenMod的开源项目有很多贡献 博客:[http://koush.com/](http://koush.com/) **4. Simon Vig** Github地址:https://github.com/SimonVT 代表作:android-menudrawer,MessageBar 博客:[http://simonvt.net/](http://simonvt.net/) **5. Manuel Peinado** Github地址:https://github.com/ManuelPeinado 代表作:FadingActionBar,GlassActionBar,RefreshActionItem,QuickReturnHeader **6. Emil Sjölander** Github地址:https://github.com/emilsjolander 代表作:StickyListHeaders,sprinkles,android-FlipView 博客:[http://emilsjolander.se/](http://emilsjolander.se/) **7. greenrobot** Github地址:https://github.com/greenrobot 代表作:greenDAO,EventBus 网址:http://greenrobot.de/ ...

2014年12月14日 · 1 分钟 · 天边的星星