From dbb85a8c603f5bb63b76d6aee9655aea517664b7 Mon Sep 17 00:00:00 2001 From: panpengfei Date: Sat, 4 Jun 2016 22:22:45 +0800 Subject: [PATCH] update wiki --- docs/wiki/disk_cache.md | 3 + docs/wiki/display_gif_image.md | 4 +- docs/wiki/displayer.md | 3 + docs/wiki/error_callback.md | 19 ++++ docs/wiki/http_stack.md | 6 +- docs/wiki/in_sample_size.md | 46 +++++++++ docs/wiki/load_download.md | 108 --------------------- docs/wiki/max_size.md | 28 ++++++ docs/wiki/maxsize_resize_in_sample_size.md | 99 ------------------- docs/wiki/memory_cache.md | 4 +- docs/wiki/options.md | 4 +- docs/wiki/pause_download.md | 1 + docs/wiki/pause_load.md | 3 + docs/wiki/pre_process_image.md | 2 + docs/wiki/process_image.md | 2 + docs/wiki/resize.md | 23 +++++ docs/wiki/sketch_image_view.md | 4 +- docs/wiki/sync.md | 33 +++++++ 18 files changed, 179 insertions(+), 213 deletions(-) create mode 100644 docs/wiki/error_callback.md create mode 100644 docs/wiki/in_sample_size.md delete mode 100644 docs/wiki/load_download.md create mode 100644 docs/wiki/max_size.md delete mode 100644 docs/wiki/maxsize_resize_in_sample_size.md create mode 100644 docs/wiki/resize.md create mode 100644 docs/wiki/sync.md diff --git a/docs/wiki/disk_cache.md b/docs/wiki/disk_cache.md index c412ddd8da..ba3b582798 100644 --- a/docs/wiki/disk_cache.md +++ b/docs/wiki/disk_cache.md @@ -1,3 +1,5 @@ +#### 简介 + DiskCache用来在本地磁盘上缓存图片,默认实现是LruDiskCache,其核心是DiskLruCache #### 相关方法 @@ -17,6 +19,7 @@ Configuration configuration = Sketch.with(context).getConfiguration(); configuration.setDiskCache(new LruDiskCache(context, 1, 50 * 1024 * 1024)); ``` +#### 使用缓存时加锁 如果你要通过edit(String)方法编辑磁盘缓存,那么你需要加同步锁,如下: ```java DiskCache diskCache = Sketch.with(context).getConfiguration().getDiskCache(); diff --git a/docs/wiki/display_gif_image.md b/docs/wiki/display_gif_image.md index d9895a5b33..0490635a85 100644 --- a/docs/wiki/display_gif_image.md +++ b/docs/wiki/display_gif_image.md @@ -3,9 +3,9 @@ Sketch集成了android-gif-drawable 1.1.7支持GIF图片,使用时只需像显 关键点: >* Sketch会根据mimeType判断是否是GIF图,因此不用担心识别不了伪装成jpg的GIF图 >* Sketch提供了decodeGifImage属性来可以控制是否使用GifDrawable解码GIF图,默认false, -如果为false的话就会使用BitmapFactory只读取第一帧,属性配置请参考[配置各种属性](options.md) +如果为false的话就会使用BitmapFactory只读取第一帧,属性配置请参考[配置各种属性.md](options.md) >* GifDrawable不能使用maxSize、resize、TransitionImageDisplayer >* Gif图还不能使用内存缓存,因为GifDrawable需要依赖Callback才能播放, 如果缓存的话就会出现一个GifDrawable被显示在多个ImageView上的情况,这时候就只有最后一个能正常播放 -SketchImageView还支持当显示的图片是GIF图时在右下角显示一个图标,告诉用户这是一张GIF图,详情请参考[SketchImageView详细使用说明](sketch_image_view.md) \ No newline at end of file +SketchImageView还支持当显示的图片是GIF图时在右下角显示一个图标,告诉用户这是一张GIF图,详情请参考[SketchImageView详细使用说明.md](sketch_image_view.md) \ No newline at end of file diff --git a/docs/wiki/displayer.md b/docs/wiki/displayer.md index b8f2ba889f..e911b3e04f 100644 --- a/docs/wiki/displayer.md +++ b/docs/wiki/displayer.md @@ -1,3 +1,5 @@ +#### 简介 + ImageDisplayer是最后用来显示图片的,目前Sketch内置了以下五种ImageDisplayer: >* DefaultImageDisplayer: 默认的图片显示器,没有任何动画效果; >* ZoomInImageDisplayer:由小到大的显示图片,缩放比例是从0.5f到1.0f; @@ -5,6 +7,7 @@ ImageDisplayer是最后用来显示图片的,目前Sketch内置了以下五种 >* TransitionImageDisplayer: 过渡效果显示器,如果SketchImageView当前显示的有图片,就会用已有的图片和新的图片生成一个TransitionDrawable,以过渡渐变的方式显示。如果当前没有显示图片的话就用一张透明的ColorDrawable作为旧图片和新的图片生成一个TransitionDrawable,以过渡渐变的方式显示。 >* ColorTransitionImageDisplayer:颜色过渡显示器,你可以指定一种颜色作为过渡效果的起始色。 +#### TransitionImageDisplayer 在使用TransitionDrawable的时候,当两张图片的比例不一致,TransitionDrawable会依照尺寸比较大的图片强行将另一张图片拉伸,这样最终显示出来的效果就是变形的。 为了解决这个问题,在使用TransitionImageDisplayer的时候如果Sketch检测到SketchImageView的layout_width和layout_height是写死的, diff --git a/docs/wiki/error_callback.md b/docs/wiki/error_callback.md new file mode 100644 index 0000000000..f05117e071 --- /dev/null +++ b/docs/wiki/error_callback.md @@ -0,0 +1,19 @@ +#### 简介 + +Sketch在运行的过程中会有各种各样的异常,你可以通过ErrorCallback收到这些异常,然后将这些异常记录下来帮助解决问题 + +### 使用 + +ErrorCallback默认实现只是将收到的异常打印在了logcat中,而你需要继承ErrorCallback然后去记录异常 + +ErrorCallback包含以下方法: +>* onInstallDiskCacheFailed(Exception, File):安装DiskLruCache失败,但Sketch还是可以正常运行的。 + 一旦失败了这个方法就会被频繁回调,这是因为每一次需要用到DiskCache的时候都会尝试恢复,再次失败就会再次回调。 + 因此你在记录日志的时候不必每次失败都记,可以每隔一个小时记一次 +>* onDecodeGifImageFailed(Throwable, LoadRequest, BitmapFactory.Options):解码GIF图片失败。你需要过滤一下Throwable, + 如果是UnsatisfiedLinkError或ExceptionInInitializerError就是找到libpl_droidsonroids_gif.so, + 这个时候你就要记录一下当前设备的abi类型,Sketch中包含的libpl_droidsonroids_gif.so已经覆盖了全平台了,如果还找不到就说明有其他的问题了。 + 另外这里的Options是只含有outWidth、outHeight、outMimeType信息的 +>* onDecodeNormalImageFailed(Throwable, LoadRequest, BitmapFactory.Options):解码普通图片失败。这里的Options是只含有outWidth、outHeight、outMimeType、inSampleSize信息的 + +最后调用Sketch.with(context).getConfiguration().setErrorCallback(ErrorCallback)使用你的ErrorCallback \ No newline at end of file diff --git a/docs/wiki/http_stack.md b/docs/wiki/http_stack.md index 5176c24489..916ddd23c4 100644 --- a/docs/wiki/http_stack.md +++ b/docs/wiki/http_stack.md @@ -1,4 +1,8 @@ -HttpStack用来发起网络请求,并且返回响应,默认的实现是HurlStack +#### 简介 + +HttpStack用来发起网络请求,并且返回响应 + +默认的实现是API9及以上使用HurlStack以下使用HttpClientStack #### 相关配置: >* setMaxRetryCount(int maxRetryCount):设置连接超时后重试次数,默认1 diff --git a/docs/wiki/in_sample_size.md b/docs/wiki/in_sample_size.md new file mode 100644 index 0000000000..0351474178 --- /dev/null +++ b/docs/wiki/in_sample_size.md @@ -0,0 +1,46 @@ +#### 简介 + +inSampleSize是用来减小读到内存中的图片的尺寸,非常重要,默认的实现是ImageSizeCalculator.calculateInSampleSize(int, int, int, int)方法 +```java +@Override +public int calculateInSampleSize(int outWidth, int outHeight, int targetWidth, int targetHeight) { + // 如果目标尺寸都小于等于0,那就别计算了没意义 + if(targetWidth <= 0 && targetHeight <= 0){ + return 1; + } + + // 如果目标尺寸都大于等于原始尺寸,也别计算了没意义 + if(targetWidth >= outWidth && targetHeight >= outHeight){ + return 1; + } + + // 首先根据缩放后只要有任何一边小于等于目标即可的规则计算一遍inSampleSize + int inSampleSize = 1; + do{ + inSampleSize *= 2; + }while ((outWidth/inSampleSize) > targetWidth && (outHeight/inSampleSize) > targetHeight); + + // 然后根据比较像素总数的原则过滤掉那些比较极端的一边特别小,一边特别大的图片 + // 比如目标尺寸是400x400,图片的尺寸是6000*600,缩放后是3000*300 + // 这样看来的确是满足了第一个条件了,但是图片的尺寸依然很大 + // 因此这一步我们根据像素总数来过滤,规则是总像素数不得大于目标尺寸像素数的两倍 + long totalPixels = (outWidth/inSampleSize) * (outHeight/inSampleSize); + final long totalReqPixelsCap = targetWidth * targetHeight * 2; + while (totalPixels > totalReqPixelsCap) { + inSampleSize *= 2; + totalPixels /= 2; + } + + return inSampleSize; +} +``` + +其实现规则是: +>* 如果目标尺寸的宽高都小于0,就不计算了直接返回1 +>* 如果目标尺寸的宽高都大于原图的宽高,就不计算了直接返回1 +>* 然后开始每次乘以2计算inSampleSize,直到应用inSampleSize后原图的宽或高小于目标尺寸的宽或高即可 +>* 接下来开始按照总像素数进行就算inSampleSize,直到应用inSampleSize后原图的总像素数小于目标尺寸总像素数的2倍即可 + +#### 自定义inSampleSize计算规则 +如果你想自定义inSampleSize的话,你只需继承ImageSizeCalculator,并重写calculateInSampleSize(int, int, int, int)方法, +然后调用Sketch.with(context).getConfiguration().setImageSizeCalculator(ImageSizeCalculator)方法应用即可 \ No newline at end of file diff --git a/docs/wiki/load_download.md b/docs/wiki/load_download.md deleted file mode 100644 index d78b37e674..0000000000 --- a/docs/wiki/load_download.md +++ /dev/null @@ -1,108 +0,0 @@ -Sketch共有display()、load()、download()三个方法可供使用,你可以根据你的需求选择合适的方法 - -|方法|作用|Options|Helper| -|:--|:--|:--|:--| -|download()|下载图片到本地,并实现本地缓存|DownloadOptions|DownloadHelper| -|load()|在download()方法的基础上,加载图片到内存中,并对图片进行处理|LoadOptions|LoadHelper| -|display()|在load()方法的基础上,将图片缓存在内存中并显示在ImageView上|DisplayOptions|DisplayHelper| - -示例: -``` -// 显示 -Sketch.with(context).display("http://biying.png", sketchImageView) - .loadingImage(R.drawable.image_loading) - .commit(); - -// 加载 -Sketch.with(context).load("http://biying.png", new LoadListener() { - @Override - public void onStarted() { - - } - - @Override - public void onCompleted(Bitmap bitmap, ImageFrom imageFrom, String mimeType) { - - } - - @Override - public void onCompleted(GifDrawable gifDrawable, ImageFrom imageFrom, String mimeType) { - - } - - @Override - public void onFailed(FailedCause failedCause) { - - } - - @Override - public void onCanceled(CancelCause cancelCause) { - - } -}).maxSize(100, 100).commit(); - -// 下载 -Sketch.with(context).download("http://biying.png", new DownloadListener() { - @Override - public void onStarted() { - - } - - @Override - public void onCompleted(File cacheFile, boolean isFromNetwork) { - - } - - @Override - public void onCompleted(byte[] data) { - - } - - @Override - public void onFailed(FailedCause failedCause) { - - } - - @Override - public void onCanceled(CancelCause cancelCause) { - - } -}).commit(); -``` - -跟过属性配置请参考[配置各种属性](options.md) - -#### 同步执行 sync -load()和download()还支持同步执行,只需调用sync()方法开启即可,如: -```java -Sketch.with(context).load("http://biying.png", new LoadListener() { - @Override - public void onStarted() { - - } - - @Override - public void onCompleted(Bitmap bitmap, ImageFrom imageFrom, String mimeType) { - - } - - @Override - public void onCompleted(GifDrawable gifDrawable, ImageFrom imageFrom, String mimeType) { - - } - - @Override - public void onFailed(FailedCause failedCause) { - - } - - @Override - public void onCanceled(CancelCause cancelCause) { - - } -}).maxSize(100, 100).sync().commit(); -``` - -需要注意: ->* 不能在主线程开启同步,否则会运行时抛异常 ->* 不仅下载、加载会在当前线程执行,listener也会在当前线程回调 \ No newline at end of file diff --git a/docs/wiki/max_size.md b/docs/wiki/max_size.md new file mode 100644 index 0000000000..698d9fdf73 --- /dev/null +++ b/docs/wiki/max_size.md @@ -0,0 +1,28 @@ +#### 简介 +maxSize用来防止加载过大的图片到内存中,已达到节省内存的目的 + +#### 背景 +我们在移动端显示图片的时候都需要面对加载大尺寸图片的问题 +目前主流的Android旗舰机内存一般在2G左右,而APP最多可用内存为200M左右 +现在手机都是800万像素的,随便拍一张照片都是3264x1840的,那么加载到内存中就需要3264x1840x4/1024/1024=22M,照这么看加载9张3264x1840的图片内存就耗完了,显然我们不能这样搞 + +#### 何时使用 +ImageDecoder会在读取图片的时候根据maxSize计算出合适的inSampleSize,然后再读取图片 + +#### 关于inSampleSize +BitmapFactory提供了一个Options来配置读取图片的相关选项,其中一个参数就是inSampleSize,其作用是设置缩放倍数。 + +例如: + 原图尺寸3264x1840 + inSampleSize=2 +那么最终读到内存的图片的尺寸就是1632x920,宽高都缩小了2倍,其所占内存从23M缩小到1632x920x4/1024/1024=5.7M,缩小了4倍。 + +#### 缺省值 +>* 在使用load()方法加载图片的时候maxSize的缺省值是当前设备屏幕的0.75倍 +>* 在使用SketchImageView的时候如果layout_width和layout_height是固定的那么就会用layout_width和layout_height来作为maxSize,否则就使用当前屏幕宽高的0.75倍来作为maxSize + +因此在大多数情况下你不需要主动设置maxSize,Sketch会自动帮你搞定 + +#### 自定义maxSize计算规则 +如果你对现有的maxSize计算规则不满意,那么你可以继承ImageSizeCalculator类重写calculateImageMaxSize()方法实现你自己的计算规则 +然后调用Sketch.with(context).getConfiguration().setImageSizeCalculator(ImageSizeCalculator)方法来使用你自定义的ImageSizeCalculator \ No newline at end of file diff --git a/docs/wiki/maxsize_resize_in_sample_size.md b/docs/wiki/maxsize_resize_in_sample_size.md deleted file mode 100644 index eb1a5de4ab..0000000000 --- a/docs/wiki/maxsize_resize_in_sample_size.md +++ /dev/null @@ -1,99 +0,0 @@ -### maxSize -maxSize用来防止加载过大的图片到内存中,已达到节省内存的目的 - -####背景 -我们在移动端显示图片的时候都需要面对加载大尺寸图片的问题 -目前主流的Android旗舰机内存一般在2G左右,而APP最多可用内存为200M左右 -现在手机都是800万像素的,随便拍一张照片都是3264x1840的,那么加载到内存中就需要3264x1840x4/1024/1024=22M,照这么看加载9张3264x1840的图片内存就耗完了,显然我们不能这样搞 - -####何时使用 -ImageDecoder会在读取图片的时候根据maxSize计算出合适的inSampleSize,然后再读取图片 - -####关于inSampleSize -BitmapFactory提供了一个Options来配置读取图片的相关选项,其中一个参数就是inSampleSize,其作用是设置缩放倍数。 - -例如: - 原图尺寸3264x1840 - inSampleSize=2 -那么最终读到内存的图片的尺寸就是1632x920,宽高都缩小了2倍,其所占内存从23M缩小到1632x920x4/1024/1024=5.7M,缩小了4倍。 - -####缺省值 ->* 在使用load()方法加载图片的时候maxSize的缺省值是当前设备屏幕的0.75倍 ->* 在使用SketchImageView的时候如果layout_width和layout_height是固定的那么就会用layout_width和layout_height来作为maxSize,否则就使用当前屏幕宽高的0.75倍来作为maxSize - -因此在大多数情况下你不需要主动设置maxSize,Sketch会自动帮你搞定 - -####自定义maxSize计算规则 -如果你对现有的maxSize计算规则不满意,那么你可以继承ImageSizeCalculator类重写calculateImageMaxSize()方法实现你自己的计算规则 -然后调用Sketch.with(context).getConfiguration().setImageSizeCalculator(ImageSizeCalculator)方法来使用你自定义的ImageSizeCalculator - - -### resize -resize用来修剪图片以及调整宽高比例,使用maxSize可以加载合适尺寸的图片到内存中,那么有的时候我们可能还需要固定尺寸的图片或固定宽高比例的图片,resize就是 用来解决这个问题的。 - -规则如下: ->* 如果原图的尺寸大于resize则按resize裁剪,如果小于resize则会按照resize的比例修剪原图,让原图的宽高比同resize一样。 ->* 如果forceUseResize为true,则即使原图尺寸小于resize,则也会按照resize的尺寸创建一张新的图片。 - -####使用 -```java -DisplayOptions options = ...; -options.setResize(300, 300); -options.seForceUseResize(true); -``` - -```java -Sketch.with(context).load(R.drawable.ic_launcher, new LoadListener(){ -... -}) -.resize(300, 300) -.commit(); -``` - -使用DisplayOptions的时候还可以使用resizeByFixedSize(true)方法自动使用SketchImageView的layout_width和layout_height作为resize - - -### inSampleSize -inSampleSize是用来减小读到内存中的图片的尺寸,非常重要,默认的实现是ImageSizeCalculator.calculateInSampleSize(int, int, int, int)方法 -```java -@Override -public int calculateInSampleSize(int outWidth, int outHeight, int targetWidth, int targetHeight) { - // 如果目标尺寸都小于等于0,那就别计算了没意义 - if(targetWidth <= 0 && targetHeight <= 0){ - return 1; - } - - // 如果目标尺寸都大于等于原始尺寸,也别计算了没意义 - if(targetWidth >= outWidth && targetHeight >= outHeight){ - return 1; - } - - // 首先根据缩放后只要有任何一边小于等于目标即可的规则计算一遍inSampleSize - int inSampleSize = 1; - do{ - inSampleSize *= 2; - }while ((outWidth/inSampleSize) > targetWidth && (outHeight/inSampleSize) > targetHeight); - - // 然后根据比较像素总数的原则过滤掉那些比较极端的一边特别小,一边特别大的图片 - // 比如目标尺寸是400x400,图片的尺寸是6000*600,缩放后是3000*300 - // 这样看来的确是满足了第一个条件了,但是图片的尺寸依然很大 - // 因此这一步我们根据像素总数来过滤,规则是总像素数不得大于目标尺寸像素数的两倍 - long totalPixels = (outWidth/inSampleSize) * (outHeight/inSampleSize); - final long totalReqPixelsCap = targetWidth * targetHeight * 2; - while (totalPixels > totalReqPixelsCap) { - inSampleSize *= 2; - totalPixels /= 2; - } - - return inSampleSize; -} -``` - -其实现规则是: ->* 如果目标尺寸的宽高都小于0,就不计算了直接返回1 ->* 如果目标尺寸的宽高都大于原图的宽高,就不计算了直接返回1 ->* 然后开始每次乘以2计算inSampleSize,直到应用inSampleSize后原图的宽或高小于目标尺寸的宽或高即可 ->* 接下来开始按照总像素数进行就算inSampleSize,直到应用inSampleSize后原图的总像素数小于目标尺寸总像素数的2倍即可 - -如果你想自定义inSampleSize的话,你只需继承ImageSizeCalculator,并重写calculateInSampleSize(int, int, int, int)方法, -然后调用Sketch.with(context).getConfiguration().setImageSizeCalculator(ImageSizeCalculator)方法应用即可 \ No newline at end of file diff --git a/docs/wiki/memory_cache.md b/docs/wiki/memory_cache.md index 90855e3acd..148c550bd7 100644 --- a/docs/wiki/memory_cache.md +++ b/docs/wiki/memory_cache.md @@ -1,3 +1,5 @@ +#### 简介 + MemoryCache用来在内存中缓存图片,默认的实现是LruMemoryCache,自动根据最少使用原则释放旧的图片 #### 相关方法: @@ -8,7 +10,7 @@ MemoryCache用来在内存中缓存图片,默认的实现是LruMemoryCache, >* get(String):获取缓存中指定的keu的图片 >* put(String, Drawable):将图片放到缓存中,注意Drawable必须实现RecycleDrawableInterface接口 -自定义内存缓存最大容量 +#### 自定义内存缓存最大容量 ```java // 最大容量为APP最大可用内存的十分之一 int newMemoryCacheMaxSize = (int) (Runtime.getRuntime().maxMemory() / 10); diff --git a/docs/wiki/options.md b/docs/wiki/options.md index 1c4f017052..fc3123302f 100644 --- a/docs/wiki/options.md +++ b/docs/wiki/options.md @@ -1,4 +1,6 @@ -Sketch有display()、load()、download()三大方法,我们可以通过其专属的Options或Helper([显示(display())、加载(load())和下载(download()))](load_download.md))来配置各种属性 +#### 简介 + +Sketch有display()、load()、download()三大方法,我们可以通过其专属的Options或Helper来配置各种属性 三大方法支持属性如下('-'代表不支持,非'-'代表支持并且默认值是什么): diff --git a/docs/wiki/pause_download.md b/docs/wiki/pause_download.md index b61a8bb353..98d50c77bf 100644 --- a/docs/wiki/pause_download.md +++ b/docs/wiki/pause_download.md @@ -11,6 +11,7 @@ Sketch.with(context).getConfiguration().setGlobalPauseDownload(true); Sketch.with(context).getConfiguration().setGlobalPauseDownload(false); ``` +#### 移动网络下暂停下载 结合此功能Sketch还提供了切换到移动网络的时候自动暂停下载图片的功能,如下: ```java // 开启移动网络下自动暂停下载图片功能 diff --git a/docs/wiki/pause_load.md b/docs/wiki/pause_load.md index 828161f89e..01d6c8d140 100644 --- a/docs/wiki/pause_load.md +++ b/docs/wiki/pause_load.md @@ -1,3 +1,5 @@ +#### 简介 + Sketch支持全局暂停从本地加载图片,暂停后Sketch将只会从内存中去找图片 ``暂停加载功能只对display请求有效`` @@ -11,6 +13,7 @@ Sketch.with(context).getConfiguration().setGlobalPauseLoad(true); Sketch.with(context).getConfiguration().setGlobalPauseLoad(false); ``` +#### 滑动时停止加载 你可以利用这个功能实现列表滑动中不加载图片,进一步提升列表的滑动流畅度 首先你需要添加ScrollingPauseLoadManager.java到你的项目中,支持RecyclerView和AbsListView diff --git a/docs/wiki/pre_process_image.md b/docs/wiki/pre_process_image.md index 7561f415ee..b23fe6a302 100644 --- a/docs/wiki/pre_process_image.md +++ b/docs/wiki/pre_process_image.md @@ -1,3 +1,5 @@ +#### 简介 + ImagePreprocessor用来辅助显示特殊文件中包含的图片,例如读取APK和已安装APP图片的功能就是用ImagePreprocessor来实现的 实现原理很简单,在解码之前,先执行ImagePreprocessor读取特殊文件中的图片,然后放到磁盘缓存中,解码的时候会优先读取磁盘缓存 diff --git a/docs/wiki/process_image.md b/docs/wiki/process_image.md index bce08ab700..3029113379 100644 --- a/docs/wiki/process_image.md +++ b/docs/wiki/process_image.md @@ -1,3 +1,5 @@ +#### 简介 + ImageProcessor是用来在ImageDecoder解码完图片之后在对图片进行处理的 目前内置了以下几种ImageProcessor: diff --git a/docs/wiki/resize.md b/docs/wiki/resize.md new file mode 100644 index 0000000000..41f8591caa --- /dev/null +++ b/docs/wiki/resize.md @@ -0,0 +1,23 @@ +#### 简介 +resize用来修剪图片以及调整宽高比例,使用maxSize可以加载合适尺寸的图片到内存中,那么有的时候我们可能还需要固定尺寸的图片或固定宽高比例的图片,resize就是 用来解决这个问题的。 + +规则如下: +>* 如果原图的尺寸大于resize则按resize裁剪,如果小于resize则会按照resize的比例修剪原图,让原图的宽高比同resize一样。 +>* 如果forceUseResize为true,则即使原图尺寸小于resize,则也会按照resize的尺寸创建一张新的图片。 + +#### 使用 +```java +DisplayOptions options = ...; +options.setResize(300, 300); +options.seForceUseResize(true); +``` + +```java +Sketch.with(context).load(R.drawable.ic_launcher, new LoadListener(){ +... +}) +.resize(300, 300) +.commit(); +``` + +使用DisplayOptions的时候还可以使用resizeByFixedSize(true)方法自动使用SketchImageView的layout_width和layout_height作为resize \ No newline at end of file diff --git a/docs/wiki/sketch_image_view.md b/docs/wiki/sketch_image_view.md index 303b3c8890..98ccb9f209 100644 --- a/docs/wiki/sketch_image_view.md +++ b/docs/wiki/sketch_image_view.md @@ -1,3 +1,5 @@ +#### 简介 + SketchImageView用来代替ImageView,你必须使用SketchImageView才能保证图片会被正常回收 SketchImageView有以下特点: @@ -61,7 +63,7 @@ sketchImageView.getOptions() ```java sketchImageView.setOptions(DisplayOptions) ``` -具体的配置项请参考[配置各种属性](options.md) +具体的配置项请参考[配置各种属性.md](options.md) #### 2. 监听显示过程和下载进度 ```java diff --git a/docs/wiki/sync.md b/docs/wiki/sync.md new file mode 100644 index 0000000000..dc8068be55 --- /dev/null +++ b/docs/wiki/sync.md @@ -0,0 +1,33 @@ +load()和download()还支持同步执行,只需调用sync()方法开启即可,如: +```java +Sketch.with(context).load("http://biying.png", new LoadListener() { + @Override + public void onStarted() { + + } + + @Override + public void onCompleted(Bitmap bitmap, ImageFrom imageFrom, String mimeType) { + + } + + @Override + public void onCompleted(GifDrawable gifDrawable, ImageFrom imageFrom, String mimeType) { + + } + + @Override + public void onFailed(FailedCause failedCause) { + + } + + @Override + public void onCanceled(CancelCause cancelCause) { + + } +}).maxSize(100, 100).sync().commit(); +``` + +需要注意: +>* 不能在主线程开启同步,否则会运行时抛异常 +>* 不仅下载、加载会在当前线程执行,listener也会在当前线程回调 \ No newline at end of file