diff --git a/README.md b/README.md index b9f2b9bbb4..cc32929085 100644 --- a/README.md +++ b/README.md @@ -138,8 +138,8 @@ sketchImageView.displayInstalledAppIcon("com.tencent.qq", 210); 基础功能: * [SketchImageView 详细使用说明](docs/wiki/sketch_image_view.md) -* [配置 Options](docs/wiki/options_config.md) -* [管理 Options](docs/wiki/options_manage.md) +* [Options & Helper](docs/wiki/options_and_helper.md) +* [管理多个 Options](docs/wiki/options_manage.md) * [只加载图片到内存或只下载图片到本地](docs/wiki/load_and_download.md) * [播放 GIF 图片](docs/wiki/display_gif_image.md) * [手势缩放、旋转图片](docs/wiki/zoom.md) @@ -161,7 +161,6 @@ sketchImageView.displayInstalledAppIcon("com.tencent.qq", 210); * [移动网络下暂停下载图片,节省流量](docs/wiki/pause_download.md) * [列表滑动时暂停加载图片,提升流畅度](docs/wiki/pause_load.md) * [显示 APK 或已安装 APP 的图标](docs/wiki/display_apk_or_app_icon.md) -* [通过 ImagePreprocessor 显示特殊文件中的图片(例如视频、MP3)](docs/wiki/pre_process_image.md) * [通过 MemoryCacheStateImage 先显示较模糊的图片,然后再显示清晰的图片](docs/wiki/memory_cache_state_image.md) 更多: diff --git a/README_EN.md b/README_EN.md index 8053cb61b4..29c0e55703 100644 --- a/README_EN.md +++ b/README_EN.md @@ -138,8 +138,8 @@ sketchImageView.displayInstalledAppIcon("com.tencent.qq", 210); Basic functions: * [SketchImageView Detailed Instructions](docs/wiki/sketch_image_view.md) -* [Config Options](docs/wiki/options_config.md) -* [Manage Options](docs/wiki/options_manage.md) +* [Options & Helper](docs/wiki/options_and_helper.md) +* [Manage Multiple Options](docs/wiki/options_manage.md) * [Just load the picture into memory or just download the picture to the local](docs/wiki/load_and_download.md) * [Play gif image](docs/wiki/display_gif_image.md) * [Gesture zoom, rotate the picture](docs/wiki/zoom.md) @@ -161,7 +161,6 @@ To further enhance the user experience: * [Mobile network to suspend downloading pictures, save traffic](docs/wiki/pause_download.md) * [Pause loading of images while sliding the list to improve fluency](docs/wiki/pause_load.md) * [Display APK or installed APP icon](docs/wiki/display_apk_or_app_icon.md) -* [Displaying images in special files with Image Preprocessor (eg video, MP3)](docs/wiki/pre_process_image.md) * [Through the MemoryCache StateImage first show more vague picture, and then display a clear picture](docs/wiki/memory_cache_state_image.md) More: diff --git a/docs/logs/log_2.5.0_temp.md b/docs/logs/log_2.5.0_temp.md index 8c02551127..af49e28fdd 100644 --- a/docs/logs/log_2.5.0_temp.md +++ b/docs/logs/log_2.5.0_temp.md @@ -35,6 +35,7 @@ bugs: * :fire: 移除 ErrorCause.SOURCE_BITMAP_RECYCLED * :fire: 移除 DownloadListener、LoadListener、DisplayListener 的 onStarted() 方法 * :fire: 移除 resizeByFixedSize 属性,Resize.byViewFixedSize() 代替,详情参考 [resize] +* :fire: 移除 shapeSizeByFixedSize 属性,ShapeSize.byViewFixedSize() 代替,详情参考 [shape_size] 重构: * :hammer: file:// 格式的 uri 已产生的磁盘缓存将全部作废,因为其磁盘缓存 key 去掉了 file:// @@ -65,4 +66,5 @@ wiki待办: [了解 Sketch 日志]: ../wiki/log.md [resize]: ../wiki/resize.md +[shape_size]: ../wiki/shape_size.md diff --git a/docs/wiki/display_gif_image.md b/docs/wiki/display_gif_image.md index 262efb3dff..5a470ea9ea 100644 --- a/docs/wiki/display_gif_image.md +++ b/docs/wiki/display_gif_image.md @@ -8,7 +8,7 @@ Sketch默认不解码gif图,只会通过BitmapFactory读取其第一帧作为 ``` sketImageView.getOptions().setDecodeGifImage(true); ``` -属性配置请参考[配置各种属性.md](options_config.md) +属性配置请参考[配置各种属性.md](options_and_helper.md) 注意: >* Sketch会根据mimeType判断是否是gif图,因此不用担心识别不了伪装成jpg的gif图 diff --git a/docs/wiki/load_and_download.md b/docs/wiki/load_and_download.md index d98123cccd..cb1c48ee4c 100644 --- a/docs/wiki/load_and_download.md +++ b/docs/wiki/load_and_download.md @@ -7,7 +7,7 @@ SketchImageView就是使用的 Sketch.display() 方法 每一种方法都有专用的Options、Listener、Helper -* Options:用来定制请求,[点击了解更多](options_config.md) +* Options:用来定制请求,[点击了解更多](options_and_helper.md) * Listener:用来监控请求的状态,[点击了解更多](listener.md) * Helper:用来组织请求并提交请求 diff --git a/docs/wiki/options_and_helper.md b/docs/wiki/options_and_helper.md new file mode 100644 index 0000000000..132c9a0dee --- /dev/null +++ b/docs/wiki/options_and_helper.md @@ -0,0 +1,141 @@ +# Options & Helper + +* Options:用于批量设置请求属性 +* Helper: 用于设置请求属性并提交请求 + +Sketch 的 display()、load()、download() 方法([参考 load_android_download.md])都有对应的 Options 和 Helper,如下: + +|Type|Options|Helper| +|:---|:---|:---| +|Sketch.display()|DisplayOptions|DisplayHelper| +|Sketch.load()|LoadOptions|LoadHelper| +|Sketch.download()|DownloadOptions|DownloadHelper| + +### Options 支持属性: + +`('-'代表不支持,非'-'代表支持并且默认值是什么)` + +|Attr|DownloadOptions|LoadOptions|DisplayOptions| +|:---|:---|:---|:---| +|requestLevel|NET|NET|NET| +|cacheInDiskDisabled|false|false|false| +|maxSize|-|屏幕的宽高|优先考虑ImageView的layout_width和layout_height| +|resize|-|null|null| +|forceUseResize|-|false|false| +|processor|-|null|null| +|decodeGifImage|-|false|false| +|lowQualityImage|-|false|false| +|bitmapConfig|-|null|null| +|inPreferQualityOverSpeed|-|false|false| +|thumbnailMode|-|false|false| +|cacheProcessedImageInDisk|-|false|false| +|bitmapPoolDisabled|-|false|false| +|correctImageOrientationDisabled|-|false|false| +|cacheInMemoryDisabled|-|-|false| +|displayer|-|-|DefaultImageDisplayer| +|loadingImage|-|-|null| +|errorImage|-|-|null| +|pauseDownloadImage|-|-|null| +|imageShaper|-|-|null| +|shapeSize|-|-|null| + +详解: + +* requestLevel: 指定请求的处理深度-[参考 RequestLevel] +* cacheInDiskDisabled: 禁用磁盘缓存-[参考 disk_cache.md] +* maxSize: 限制读取到内存的图片的尺寸-[参考 max_size.md] +* resize: 修改图片的尺寸-[参考 resize.md] +* forceUseResize: 强制使用 resize-[参考 resize.md] +* processor: 处理图片-[参考 process_image.md] +* decodeGifImage: 解码 GIF 图片,开启后可播放 GIF 图片-[参考 display_gif_image.md] +* lowQualityImage: 解码图片时优先使用低质量的 Bitmap.Config,例如 JPEG 图片将使用 ARGB_565 解码,具体请查看 [ImageType] 类 +* bitmapConfig: 强制指定解码图片时使用的 Bitmap.Config,KITKAT 以上版本不能使用 ARGB_4444 +* inPreferQualityOverSpeed: 解码时质量优先,可提高图片质量,但会降低解码速度,当你要频繁的对一张图片进行读取然后写出的时候一定要设置优先考虑质量 +* thumbnailMode: 开启缩略图模式-[参考 thumbnail_mode.md] +* cacheProcessedImageInDisk: 为了加快速度,将经过复杂出路的图片保存到磁盘缓存中,下次就直接读取-[参考 cache_processed_image_in_disk.md.md] +* bitmapPoolDisabled: 禁用BitmapPool-[参考 bitmap_pool.md] +* correctImageOrientationDisabled: 禁用纠正图片方向功能-[参考 correct_image_orientation.md.md] +* cacheInMemoryDisabled: 禁用内存缓存 +* displayer: 使用专门的显示效果来显示图片-[参考 displayer.md] +* loadingImage: 设置正在加载时显示的图片 +* errorImage: 设置加载失败时显示的图片 +* pauseDownloadImage: 设置暂停下载时显示的图片 +* imageShaper: 设置图片以什么形状显示-[参考 imag_shaper.md] +* shapeSize: 设置图片以多大尺寸显示-[参考 shape_size.md] + +Options 支持的属性 Helper 中都有对应的方法,只是方法名不一样(没有set) + +#### 使用Options: + +Sketch.display()、Sketch.load()、Sketch.download()都会返回其专属的Helper,Helper中也都会有专门的方法配置这些属性,例如: + +```java +// 显示 +Sketch.with(context).display("http://t.cn/RShdS1f", sketchImageView) + .loadingImage(R.drawable.image_loading) + .displayer(new TransitionImageDisplayer()) + ... + .commit(); + +// 加载 +Sketch.with(context).load("http://t.cn/RShdS1f", new LoadListener() {...}) + .maxSize(300, 400) + .bitmapConfig() + ... + .commit(); + +// 下载 +Sketch.with(context).download("http://t.cn/RShdS1f", new DownloadListener(){...}) + .disableCacheInDisk() + ... + .commit(); +``` + +各大Helper和SketchImageView还都支持批量设置Options + +```java +// 批量配置显示属性 +DisplayOptions displayOptions = new DisplayOptions(); +displayOptions.set***; + +Sketch.with(context).display("http://t.cn/RShdS1f", sketchImageView) + .options(displayOptions) + .commit(); + +SketchImageView sketchImageView = ...; +sketchImageView.setOptions(displayOptions); + +// 批量配置加载属性 +LoadOptions loadOptions = new LoadOptions(); +loadOptions.set***; + +Sketch.with(context).load("http://t.cn/RShdS1f", new LoadListener() {...}) + .options(loadOptions) + .commit(); + +// 批量配置下载属性 +DownloadOptions downloadOptions = new DownloadOptions(); +downloadOptions.set***; + +Sketch.with(context).download("http://t.cn/RShdS1f", new DownloadListener(){...}) + .options(downloadOptions) + .commit(); +``` + +``使用options方法和使用专用方法设置同一个属性时并不会冲突,就看谁最后执行`` + +[参考 RequestLevel]: ../../sketch/src/main/java/com/xiaopan/sketch/request/RequestLevel.java +[参考 load_android_download.md]: load_android_download.md +[参考 disk_cache.md]: disk_cache.md +[参考 thumbnail_mode.md]: thumbnail_mode.md +[ImageType]: ../../sketch/src/main/java/com/xiaopan/sketch/decode/ImageType.java +[参考 max_size.md]: max_size.md +[参考 resize.md]: resize.md +[参考 process_image.md]: process_image.md +[参考 display_gif_image.md]: display_gif_image.md +[参考 cache_processed_image_in_disk.md.md]: cache_processed_image_in_disk.md.md +[参考 bitmap_pool.md]: bitmap_pool.md +[参考 correct_image_orientation.md.md]: correct_image_orientation.md.md +[参考 displayer.md]: displayer.md +[参考 imag_shaper.md]: imag_shaper.md +[参考 shape_size.md]: shape_size.md diff --git a/docs/wiki/options_config.md b/docs/wiki/options_config.md deleted file mode 100644 index af864b134f..0000000000 --- a/docs/wiki/options_config.md +++ /dev/null @@ -1,165 +0,0 @@ -Sketch共有DisplayOptions `extends` LoadOptions `extends` DownloadOptions三种选项,分别对应display()、load()、download()三个方法 - -支持属性如下('-'代表不支持,非'-'代表支持并且默认值是什么): - -|属性|DownloadOptions|LoadOptions|DisplayOptions| -|:---|:---|:---|:---| -|sync|false|false|-| -|requestLevel|NET|NET|NET| -|listener|null|null|null| -|downloadProgressListener|null|null|null| -|cacheInDiskDisabled|false|false|false| -|maxSize|-|屏幕的宽高|优先考虑ImageView的layout_width和layout_height| -|resize|-|null|null| -|forceUseResize|-|false|false| -|processor|-|null|null| -|decodeGifImage|-|false|false| -|lowQualityImage|-|false|false| -|bitmapConfig|-|null|null| -|inPreferQualityOverSpeed|-|false|false| -|thumbnailMode|-|false|false| -|cacheProcessedImageInDisk|-|false|false| -|bitmapPoolDisabled|-|false|false| -|correctImageOrientationDisabled|-|false|false| -|cacheInMemoryDisabled|-|-|false| -|displayer|-|-|DefaultImageDisplayer| -|loadingImage|-|-|null| -|errorImage|-|-|null| -|pauseDownloadImage|-|-|null| -|imageShaper|-|-|null| -|shapeSize|-|-|null| -|shapeSizeByFixedSize|-|-|false| - -#### 属性详解 - -```java -DisplayOptions displayOptions = new DisplayOptions(); - -// 只能从本地加载图片,即使本地没有缓存也不下载了 -displayOptions.setRequestLevel(RequestLevel.LOCAL); - -// 禁用磁盘缓存 -displayOptions.setCacheInDiskDisabled(true); - -// 设置最大尺寸,用来解码Bitmap时计算inSampleSize,防止加载过大的图片到内存中。默认会先尝试用SketchImageView的layout_width和layout_height作为maxSize,否则会用当前屏幕的宽高作为maxSize -displayOptions.setMaxSize(1000, 1000); - -// 裁剪图片,将原始图片加载到内存中之后根据resize进行裁剪。裁剪的原则就是最终返回的图片的比例一定是跟resize一样的,但尺寸不一定会等于resize,也有可能小于resize -displayOptions.setResize(300, 300); - -// 强制使经过最终返回的图片同resize的尺寸一致 -displayOptions.setForceUseResize(true); - -// 解码gif图返回GifDrawable -displayOptions.setDecodeGifImage(true); - -// 尝试返回低质量的图片,例如PNG图片将使用ARGB_4444解析,具体的请查看ImageType类 -displayOptions.setLowQualityImage(true); - -// 强制使用RGB_565解码图片,KITKAT以上版本不能使用ARGB_4444 -displayOptions.setBitmapConfig(Bitmap.Config.RGB_565); - -// 解码图片的时候优先考虑质量(默认是优先考虑速度,当你要频繁的对一张图片进行读取然后写出的时候一定要设置优先考虑质量) -displayOptions.setInPreferQualityOverSpeed(true); - -// 开启缩略图模式(需要resize配合) -displayOptions.setThumbnailMode(true); - -// 将图片改成圆形的 -displayOptions.setImageProcessor(new CircleImageProcessor()); - -// 为了加快速度,将经过ImageProcessor、resize或thumbnailMode处理过或者读取时inSampleSize大于等于8的图片保存到磁盘缓存中,下次就直接读取 -displayOptions.setCacheProcessedImageInDisk(true); - -// 禁用BitmapPool -displayOptions.setBitmapPoolDisabled(true); - -// 禁用纠正图片方向功能 -displayOptions.setCorrectImageOrientationDisabled(true); - -// 禁用内存缓存 -displayOptions.setCacheInMemoryDisabled(true); - -// 设置正在加载时显示的图片 -displayOptions.setLoadingImage(R.drawable.image_loading); - -// 用resize和ImageProcessor修改R.drawable.image_loading然后作为正在加载时显示的图片 -displayOptions.setLoadingImage(new MakerStateImage(R.drawable.image_loading); - -// 设置加载失败时显示的图片 -displayOptions.setErrorImage(R.drawable.image_load_error); - -// 设置暂停下载时显示的图片 -displayOptions.setPauseDownloadImage(R.drawable.image_load_pause_download); - -// 使用过度效果来显示图片。如果你使用了TransitionImageDisplayer并且SketchImageView的layout_width和layout_height是固定的并且ScaleType是CENTER_CROP的话,就会自动使用FixedSizeBitmapDrawable的FixedSize功能,让占位图和实际图片的比例保持一致,这样可以保证最终显示不变形 -displayOptions.setImageDisplayer(new TransitionImageDisplayer()); - -// 以圆角矩形的形状绘制图片,包括loadingImage、errorImage、pauseDownloadImage以及要加载的图片 -displayOptions.setImageShaper(new ReoundRectImageShaper(20))); - -// 以500x500的尺寸绘制图片,包括loadingImage、errorImage、pauseDownloadImage以及要加载的图片 -displayOptions.setShapeSize(500, 500); - -// 使用ImageView的layout_width和layout_height作为shape size,优先级较高 -// displayOptions.setShapeSizeByFixedSize(true); -``` - -Options 支持的属性 Helper 中都有对应的方法,只是方法名不一样(没有set) - -#### 使用Options: -Sketch.display()、Sketch.load()、Sketch.download()都会返回其专属的Helper,Helper中也都会有专门的方法配置这些属性,例如: -```java -// 显示 -Sketch.with(context).display("http://t.cn/RShdS1f", sketchImageView) - .loadingImage(R.drawable.image_loading) - .displayer(new TransitionImageDisplayer()) - .shapeSizeByFixedSize() - ... - .commit(); - -// 加载 -Sketch.with(context).load("http://t.cn/RShdS1f", new LoadListener() {...}) - .maxSize(300, 400) - .bitmapConfig() - ... - .commit(); - -// 下载 -Sketch.with(context).download("http://t.cn/RShdS1f", new DownloadListener(){...}) - .disableCacheInDisk() - ... - .commit(); -``` - -各大Helper和SketchImageView还都支持批量设置Options -```java -// 批量配置显示属性 -DisplayOptions displayOptions = new DisplayOptions(); -displayOptions.set***; - -Sketch.with(context).display("http://t.cn/RShdS1f", sketchImageView) - .options(displayOptions) - .commit(); - -SketchImageView sketchImageView = ...; -sketchImageView.setOptions(displayOptions); - -// 批量配置加载属性 -LoadOptions loadOptions = new LoadOptions(); -loadOptions.set***; - -Sketch.with(context).load("http://t.cn/RShdS1f", new LoadListener() {...}) - .options(loadOptions) - .commit(); - -// 批量配置下载属性 -DownloadOptions downloadOptions = new DownloadOptions(); -downloadOptions.set***; - -Sketch.with(context).download("http://t.cn/RShdS1f", new DownloadListener(){...}) - .options(downloadOptions) - .commit(); -``` - -``使用options方法和使用专用方法设置同一个属性时并不会冲突,就看谁最后执行`` \ No newline at end of file diff --git a/docs/wiki/options_manage.md b/docs/wiki/options_manage.md index 4ac248ac19..40b14fba03 100644 --- a/docs/wiki/options_manage.md +++ b/docs/wiki/options_manage.md @@ -31,7 +31,7 @@ public class ImageOptions { .setErrorImage(R.drawable.image_error) .setPauseDownloadImage(R.drawable.image_pause_download) .setImageDisplayer(new TransitionImageDisplayer()) - .setShapeSizeByFixedSize(true); + .setShapeSize(ShapeSize.byViewFixedSize()); } }); @@ -44,7 +44,7 @@ public class ImageOptions { .setPauseDownloadImage(R.drawable.image_pause_download) .setImageDisplayer(new TransitionImageDisplayer()) .setImageShaper(new CircleImageShaper().setStroke(Color.WHITE, SketchUtils.dp2px(context, 1))) - .setShapeSizeByFixedSize(true); + .setShapeSize(ShapeSize.byViewFixedSize()); } }); @@ -57,7 +57,7 @@ public class ImageOptions { .setPauseDownloadImage(R.drawable.image_pause_download) .setImageShaper(new RoundRectImageShaper(SketchUtils.dp2px(context, 6))) .setImageDisplayer(new TransitionImageDisplayer()) - .setShapeSizeByFixedSize(true); + .setShapeSize(ShapeSize.byViewFixedSize()); } }); } diff --git a/docs/wiki/pre_process_image.md b/docs/wiki/pre_process_image.md deleted file mode 100644 index cd673493d1..0000000000 --- a/docs/wiki/pre_process_image.md +++ /dev/null @@ -1,16 +0,0 @@ -ImagePreprocessor用来辅助显示特殊文件中包含的图片,例如读取APK和已安装APP图片的功能就是用ImagePreprocessor来实现的 - -实现原理很简单,在解码之前,先通过ImagePreprocessor将特殊文件中包含的图片提取出来放到放到磁盘缓存中,解码的时候会磁盘缓存中读取图片 - -默认的ImagePreprocessor只实现了读取APK图标、已安装APP图标以及解析Base64图片的功能, - -#### 扩展ImagePreprocessor的功能 -你可以扩展ImagePreprocessor实现读取其他类型文件的图片(例如.MP4) - -首先你要实现Preprocessor接口写一个预处理类,实现以下方法: ->* boolean match(Context, UriInfo):根据uri判断是否需要预处理 ->* PreProcessResult process(Context, UriInfo):match方法返回true之后才会调用这个方法进行处理并返回处理结果 - -需要注意的是在process()方法中编辑磁盘缓存的时候要上锁,详情可参考[ApkIconPreprocessor](../../sketch/src/main/java/me/xiaopan/sketch/preprocess/ApkIconPreprocessor.java) - -然后调用Sketch.with(context).getConfiguration().getImagePreprocessor().addPreprocessor(Preprocessor)方法加进去即可 diff --git a/docs/wiki/resize.md b/docs/wiki/resize.md index 5a1bb5d111..8dd905fb01 100644 --- a/docs/wiki/resize.md +++ b/docs/wiki/resize.md @@ -1,6 +1,6 @@ ### Resize 用来干嘛? -Resize 用来调整图片的尺寸和宽高比例 +Resize 用来在解码时调整图片的尺寸和宽高比例 有的时候我们需要固定尺寸或固定宽高比的图片,例如将图片用作页面头部的背景,设计图上有标好的尺寸,但是图片的尺寸我们不能控制,这时候就可以用 Resize 用来解决问题 @@ -9,8 +9,9 @@ Resize 用来调整图片的尺寸和宽高比例 假如设计图上标明的图片尺寸是 720x385,那么我们如实配置即可 ```java -DisplayOptions options = ...; -options.setResize(720, 385); +SketchImageView sketchImageView = ...; +sketchImageView.getOptions().setResize(720, 385); +sketchImageView.displayImage("http://t.cn/RShdS1f"); ``` 注意,Resize 有两种模式: @@ -22,8 +23,9 @@ Resize 默认采用 ASPECT_RATIO_SAME 模式,这样的好处是会比较节省 如果你必须要求返回图片的尺寸跟 Resize 一模一样,那么你可以使用 EXACTLY_SAME 模式 ```java -DisplayOptions options = ...; -options.setResize(new Resize(720, 385, Resize.EXACTLY_SAME)); +SketchImageView sketchImageView = ...; +sketchImageView.getOptions().setResize(new Resize(720, 385, Resize.EXACTLY_SAME)); +sketchImageView.displayImage("http://t.cn/RShdS1f"); ``` ### 调整尺寸时的裁剪规则 @@ -33,24 +35,27 @@ options.setResize(new Resize(720, 385, Resize.EXACTLY_SAME)); 默认从 ImageView 获取,你也可以强制指定,如下: ```java -DisplayOptions options = ...; -options.setResize(new Resize(720, 385, ScaleType.CENTER_CROP)); +SketchImageView sketchImageView = ...; +sketchImageView.getOptions().setResize(new Resize(720, 385, ScaleType.CENTER_CROP)); +sketchImageView.displayImage("http://t.cn/RShdS1f"); ``` ### 自动使用 ImageView 的固定尺寸作为 Resize -当 ImageView 已经设置了固定尺寸的话,我们就可以不必再写一遍 resize 的尺寸,而是自动使用 ImageView 的尺寸,如下: +当 ImageView 已经设置了固定尺寸的话,我们就不必再写一遍 resize 的尺寸,而是自动使用 ImageView 的尺寸,如下: ```java -DisplayOptions options = ...; -options.setResize(Resize.byViewFixedSize()); +SketchImageView sketchImageView = ...; +sketchImageView.getOptions().setResize(Resize.byViewFixedSize()); +sketchImageView.displayImage("http://t.cn/RShdS1f"); ``` Resize.byViewFixedSize() 方法也可以设置 Resize.Mode,如下: ```java -DisplayOptions options = ...; -options.setResize(Resize.byViewFixedSize(Resize.EXACTLY_SAME)); +SketchImageView sketchImageView = ...; +sketchImageView.getOptions().setResize(Resize.byViewFixedSize(Resize.EXACTLY_SAME)); +sketchImageView.displayImage("http://t.cn/RShdS1f"); ``` 但是当你使用了此功能而 ImageView 却没有设置固定尺寸的话就会抛出异常,如下: diff --git a/docs/wiki/shape_size.md b/docs/wiki/shape_size.md index e41abfea05..7d36ec27aa 100644 --- a/docs/wiki/shape_size.md +++ b/docs/wiki/shape_size.md @@ -1,24 +1,45 @@ -ShapeSize用来在绘制图片时修改图片的尺寸 +### ShapeSize 用来干嘛? ->* 不会创建新的图片,原理就是用BitmapShader将图片填充到画笔里,然后画一个形状即可 ->* 当ShapeSize同原图的宽高比不一致时就会仅显示原图中间的部分,类似CENTER_CROP效果 ->* loadingImage、errorImage、pauseDownloadImage以及加载的图片都会被修改 +ShapeSize 用来配置 bitmap 以多大的尺寸显示,不会创建新的图片,原理就是用 BitmapShader 将图片填充到画笔里,然后画一个形状即可 + +### 使用 + +在 DisplayOptions 中设置即可,如下: -在DisplayOptions中设置即可使用: ```java -DisplayOptions options = new DisplayOptions(); -... -// 以300x300的尺寸显示图片 -options.setShapeSize(300, 300); +SketchImageView sketchImageView = ...; +sketchImageView.getOptions().setShapeSize(300, 300); +sketchImageView.displayImage("http://t.cn/RShdS1f"); +``` + +### 作用范围 + +loadingImage、errorImage、pauseDownloadImage 以及加载的图片都会被修改 + +### 调整尺寸时的裁剪规则 + +当 ShapeSize 的尺寸和原图片的尺寸不一致时就会对原图片进行裁剪,具体的裁剪规则是根据 ShapeSize 的 scaleType 属性决定的。 + +默认从 ImageView 获取,你也可以强制指定,如下: +```java +SketchImageView sketchImageView = ...; +sketchImageView.getOptions().setShapeSize(new ShapeSize(300, 300, ScaleType.CENTER_CROP)); +sketchImageView.displayImage("http://t.cn/RShdS1f"); +``` + +### 自动使用 ImageView 的固定尺寸作为 ShapeSize + +当 ImageView 已经设置了固定尺寸的话,我们就不必再写一遍 ShapeSize 的尺寸,而是自动使用 ImageView 的尺寸,如下: + +```java SketchImageView sketchImageView = ...; -sketchImageView.setOptions(options); -sketchImageView.displayImage(R.drawable.sample); +sketchImageView.getOptions().setShapeSize(ShapeSize.byViewFixedSize()); +sketchImageView.displayImage("http://t.cn/RShdS1f"); ``` -还可以用ImageView的固定宽高作为ShapeSize,如下: +但是当你使用了此功能而 ImageView 却没有设置固定尺寸的话就会抛出异常,如下: + ```java -DisplayOptions options = new DisplayOptions(); -options.setShapeSizeByFixedSize(true); +IllegalStateException: ImageView's width and height are not fixed, can not be applied with the ShapeSize.byViewFixedSize() function ``` -这时候ImageView的layout_width和layout_height必须是固定的值否则就会抛异常 diff --git a/docs/wiki/sketch_image_view.md b/docs/wiki/sketch_image_view.md index 946c2da844..97d65a732e 100644 --- a/docs/wiki/sketch_image_view.md +++ b/docs/wiki/sketch_image_view.md @@ -68,7 +68,7 @@ displayOptions.setErrorImage(R.drawable.image_error); sketchImageView.setOptions(displayOptions) ``` -具体的配置项请参考[配置各种属性.md](options_config.md) +具体的配置项请参考[配置各种属性.md](options_and_helper.md) #### 2.使用手势缩放和分块显示超大图功能 diff --git a/sample/src/main/java/me/xiaopan/sketchsample/ImageOptions.java b/sample/src/main/java/me/xiaopan/sketchsample/ImageOptions.java index 17e33291e0..8fdefda35b 100644 --- a/sample/src/main/java/me/xiaopan/sketchsample/ImageOptions.java +++ b/sample/src/main/java/me/xiaopan/sketchsample/ImageOptions.java @@ -31,6 +31,7 @@ import me.xiaopan.sketch.request.DisplayOptions; import me.xiaopan.sketch.request.DownloadOptions; import me.xiaopan.sketch.request.LoadOptions; +import me.xiaopan.sketch.request.ShapeSize; import me.xiaopan.sketch.shaper.CircleImageShaper; import me.xiaopan.sketch.shaper.RoundRectImageShaper; import me.xiaopan.sketch.state.DrawableStateImage; @@ -76,7 +77,7 @@ protected DownloadOptions onCreateOptions(Context context) { .setErrorImage(R.drawable.image_error) .setPauseDownloadImage(R.drawable.image_pause_download) .setImageDisplayer(transitionImageDisplayer) - .setShapeSizeByFixedSize(true); + .setShapeSize(ShapeSize.byViewFixedSize()); } }); @@ -89,7 +90,7 @@ protected DownloadOptions onCreateOptions(Context context) { .setPauseDownloadImage(R.drawable.image_pause_download) .setImageDisplayer(transitionImageDisplayer) .setImageShaper(new CircleImageShaper().setStroke(Color.WHITE, SketchUtils.dp2px(context, 1))) - .setShapeSizeByFixedSize(true); + .setShapeSize(ShapeSize.byViewFixedSize()); } }); @@ -101,7 +102,7 @@ protected DownloadOptions onCreateOptions(Context context) { .setImageProcessor(GaussianBlurImageProcessor.makeLayerColor(Color.parseColor("#66000000"))) .setCacheProcessedImageInDisk(true) .setBitmapConfig(Bitmap.Config.ARGB_8888) // 效果比较重要 - .setShapeSizeByFixedSize(true) + .setShapeSize(ShapeSize.byViewFixedSize()) .setMaxSize(context.getResources().getDisplayMetrics().widthPixels / 4, context.getResources().getDisplayMetrics().heightPixels / 4) .setImageDisplayer(new TransitionImageDisplayer(true)); @@ -117,7 +118,7 @@ protected DownloadOptions onCreateOptions(Context context) { .setPauseDownloadImage(R.drawable.image_pause_download) .setImageShaper(new RoundRectImageShaper(SketchUtils.dp2px(context, 6))) .setImageDisplayer(transitionImageDisplayer) - .setShapeSizeByFixedSize(true); + .setShapeSize(ShapeSize.byViewFixedSize()); } }); diff --git a/sketch/src/main/java/me/xiaopan/sketch/request/DisplayHelper.java b/sketch/src/main/java/me/xiaopan/sketch/request/DisplayHelper.java index f0e0d184a0..5519997fdf 100644 --- a/sketch/src/main/java/me/xiaopan/sketch/request/DisplayHelper.java +++ b/sketch/src/main/java/me/xiaopan/sketch/request/DisplayHelper.java @@ -389,12 +389,12 @@ public DisplayHelper shapeSize(int width, int height) { } /** - * 设置根据 ImageView 的 layout_width 和 layout_height 作为 shape size + * 设置图片尺寸,用于绘制时修改图片的尺寸 */ @NonNull @SuppressWarnings("unused") - public DisplayHelper shapeSizeByFixedSize() { - displayOptions.setShapeSizeByFixedSize(true); + public DisplayHelper shapeSize(int width, int height, ScaleType scaleType) { + displayOptions.setShapeSize(width, height, scaleType); return this; } @@ -537,15 +537,15 @@ protected void preProcess() { FixedSize fixedSize = viewInfo.getFixedSize(); - // 用 ImageVie 的固定宽高作为 shape size + // 用 ImageVie 的固定宽高作为 ShapeSize ShapeSize shapeSize = displayOptions.getShapeSize(); - if (shapeSize == null && displayOptions.isShapeSizeByFixedSize()) { + if (shapeSize != null && shapeSize instanceof ShapeSize.ByViewFixedSizeShapeSize) { if (fixedSize != null) { shapeSize = new ShapeSize(fixedSize.getWidth(), fixedSize.getHeight(), viewInfo.getScaleType()); displayOptions.setShapeSize(shapeSize); } else { throw new IllegalStateException("ImageView's width and height are not fixed," + - " can not be applied with the shapeSizeByFixedSize function"); + " can not be applied with the ShapeSize.byViewFixedSize() function"); } } @@ -560,7 +560,7 @@ protected void preProcess() { } - // 用 ImageVie 的固定宽高作为 resize + // 用 ImageVie 的固定宽高作为 Resize Resize resize = displayOptions.getResize(); if (resize != null && resize instanceof Resize.ByViewFixedSizeResize) { if (fixedSize != null) { diff --git a/sketch/src/main/java/me/xiaopan/sketch/request/DisplayOptions.java b/sketch/src/main/java/me/xiaopan/sketch/request/DisplayOptions.java index f56744ad89..fa2b044195 100644 --- a/sketch/src/main/java/me/xiaopan/sketch/request/DisplayOptions.java +++ b/sketch/src/main/java/me/xiaopan/sketch/request/DisplayOptions.java @@ -68,11 +68,6 @@ public class DisplayOptions extends LoadOptions { */ private ShapeSize shapeSize; - /** - * 使用 ImageView 的 layout_width 和 layout_height 作为 shape size - */ - private boolean shapeSizeByFixedSize; - public DisplayOptions() { reset(); } @@ -373,7 +368,6 @@ public ShapeSize getShapeSize() { @NonNull public DisplayOptions setShapeSize(@Nullable ShapeSize shapeSize) { this.shapeSize = shapeSize; - this.shapeSizeByFixedSize = false; return this; } @@ -390,21 +384,16 @@ public DisplayOptions setShapeSize(int width, int height) { } /** - * 没有设置shape size时使用fixed size作为shape size - */ - public boolean isShapeSizeByFixedSize() { - return shapeSizeByFixedSize; - } - - /** - * 设置没有设置shape size时使用fixed size作为shape size + * 设置绘制时图片应该显示的尺寸 * - * @param shapeSizeByFixedSize 没有设置shape size时使用fixed size作为shape size + * @param width 绘制时应该显示的宽 + * @param height 绘制时应该显示的高 + * @param scaleType 缩放类型 * @return DisplayOptions */ - public DisplayOptions setShapeSizeByFixedSize(boolean shapeSizeByFixedSize) { - this.shapeSizeByFixedSize = shapeSizeByFixedSize; - return this; + @NonNull + public DisplayOptions setShapeSize(int width, int height, @Nullable ImageView.ScaleType scaleType) { + return setShapeSize(new ShapeSize(width, height, scaleType)); } @Override @@ -417,7 +406,6 @@ public void reset() { pauseDownloadImage = null; imageShaper = null; shapeSize = null; - shapeSizeByFixedSize = false; } /** @@ -440,6 +428,5 @@ public void copy(@Nullable DisplayOptions options) { pauseDownloadImage = options.pauseDownloadImage; imageShaper = options.imageShaper; shapeSize = options.shapeSize; - shapeSizeByFixedSize = options.shapeSizeByFixedSize; } } diff --git a/sketch/src/main/java/me/xiaopan/sketch/request/Resize.java b/sketch/src/main/java/me/xiaopan/sketch/request/Resize.java index c23f8a9315..2344d4c475 100644 --- a/sketch/src/main/java/me/xiaopan/sketch/request/Resize.java +++ b/sketch/src/main/java/me/xiaopan/sketch/request/Resize.java @@ -22,9 +22,9 @@ import me.xiaopan.sketch.Identifier; /** - * 将图片加载到内存中之后根据resize进行修正 + * 将图片加载到内存中之后根据 {@link Resize} 进行修正 *
- * 修正的原则就是最终返回的图片的比例一定是跟resize一样的,但尺寸小于等于resize,如果需要必须同resize一致可以设置 {@link LoadOptions#forceUseResize} + * 修正的原则就是最终返回的图片的比例一定是跟 {@link Resize} 一样的,但尺寸小于等于 {@link Resize} ,如果需要必须同 {@link Resize} 一致可以设置 {@link LoadOptions#forceUseResize} */ public class Resize implements Identifier { @@ -63,11 +63,11 @@ public Resize(Resize sourceResize) { this.scaleType = sourceResize.scaleType; } - protected Resize() { + private Resize() { } /** - * 使用 ImageView 的固定尺寸作为 resize + * 使用 ImageView 的固定尺寸作为 {@link Resize} */ @SuppressWarnings("unused") public static Resize byViewFixedSize(Mode mode) { @@ -75,7 +75,7 @@ public static Resize byViewFixedSize(Mode mode) { } /** - * 使用 ImageView 的固定尺寸作为 resize + * 使用 ImageView 的固定尺寸作为 {@link Resize} */ @SuppressWarnings("unused") public static Resize byViewFixedSize() { @@ -125,18 +125,18 @@ public Mode getMode() { public enum Mode { /** - * 新图片的尺寸不会比 resize 大,但宽高比一定会一样 + * 新图片的尺寸不会比 {@link Resize} 大,但宽高比一定会一样 */ ASPECT_RATIO_SAME, /** - * 即使原图尺寸比 resize 小,也会得到一个跟 resize 尺寸一样的 bitmap + * 即使原图尺寸比 {@link Resize} 小,也会得到一个跟 {@link Resize} 尺寸一样的 bitmap */ EXACTLY_SAME, } /** - * 使用 ImageView 的固定尺寸作为 resize + * 使用 ImageView 的固定尺寸作为 {@link Resize} */ static class ByViewFixedSizeResize extends Resize { diff --git a/sketch/src/main/java/me/xiaopan/sketch/request/ShapeSize.java b/sketch/src/main/java/me/xiaopan/sketch/request/ShapeSize.java index ae8ef37cbb..4391ac887d 100644 --- a/sketch/src/main/java/me/xiaopan/sketch/request/ShapeSize.java +++ b/sketch/src/main/java/me/xiaopan/sketch/request/ShapeSize.java @@ -23,11 +23,11 @@ import me.xiaopan.sketch.drawable.SketchShapeBitmapDrawable; /** - * 用来搭配 {@link SketchShapeBitmapDrawable} 在绘制时修改图片的尺寸,用来替代大多数情况下对resize的依赖 + * 用来搭配 {@link SketchShapeBitmapDrawable} 在绘制时修改图片的尺寸,用来替代大多数情况下对 {@link Resize} 的依赖 *
- * 当多张图片的inSampleSize一样,那么读到内存里的bitmap尺寸就一样,但是因为resize不一样,导致会产生多个差别很小的bitmap,这样就降低了内存缓存利用率 + * 当多张图片的 inSampleSize 一样,那么读到内存里的 bitmap 尺寸就一样,但是因为 {@link Resize} 不一样,导致会产生多个差别很小的 bitmap,这样就降低了内存缓存利用率 *
- * 当使用shape size时,就可以使用同一个bitmap在绘制时显示出不同的尺寸,避免了产生多个差别很小的bitmap,提高了内存缓存利用率 + * 当使用 {@link ShapeSize} 时,就可以使用同一个 bitmap 在绘制时显示出不同的尺寸,避免了产生多个差别很小的 bitmap,提高了内存缓存利用率 */ public class ShapeSize implements Identifier { private int width; @@ -45,6 +45,17 @@ public ShapeSize(int width, int height, ImageView.ScaleType scaleType) { this.scaleType = scaleType; } + private ShapeSize() { + } + + /** + * 使用 ImageView 的固定尺寸作为 {@link ShapeSize} + */ + @SuppressWarnings("unused") + public static ShapeSize byViewFixedSize() { + return ByViewFixedSizeShapeSize.INSTANCE; + } + public int getWidth() { return width; } @@ -57,7 +68,7 @@ public ImageView.ScaleType getScaleType() { return scaleType; } - public void setScaleType(ImageView.ScaleType scaleType) { + void setScaleType(ImageView.ScaleType scaleType) { this.scaleType = scaleType; } @@ -81,4 +92,11 @@ public boolean equals(final Object obj) { public String getKey() { return String.format("ShapeSize(%dx%d)", width, height); } + + /** + * 使用 ImageView 的固定尺寸作为 {@link ShapeSize} + */ + static class ByViewFixedSizeShapeSize extends ShapeSize { + static final ByViewFixedSizeShapeSize INSTANCE = new ByViewFixedSizeShapeSize(); + } }