diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000000..ed021e17c4 --- /dev/null +++ b/LICENSE @@ -0,0 +1,15 @@ +/* + * Copyright (C) 2013 Peng fei Pan + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ \ No newline at end of file diff --git a/README.md b/README.md index 50cc3b8891..93bce2698b 100644 --- a/README.md +++ b/README.md @@ -6,30 +6,32 @@ Spear is an image loader for Android, the purpose is to help the developers to r ![sample](https://github.com/xiaopansky/Spear/raw/master/docs/sample.jpg) -###Features ->* ``多种URI支持``. 支持``http://``、``https://``、``assets://``、``content://``、``file://``、``drawable://``等6种URI。 ->* ``异步加载``. 采用线程池来处理每一个请求,并且网络加载和本地加载会放在不同的线程池中执行,保证不会因为网络加载而堵塞本地加载。 ->* ``支持缓存``. 采用Lru算法在本地和内存中缓存图片,本地缓存可设置``过期``时间。 ->* ``支持ViewHolder``. 即使你在ListView中使用了ViewHolder也依然可以使用ImageLoader来加载图片,并且图片显示绝对不会混乱。 ->* ``重复下载过滤``. 如果两个请求的图片地址一样的话,第二个就会等待,一直到第一个下载成功后才会继续处理。 ->* ``即时取消无用请求``. 在onDetachedFromWindow或重复利用的时候会取消无用的请求。 ->* ``支持进度回调``. 通过progressListener()方法即可设置并开启进度回调。 ->* ``防止加载过大Bitmap``,默认最大Bitmap限制为当前屏幕宽高的1.5倍,这样可以有效防止加载过大图片到内存中。 ->* ``重新处理图片尺寸``. 可自定义加载到内存的图片的尺寸,使用display()方法显示图片的时候还会自动根据ImageView的宽高来重新处理。 ->* ``自带RequestOptions管理器``. 你可以通过Spear.putOptions(Enum, RequestOptions)存储RequestOptions。然后在使用的时候指定名称即可。 ->* ``提供SpearImageView``. 让加载图片更加简单,只需调用setImageBy***系列方法即可显示各种图片。 ->* ``额外提供load()和download()``. 如果你不是要显示图片只是想要加载然后用作其他用途,那么你可以使用load()方法。 ->* ``强大的自定义功能``. 可自定义请求分发与执行、缓存、解码、处理、显示、默认图片、失败图片等。 ->* ``强制使用单例模式``. 你只能通过Spear.with(Context)方法获取实例,降低使用复杂度 - -### Sample App +##Features +>* ``多种URI支持`` 支持``http://``、``https://``、``assets://``、``content://``、``/sdcard/sample.jpg``、``drawable://``等6种URI。 +>* ``异步加载`` 采用线程池来处理每一个请求,并且网络加载和本地加载会放在不同的线程池中执行,保证不会因为网络加载而堵塞本地加载。 +>* ``缓存支持`` 采用Lru算法在本地和内存中缓存图片,本地缓存可设置最大容量、保留容量以及有效期。 +>* ``支持ViewHolder`` 即使你在ListView中使用了ViewHolder也依然可以使用ImageLoader来加载图片,并且图片显示绝对不会混乱。 +>* ``SpearImageView`` SpearImageView继承自ImageView,只需调用setImageFrom***系列方法即可显示各种图片,如果你的APP要兼容Android2.3及以下版本,那么你必须使用SpearImageView才能保证Bitmap被顺利回收。 +>* ``重复下载过滤`` 如果两个请求的图片地址一样的话,第二个就会等待,一直到第一个下载成功后才会继续处理。 +>* ``即时取消无用请求`` ImageView在onDetachedFromWindow或被重复利用的时候会及时取消之前的请求。 +>* ``支持进度回调`` 通过progressListener()方法即可设置并开启进度回调。 +>* ``防止加载过大Bitmap`` 默认最大Bitmap限制为当前屏幕宽高的1.5倍,这样可以有效防止加载过大图片到内存中。 +>* ``裁剪图片`` 可对图片进行裁剪,使用display()方法显示图片的时候还可根据ImageView的布局尺寸来决定裁剪的尺寸。 +>* ``自带RequestOptions管理器`` 你可以通过Spear.putOptions(Enum, RequestOptions)存储RequestOptions。然后在使用的时候指定名称即可。 +>* ``提供load()和download()`` 你还可以通过load()方法加载图片图片到内存或通过download()方法下载图片到本地。 +>* ``强大的自定义功能`` 可自定义请求分发与执行、缓存、解码、处理、显示、默认图片、失败图片等。 +>* ``使用方便`` 直接通过Spear.with(Context).display()方法即可显示图片,无需事先在Application中做任何设置 + +## Sample App >* [Get it on Google Play](https://play.google.com/store/apps/details?id=me.xiaoapn.android.imageloader) ->* [Download APK](https://github.com/xiaopansky/Spear/raw/master/releases/SpearSample-2.4.1.apk) +>* [Download APK](https://github.com/xiaopansky/Spear/raw/master/releases/SpearSample-2.5.0.apk) -###Usage guide +扫描二维码下载示例APP +![SampleApp](https://github.com/xiaopansky/Spear/raw/master/releases/sample_apk_download_url.jpg) -####显示图片 -Spear支持以下6种URI: +##Usage guide + +####Spear支持以下6种URI: >* "http://b.zol-img.com.cn/desk/bizhi/image/4/1366x768/1387347695254.jpg"; // from Web >* "https://b.zol-img.com.cn/desk/bizhi/image/4/1366x768/1387347695254.jpg"; // from Web >* "/mnt/sdcard/image.png"; // from SD card @@ -37,97 +39,39 @@ Spear支持以下6种URI: >* "assets://image.png"; // from assets >* "drawable://" + R.drawable.image; // from drawable resource -**Image from http or https** -```java -String uri = "http://www.huabian.com/uploadfile/2013/1222/20131222054754556.jpg"; -Spear.with(context).display(uri, imageView).fire(); -``` +####使用SpearImageView显示图片 + +**如果你的APP要兼容Android2.3及以下版本,那么你必须使用SpearImageView才能保证Bitmap被顺利回收,切记切记!** -**Image from file** -```java -Spear.with(context).display("/mnt/sfs.png", imageView).fire(); -``` -or ```java -Spear.with(context).display(new File("/mnt/sfs.png"), imageView).fire(); -``` +SpearImageView contentSpearImageView = ...; + +// from http or https +spearImageView.setImageFromUri("http://www.huabian.com/uploadfile/2013/1222/20131222054754556.jpg"); + +// from local file +spearImageView.setImageFromUri("file:///mnt/sfs.png"); +// or +spearImageView.setImageFromFile(new File("/mnt/sfs.png")); -**Image from content provider** -```java -Spear.with(context).display("content://media/external/audio/albumart/13", imageView).fire(); -``` -or -```java +// from content provider +spearImageView.setImageFromUri("content://media/external/audio/albumart/13"); +// or Uri uri = ...; -Spear.with(context).display(uri, imageView).fire(); -``` - +spearImageView.setImageFromContent(uri); -**Image from drawable resource** -```java -Spear.with(context).display("drawable://"+R.drawable.ic_launcher, imageView).fire(); -``` -or -```java -Spear.with(context).display(R.drawable.ic_launcher, imageView).fire(); -``` - +// from drawable resource +spearImageView.setImageFromUri("drawable://"+R.drawable.ic_launcher); +// or +spearImageView.setImageFromResource(R.drawable.ic_launcher); -**Image from assets** -```java -Spear.with(context).display("assets://test.png", imageView).fire(); -``` -or -```java -String uri = Scheme.ASSETS.createUri("test.png"); -Spear.with(context).display(uri, imageView).fire(); +// from assets +spearImageView.setImageFromUri("assets://test.png"); +// or +spearImageView.setImageFromAssets("test.png"); ``` -``一定要记得最后要调用fire()方法哦`` - -####配置显示选项: -```java -Spear.with(getBaseContext()) - .display("http://b.zol-img.com.cn/desk/bizhi/image/4/1366x768/1387347695254.jpg", imageView) - .loadingDrawable(R.drawable.image_loading) // 设置正在加载的时候显示的图片 - .loadFailDrawable(R.drawable.image_load_fail) // 设置当加载失败的时候显示的图片 - .disableDiskCache() // 禁用磁盘缓存 - .disableMemoryCache() // 禁用内存缓存 - .diskCacheTimeout(60 * 1000) // 设置磁盘缓存有效期为60秒 - .maxsize(1000, 800) // 设置最大尺寸,用来解码Bitmap时计算inSampleSize,防止加载过大的图片到内存中,默认为当前屏幕的1.5倍 - .resize(300, 300) // 重新定义图片宽高,将原始图片加载到内存中之后会使用ImageProcessor根据原始图片创建一张新的300x300的图片 - .displayer(new OriginalFadeInImageDisplayer()) // 设置图片显示器,在最后一步会使用ImageDisplayer来显示图片 - .processor(new CircleImageProcessor()) // 设置图片处理器 - .scaleType(ImageView.ScaleType.FIT_START) // 设置图片显示模式,在使用ImageProcessor处理图片的时候会用到此参数,默认为ImageView的ScaleType - .listener(new DisplayListener() { // 设置监听器 - @Override - public void onStarted() { - - } - - @Override - public void onCompleted(String uri, ImageView imageView, BitmapDrawable drawable) { - - } - - @Override - public void onFailed(FailureCause failureCause) { - - } - - @Override - public void onCanceled() { - - } - }) - .progressListener(new ProgressListener() { // 设置进度监听器 - @Override - public void onUpdateProgress(int totalLength, int completedLength) { - - } - }) - .fire(); -``` +[点击查看详细使用说明](https://github.com/xiaopansky/Spear/wiki/SpearImageView) ####download()、load()、display() Spear除了有display()方法用来显示图片之外,还有load()用来加载图片和download()方法用来下载图片 @@ -142,95 +86,123 @@ Spear除了有display()方法用来显示图片之外,还有load()用来加载 display()与load()、download()的区别 >* display()的fire()方法必须在主线程执行,否则将会有异常发生 ->* **在使用display()方法显示图片的时候,Spear会自动根据ImageView的宽高计算maxsize和resize,条件就是计算maxsize时要求ImageView的宽高至少有一个是固定的,而计算resize的时候要求宽高都是固定的,这样就省却了很多麻烦,也节省了内存** +>* 在使用display()方法显示图片的时候,Spear会自动根据ImageView的layout size计算maxsize >* 可使用的属性display()最多,download()最少具体如下表所示: -下面是属性表('-'代表不支持) +对应关系 |属性|download|load|display| |:--|:--|:--|:--| -|diskCache|true|true|true| -|diskCacheTimeout|0(永久有效)|0(永久有效)|0(永久有效)| -|maxsize|-|设备屏幕尺寸的1.5倍|结合ImageView的宽高来计算| -|resize|-|null|结合ImageView的宽高来计算| -|ImageProcessor|-|null|null| -|ScaleType|-|ScaleType.FIT_CENTER|ScaleType.FIT_CENTER| -|memoryCache|-|-|true| -|ImageDisplayer|-|-|DefaultImageDisplayer(无任何特效)| +|使用方法|Spear.download()|Spear.load()|Spear.display()| +|返回的helper|DownloadHelper|LoadHelper|DisplayHelper| +|使用的options|DownloadOptions|LoadOptions|DisplayOptions| + +下面是属性表('-'代表不支持) + +|属性|download()|load()|display()| +|:--|:--|:--|:--| +|enableDiskCache|true|true|true| +|maxsize|-|屏幕的1.5倍|ImageView的layout size 或屏幕的1.5倍| +|resize|-|null|null| +|imageProcessor|-|null|null| +|scaleType|-|FIT_CENTER|FIT_CENTER| +|enableMemoryCache|-|-|true| +|imageDisplayer|-|-|DefaultImageDisplayer| |loadingDrawable|-|-|null| -|loadFailedDrawable|-|-|null| -|listener|null(在``非主线程``回调)|null(在``非主线程``回调)|null(在``主线程``回调)| -|progressListener|null(在``非主线程``回调)|null(在``非主线程``回调)|null(在``主线程``回调)| +|loadFailDrawable|-|-|null| +|listener|null|null|null| +|progressListener|null|null|null| + ####你可能还感兴趣的功能: ->* [取消请求](https://github.com/xiaopansky/Spear/wiki/CancelRequest) +>* [使用``SpearImageView``代替ImageView快速显示图片](https://github.com/xiaopansky/Spear/wiki/SpearImageView) +>* [处理图片成``圆形``的、``椭圆形``的或者加上``倒影效果``(ImageProcessor)](https://github.com/xiaopansky/Spear/wiki/ImageProcessor) +>* [以``渐变``或``缩放``的方式显示图片(ImageDisplayer)](https://github.com/xiaopansky/Spear/wiki/ImageDisplayer) +>* [使用``maxsize``防止加载过大的图片以``节省内存``](https://github.com/xiaopansky/Spear/wiki/maxsize) +>* [使用``resize``裁剪图片](https://github.com/xiaopansky/Spear/wiki/resize) >* [使用``RequestOptions``定义属性模板来简化属性设置](https://github.com/xiaopansky/Spear/wiki/RequestOptions) >* [监听加载``开始``、``成功``、``失败``以及``进度``](https://github.com/xiaopansky/Spear/wiki/listener) ->* [使用``SpearImageView``简化显示图片的操作](https://github.com/xiaopansky/Spear/wiki/SpearImageView) ->* [使用``maxsize``防止加载过大的图片以``节省内存``](https://github.com/xiaopansky/Spear/wiki/maxsize) ->* [使用``resize``修改图片的尺寸或者使加载到内存的图片``同ImageView的尺寸一样``,最大限度的``节省内存``](https://github.com/xiaopansky/Spear/wiki/resize) +>* [自定义``inSampleSize``计算规则或``图片解码器``(ImageDecoder)](https://github.com/xiaopansky/Spear/wiki/ImageDecoder) +>* [设置``内存缓存最大容量``(MemoryCache)](https://github.com/xiaopansky/Spear/wiki/MemoryCache) +>* [设置``磁盘缓存最大容量``、``磁盘缓存目录``或``保留空间大小``(DiskCache)](https://github.com/xiaopansky/Spear/wiki/DiskCache) >* [设置下载``失败重试次数``、``超时时间``(ImageDownloader)](https://github.com/xiaopansky/Spear/wiki/ImageDownloader) ->* [自定义``InSampleSize``计算规则或``自定义图片解码器``(ImageDecoder)](https://github.com/xiaopansky/Spear/wiki/ImageDecoder) ->* [将图片处理成``圆形``的、``椭圆形``的或者加上``倒影效果``(ImageProcessor)](https://github.com/xiaopansky/Spear/wiki/ImageProcessor) ->* [以有趣的动画显示图片,例如以``渐变``或``缩放``的方式显示(ImageDisplayer)](https://github.com/xiaopansky/Spear/wiki/ImageDisplayer) ->* [设置``请求执行顺序``、``任务队列长度``或``线程池大小``(RequestExecutor)](https://github.com/xiaopansky/Spear/wiki/RequestExecutor) ->* [设置``内存缓存容量``(MemoryCache)](https://github.com/xiaopansky/Spear/wiki/MemoryCache) ->* [设置``磁盘缓存目录``或``保留空间大小``(DiskCache)](https://github.com/xiaopansky/Spear/wiki/DiskCache) +>* [取消请求](https://github.com/xiaopansky/Spear/wiki/CancelRequest) +>* [自定义``请求执行顺序``、``任务队列长度``或``线程池大小``(RequestExecutor)](https://github.com/xiaopansky/Spear/wiki/RequestExecutor) +>* [使用ImageView](https://github.com/xiaopansky/Spear/wiki/UseImageView) +>* [暂停加载新图片,进一步提升列表流畅度](https://github.com/xiaopansky/Spear/wiki/pause-or-resume-spear) ###Downloads ->* [spear-1.2.0.jar](https://github.com/xiaopansky/Spear/raw/master/releases/spear-1.2.0.jar) ->* [spear-1.2.0-sources.zip](https://github.com/xiaopansky/Spear/raw/master/releases/spear-1.2.0-sources.zip) +>* [spear-1.3.0.jar](https://github.com/xiaopansky/Spear/raw/master/releases/spear-1.3.0.jar) +>* [spear-1.3.0-sources.zip](https://github.com/xiaopansky/Spear/raw/master/releases/spear-1.3.0-sources.zip) -###Change log +##Change log ###1.3.0 **SpearImageView** ->* ``修复``. 修复了由于在onDetachedFromWindow()方法中执行了setImageDrawable(null)释放图片导致在RecyclerView回滚的时候图片显示空白的BUG ->* ``修复``. 修复了由于在onDetachedFromWindow()方法中主动取消了请求导致在RecyclerView中会出现错误取消而引起了图片显示不出来的BUG ->* ``修复``. 取消了在setImageByUri()方法中的过滤请求功能,因为这里只能根据URI过滤。例如:同一个URI在同一个SpearImageView上调用setImageByUri()方法显示了两次,但是这两次显示的时候SpearImageView的宽高是不一样的,结果就是第一次的显示请求继续执行,第二次的显示请求被拒绝了。现在去掉过滤功能后统一都交给了Spear处理,结果会是第一次的显示请求被取消,第二次的显示请求继续执行。 +>* ``修复``. 兼容RecyclerView,因为在RecyclerView中View的生命周期略有变化,导致图片显示异常,现已修复 +>* ``修复``. 取消了在setImageFromUri()方法中的过滤请求功能,因为这里只能根据URI过滤。例如:同一个URI在同一个SpearImageView上调用setImageFromUri()方法显示了两次,但是这两次显示的时候SpearImageView的宽高是不一样的,结果就是第一次的显示请求继续执行,第二次的显示请求被拒绝了。现在去掉过滤功能后统一都交给了Spear处理,结果会是第一次的显示请求被取消,第二次的显示请求继续执行。 >* ``新增``. 新增在图片表面显示进度的功能,你只需调用setEnableShowProgress(boolean)方法开启即可 >* ``优化``. debug开关不再由Spear.isDebug()控制,而是在SpearImageView中新增了一个debugMode参数来控制 ->* ``新增``. 新增类似MaterialDesign的按下脉波效果。你只需注册点击事件或调用setClickable(true),然后调用setEnablePressRipple(true)即可 +>* ``新增``. 新增类似MaterialDesign的点击涟漪效果。你只需注册点击事件或调用setClickable(true),然后调用setEnableClickRipple(true)即可 +>* ``修复``. 修复了使用SpearImageView时设置了DisplayOptions、DisplayListener等参数,但最终没有通过setImageFrom***()方法显示图片而是通过Spear.with(context).display(imageUrl, spearImageView)显示图片最终导致DisplayOptions、DisplayListener等参数不起作用的BUG +>* ``修改``. setImageBy***()系列方法,改名为setImageFrom***() -**Other** ->* ``修复``. display时计算maxsize和resize的时候不再考虑real width和real height。这是因为当ImageView的宽高是固定的,在循环重复利用的时候从第二次循环利用开始,最终计算出来的size都将是上一次的size,显然这是个很严重的BUG。当所有的ImageView的宽高都是一样的时候看不出来这个问题,都不一样的时候问题就出来了。 ->* ``优化``. 默认任务执行器的队列长度由20调整为200,这是由于如果你一次性要显示大量的图片,队列长度比较小的话,后面的将会出现异常 ->* ``修复``. 修复了由于DisplayHelper、LoadHelper、DownloadHelper的options()方法发现参数为null时返回了一个null对象的BUG,这会导致使用SpearImageView时由于没有设置DisplayOptions而引起崩溃 ->* ``修复``. 修复在2.3及以下缓存RecyclingBitmapDrawable的时候忘记添加计数导致Bitmap被提前回收而引发崩溃的BUG +**Download** +>* ``优化``. 优化HttpClientImageDownloader,读取数据的时候出现异常或取消的时候主动关闭输入流,避免堵塞连接池,造成ConnectionPoolTimeoutException异常 +>* ``修改``. 默认下载器改为HttpUrlConnectionImageDownloader.java,而HttpClientImageDownloader则作为备选 +>* ``修改``. ImageDownloader.setTimeout()改名为setConnectTimeout() +>* ``优化``. 优化下载的实现,使其更稳定 + +**Cache** >* ``删除``. 删除SoftReferenceMemoryCache.java >* ``移动``. 移动DiskCache.java、LruDiskCache.java、LruMemoryCache.java、MemoryCache.java到cache目录下 ->* ``优化``. 优化HttpClientImageDownloader,读取数据的时候出现异常或取消的时候主动关闭输入流,避免堵塞连接池,造成ConnectionPoolTimeoutException异常 ->* ``优化``. 将计算默认maxsize的代码封装成一个方法并放到了ImageSizeCalculator.java中,方便开发者自定义 +>* ``优化``. 调整LruDiskCache的默认保留空间为100M +>* ``新增``. LruDiskCache增加maxsize功能 +>* ``修复``. 修复在2.3及以下缓存RecyclingBitmapDrawable的时候忘记添加计数导致Bitmap被提前回收而引发崩溃的BUG +>* ``删除``. 去掉了diskCacheTimeout功能,事实证明这个功能没多大用处,并且还影响了当容量不足时清理文件的功能 + +**Decode** >* ``优化``. 优化了默认的inSampleSize的计算方法,增加了限制图片像素数超过目标尺寸像素的两倍,这样可以有效防止那些一边特小一边特大的图片,以特大的姿态被加载到内存中 ->* ``优化``. 优化了默认的ImageDisplayer和默认的裁剪ImageProcessor的实现方式 +>* ``优化``. 将计算默认maxsize的代码封装成一个方法并放到了ImageSizeCalculator.java中 +>* ``修复``. 计算maxsize的时候不再考虑ImageView的getWidth()和getHeight(),这是因为当ImageView的宽高是固定的,在循环重复利用的时候从第二次循环利用开始,最终计算出来的size都将是上一次的size,显然这是个很严重的BUG。当所有的ImageView的宽高都是一样的时候看不出来这个问题,都不一样的时候问题就出来了。 +>* ``优化``. 默认解码器在遇到1x1的图片时按照失败处理 + +**Display** +>* ``优化``. 优化了默认ImageDisplayer的实现方式 +>* ``修改``. 修改ColorFadeInImageDisplayer的名字为ColorTransitionImageDisplayer;OriginalFadeInImageDisplayer的名字为TransitionImageDisplayer +>* ``修改``. 当你使用TransitionImageDisplayer作为displayer的时候会默认开启resizeByImageViewLayoutSize功能,因为不开启resizeByImageViewLayoutSize的话图片最终就会显示变形 + +**Execute** +>* ``优化``. 默认任务执行器的任务队列的长度由20调整为200,这是由于如果你一次性要显示大量的图片,队列长度比较小的话,后面的将会出现异常 +>* ``优化``. 默认任务执行器的线程池的keepAliveTime时间由1秒改为60秒 + +**Process** +>* ``修复``. 计算resize的时候不再考虑ImageView的getWidth()和getHeight(),这是因为当ImageView的宽高是固定的,在循环重复利用的时候从第二次循环利用开始,最终计算出来的size都将是上一次的size,显然这是个很严重的BUG。当所有的ImageView的宽高都是一样的时候看不出来这个问题,都不一样的时候问题就出来了。 +>* ``优化``. 优化了默认ImageProcessor的实现方式 +>* ``优化``. 优化自带的几种图片处理器,对ScaleType支持更完善,更准确 + +**Request** +>* ``修改``. DisplayListener.From.LOCAL改名为DisplayListener.From.DISK + +**Spear** +>* ``优化``. 将一些配置移到了Configuration.java中,debugMode的设置直接改成了静态的 +>* ``新增``. 增加pause功能,你可以在列表滚动时调用pause()方法暂停加载新图片,在列表停止滚动后调用resume()方法恢复并刷新列表,通过这样的手段来提高列表滑动流畅度 +>* ``修改``. image uri不再支持“file:///mnt/sdcard/image.png”,直接支持“/mnt/sdcard/image.png” +>* ``修复``. 修复了由于DisplayHelper、LoadHelper、DownloadHelper的options()方法参数为null时返回了一个null对象的BUG,这会导致使用SpearImageView时由于没有设置DisplayOptions而引起崩溃 >* ``修改``. 修改DisplayHelper中loadFailedDrawable()方法的名称为loadFailDrawable() ->* ``修复``. 修复DisplayHelper、LoadHelper、DownloadHelper中调用options()方法设置参数的时候会直接覆盖Helper中的参数的BUG,修改后的规则是如果Options中的参数倍设置过才会直接覆盖 ->* ``修改``. ImageDownloader.setTimeout()改名为setConnectTimeout() ->* ``优化``. 将一些配置移到了Configuration.java中,debug配置直接改成了静态的 ->* ``修改``. 默认的图片下载器改成了HttpUrlConnectionImageDownloader,HttpClientImageDownloader退居二线变成了替补 ->* ``优化``. 优化了自带的图片处理器,根据ScaleType,以不同的方式处理图片,主要体现在是否裁剪图片上 +>* ``修复``. 修复DisplayHelper、LoadHelper、DownloadHelper中调用options()方法设置参数的时候会直接覆盖Helper中的参数的BUG,修改后的规则是如果helper中为null,且Options中的参数被设置过才会覆盖 >* ``优化``. 默认图片和失败图片使用ImageProcessor处理时支持使用DisplayHelper中的resize和scaleType ->* ``优化``. 优化自带的图片处理器,对ScaleType支持更完善,更准确 ->* ``新增``. 增加pause功能,你可以在列表滚动时调用pause()方法暂停加载新图片,在列表停止滚动后调用resume()方法恢复并刷新列表,通过这样的手段来提高列表滑动流畅度 ->* ``新增``. LruDiskCache增加maxsize功能 ->* ``优化``. 调整LruDiskCache的默认保留空间为100M ->* ``优化``. 当uri为null或空时显示loadingDrawable ->* ``修改``. DisplayListener.From.LOCAL改名为DisplayListener.From.DISK ->* ``新增``. 增加对例如“/mtn/sdcard0/sample.png”uri的支持 ->* ``优化``. 默认解码器在遇到1x1的图片时按照失败处理 ->* ``优化``. 默认线程池的keepAliveTime时间由1秒改为60秒 ->* ``修改``. 不再默认根据ImageView的Layout Size设置resize,新增resizeByImageViewLayoutSize()方法开启此功能 ->* ``修改``. 当你使用OriginalFadeInImageDisplayer作为displayer的时候会默认开启resizeByImageViewLayoutSize功能,因为不开启resizeByImageViewLayoutSize的话图片最终就会显示变形 ->* ``修改``. image uri不再支持file:///mnt/sdcard/image.png,改为直接支持/mnt/sdcard/image.png +>* ``优化``. 调用display()方法显示图片时,当uri为null或空时显示loadingDrawable +>* ``优化``. display的fire方法去掉了异步线程过滤,由于display基本都是在主线程执行的过滤异步线程没有意义 +>* ``修改``. 不再默认根据ImageView的Layout Size设置resize,新增resizeByImageViewLayoutSize()方法开启此功能。另外当你使用TransitionImageDisplayer作为displayer的时候会默认开启resizeByImageViewLayoutSize功能,因为不开启resizeByImageViewLayoutSize的话图片最终就会显示变形 ###1.2.0 ->* ``优化``. display的fire方法去掉了异步线程过滤,由于display基本都是在主线程执行的过滤异步线程没有意义 >* ``优化``. 改善了需要通过Handler在主线程执行回调以及显示的方式,以前是使用Runnable,现在时通过Message,这样就避免了创建Runnable,由于display是非常频繁的操作,因此这将会是有意义的改善 >* ``优化``. 优化了DisplayHelper的使用,以前是为每一次display都创建一个DisplayHelper,现在是只要你是按照display().fire()这样连续的使用,那么所有的display将共用一个DisplayHelper,这将会避免创建大量的DisplayHelper >* ``优化``. ProgressListener.onUpdateProgress(long, long)改为ProgressListener.onUpdateProgress(int, int),因为int足够用了 [查看更多...](https://github.com/xiaopansky/Spear/wiki/Change-log/_edit) -###License +##License ```java /* * Copyright (C) 2013 Peng fei Pan @@ -247,4 +219,4 @@ display()与load()、download()的区别 * See the License for the specific language governing permissions and * limitations under the License. */ -``` +``` \ No newline at end of file diff --git a/docs/device-2014-10-22-004320.png b/docs/device-2014-10-22-004320.png deleted file mode 100644 index 234430b8dd..0000000000 Binary files a/docs/device-2014-10-22-004320.png and /dev/null differ diff --git a/docs/device-2014-10-22-004345.png b/docs/device-2014-10-22-004345.png deleted file mode 100644 index 981190a81f..0000000000 Binary files a/docs/device-2014-10-22-004345.png and /dev/null differ diff --git a/docs/device-2014-10-22-004413.png b/docs/device-2014-10-22-004413.png deleted file mode 100644 index bce0ed60e0..0000000000 Binary files a/docs/device-2014-10-22-004413.png and /dev/null differ diff --git a/docs/device-2014-10-22-004432.png b/docs/device-2014-10-22-004432.png deleted file mode 100644 index f3f3526cb5..0000000000 Binary files a/docs/device-2014-10-22-004432.png and /dev/null differ diff --git a/docs/device-2015-01-13-235248.png b/docs/device-2015-01-13-235248.png new file mode 100644 index 0000000000..ae210323ae Binary files /dev/null and b/docs/device-2015-01-13-235248.png differ diff --git a/docs/device-2015-01-13-235325.png b/docs/device-2015-01-13-235325.png new file mode 100644 index 0000000000..bea3284744 Binary files /dev/null and b/docs/device-2015-01-13-235325.png differ diff --git a/docs/device-2015-01-13-235423.png b/docs/device-2015-01-13-235423.png new file mode 100644 index 0000000000..c816da351f Binary files /dev/null and b/docs/device-2015-01-13-235423.png differ diff --git a/docs/device-2015-01-13-235803.png b/docs/device-2015-01-13-235803.png new file mode 100644 index 0000000000..4e8ef9e2b7 Binary files /dev/null and b/docs/device-2015-01-13-235803.png differ diff --git a/docs/sampe_debug_mode.jpeg b/docs/sampe_debug_mode.jpeg new file mode 100644 index 0000000000..52f28744ab Binary files /dev/null and b/docs/sampe_debug_mode.jpeg differ diff --git a/docs/sample.jpg b/docs/sample.jpg index 349e1ec010..f1ed1c086f 100644 Binary files a/docs/sample.jpg and b/docs/sample.jpg differ diff --git a/releases/SpearSample-2.4.1.apk b/releases/SpearSample-2.4.1.apk deleted file mode 100644 index fb811d89df..0000000000 Binary files a/releases/SpearSample-2.4.1.apk and /dev/null differ diff --git a/releases/SpearSample-2.5.0.apk b/releases/SpearSample-2.5.0.apk new file mode 100644 index 0000000000..3199d5335b Binary files /dev/null and b/releases/SpearSample-2.5.0.apk differ diff --git a/releases/sample_apk_download_url.png b/releases/sample_apk_download_url.png new file mode 100644 index 0000000000..c19845eacb Binary files /dev/null and b/releases/sample_apk_download_url.png differ diff --git a/releases/spear-1.2.0-sources.zip b/releases/spear-1.2.0-sources.zip deleted file mode 100644 index f4ff9b6398..0000000000 Binary files a/releases/spear-1.2.0-sources.zip and /dev/null differ diff --git a/releases/spear-1.2.0.jar b/releases/spear-1.2.0.jar deleted file mode 100644 index 0407405e1d..0000000000 Binary files a/releases/spear-1.2.0.jar and /dev/null differ diff --git a/releases/spear-1.3.0-sources.zip b/releases/spear-1.3.0-sources.zip new file mode 100644 index 0000000000..adc36b1597 Binary files /dev/null and b/releases/spear-1.3.0-sources.zip differ diff --git a/releases/spear-1.3.0.jar b/releases/spear-1.3.0.jar new file mode 100644 index 0000000000..ddc11c3710 Binary files /dev/null and b/releases/spear-1.3.0.jar differ diff --git a/sample/build.gradle b/sample/build.gradle index dd4d6d6e7e..6869d1d574 100644 --- a/sample/build.gradle +++ b/sample/build.gradle @@ -1,98 +1,37 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 21 // 编译版本为API 21(Android 5.0 Lollipop) - buildToolsVersion "21.1.1" // 构建工具使用21.1版的 + compileSdkVersion 21 + buildToolsVersion "21.1.2" defaultConfig { - applicationId "me.xiaoapn.android.imageloader" // 默认的APP ID - minSdkVersion 9 // 最小版本为API 9(Android 2.3 Gingerbread) - targetSdkVersion 21 // 目标版本为API 21(Android 5.0 Lollipop) - versionCode 241 // 版本号 - versionName "2.4.1" // 版本名称 + applicationId "me.xiaoapn.android.imageloader" + minSdkVersion 9 + targetSdkVersion 21 + versionCode 251 + versionName "2.5.1" } - signingConfigs { - // 默认的签名 - defaultSigning { - keyAlias 'android-imageloader' - keyPassword 'u2gHWYjiaUB022VV' - storeFile file('/Users/xiaopan/Workspace/Spear/sample/SpearSample.jks') - storePassword 'u2gHWYjiaUB022VV' - } - } - - // 配置构建类型,在原有基础上增加国内版和国外版 buildTypes { - // 默认就有的 - debug{ - - } - - // 默认就有的 release { - minifyEnabled false // 不开启proguard - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - signingConfig signingConfigs.defaultSigning - } - - // 国内版 - internal { - minifyEnabled false // 不开启proguard - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - signingConfig signingConfigs.defaultSigning - applicationIdSuffix '.internal' // 修改APP ID,在默认ID的基础上追加.internal - } - - // 国外版 - external { - minifyEnabled false // 不开启proguard + minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - signingConfig signingConfigs.defaultSigning - applicationIdSuffix '.external' // 修改APP ID,在默认ID的基础上追加.external } } - // 配置不同的渠道标识 - productFlavors{ - AppChina{ - manifestPlaceholders = [UMENG_CHANNEL:"AppChina"] - } - - YignYongBao{ - manifestPlaceholders = [UMENG_CHANNEL:"YignYongBao"] - } - - WanDouJia{ - manifestPlaceholders = [UMENG_CHANNEL:"WanDouJia"] - } - - BaiDu{ - manifestPlaceholders = [UMENG_CHANNEL:"BaiDu"] - } - - GooglePlay{ - manifestPlaceholders = [UMENG_CHANNEL:"GooglePlay"] - } - - QihooAppStore{ - manifestPlaceholders = [UMENG_CHANNEL:"QihooAppStore"] - } + lintOptions { + abortOnError false } } -// 配置依赖 dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile project(':library') - compile 'com.android.support:appcompat-v7:21.0.2' - compile 'com.android.support:cardview-v7:21.0.0' - compile 'com.android.support:palette-v7:21.0.0' + compile 'com.android.support:appcompat-v7:21.0.3' compile 'com.android.support:recyclerview-v7:21.0.0' compile(name: 'pager-sliding-strip-1.5.1', ext: 'aar') } -// 将libs目录作为仓库 repositories{ flatDir{ dirs 'libs' diff --git a/sample/sample.iml b/sample/sample.iml index ac6495eb13..293376a450 100644 --- a/sample/sample.iml +++ b/sample/sample.iml @@ -8,12 +8,12 @@ - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + @@ -104,18 +83,16 @@ - + - - + + - - diff --git a/sample/src/main/AndroidManifest.xml b/sample/src/main/AndroidManifest.xml index 843cff2cb9..654cf36377 100644 --- a/sample/src/main/AndroidManifest.xml +++ b/sample/src/main/AndroidManifest.xml @@ -20,12 +20,7 @@ - - - - - diff --git "a/\345\276\205\345\212\236.txt" "b/\345\276\205\345\212\236.txt" deleted file mode 100644 index cc9c21d8ac..0000000000 --- "a/\345\276\205\345\212\236.txt" +++ /dev/null @@ -1,12 +0,0 @@ -更新日志: - -WIKI: -2. 加上如果你的程序要兼容2.3及以下版本,那么必须使用SpearImageView,因为2.3及以下的Bitmap的回收需要自己处理,因此必须使用RecyclingBitmapDrawable结合SpearImageView才能保证图片被正确的销毁 -3. 将示例、wiki什么的当中的ImageView都改为SpearImageView -4. 在Feture中特别提醒完全兼容RecyclerView,附上链接说明为什么要兼容RecyclerView -5. 写一篇WIKI,专门介绍如何兼容RecyclerView,关键点就是在于由于要使用RecyclingBitmapDrawable而不得不在SpearImageView的onDetachedFromWindow中执行setImageDrawable(null),又由于在RecyclerView中往回滚的时候会执行onDetachedFromWindow()方法这样一来,由于执行了setImageDrawable(null)就导致图片就显示不出来了 -6. SpearImageView新增了显示进度功能 - -其它: -1. PullRefreshLayout结合RecyclerView在2.3上不能正常回滚,主要解决思路为试一下android自带的PullLayout能不能兼容再说 -2. 当ResponseHandleCompletedAfterListener发生异常的时候 竟然神奇的不往下走了 \ No newline at end of file