Skip to content

Commit

Permalink
🔨 Removed resizeByFixedSize attr
Browse files Browse the repository at this point in the history
  • Loading branch information
Flyge committed Sep 3, 2017
1 parent 3740d17 commit 6db5422
Show file tree
Hide file tree
Showing 8 changed files with 141 additions and 77 deletions.
3 changes: 2 additions & 1 deletion docs/logs/log_2.5.0_temp.md
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ bugs:
* :fire: 移除 ErrorCause.NOT_FOUND_DATA_SOURCE_BY_UNKNOWN_URI
* :fire: 移除 ErrorCause.SOURCE_BITMAP_RECYCLED
* :fire: 移除 DownloadListener、LoadListener、DisplayListener 的 onStarted() 方法
* :fire: 移除 resizeByFixedSize 属性,Resize.byViewFixedSize() 代替,详情参考 [resize]

重构:
* :hammer: file:// 格式的 uri 已产生的磁盘缓存将全部作废,因为其磁盘缓存 key 去掉了 file://
Expand Down Expand Up @@ -63,5 +64,5 @@ wiki待办:


[了解 Sketch 日志]: ../wiki/log.md

[resize]: ../wiki/resize.md

6 changes: 1 addition & 5 deletions docs/wiki/options_config.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,6 @@ Sketch共有DisplayOptions `extends` LoadOptions `extends` DownloadOptions三种
|loadingImage|-|-|null|
|errorImage|-|-|null|
|pauseDownloadImage|-|-|null|
|resizeByFixedSize|-|-|false|
|imageShaper|-|-|null|
|shapeSize|-|-|null|
|shapeSizeByFixedSize|-|-|false|
Expand Down Expand Up @@ -96,9 +95,6 @@ displayOptions.setPauseDownloadImage(R.drawable.image_load_pause_download);
// 使用过度效果来显示图片。如果你使用了TransitionImageDisplayer并且SketchImageView的layout_width和layout_height是固定的并且ScaleType是CENTER_CROP的话,就会自动使用FixedSizeBitmapDrawable的FixedSize功能,让占位图和实际图片的比例保持一致,这样可以保证最终显示不变形
displayOptions.setImageDisplayer(new TransitionImageDisplayer());

// 使用ImageView的layout_width和layout_height作为resize,优先级较高
displayOptions.setResizeByFixedSize(true);

// 以圆角矩形的形状绘制图片,包括loadingImage、errorImage、pauseDownloadImage以及要加载的图片
displayOptions.setImageShaper(new ReoundRectImageShaper(20)));

Expand All @@ -109,7 +105,7 @@ displayOptions.setShapeSize(500, 500);
// displayOptions.setShapeSizeByFixedSize(true);
```

Options支持的属性Helper中都有对应的方法,只是方法名不一样(没有set)
Options 支持的属性 Helper 中都有对应的方法,只是方法名不一样(没有set)

#### 使用Options:
Sketch.display()、Sketch.load()、Sketch.download()都会返回其专属的Helper,Helper中也都会有专门的方法配置这些属性,例如:
Expand Down
64 changes: 51 additions & 13 deletions docs/wiki/resize.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,60 @@
resize用来修剪图片以及调整宽高比例,使用maxSize可以加载合适尺寸的图片到内存中,那么有的时候我们可能还需要固定尺寸的图片或固定宽高比例的图片,resize就是 用来解决这个问题的。
### Resize 用来干嘛?

规则如下:
>* 如果原图的尺寸大于resize则按resize裁剪,如果小于resize则会按照resize的比例修剪原图,让原图的宽高比同resize一样。
>* 如果forceUseResize为true,则即使原图尺寸小于resize,则也会按照resize的尺寸创建一张新的图片。
Resize 用来调整图片的尺寸和宽高比例

有的时候我们需要固定尺寸或固定宽高比的图片,例如将图片用作页面头部的背景,设计图上有标好的尺寸,但是图片的尺寸我们不能控制,这时候就可以用 Resize 用来解决问题

### 使用

假如设计图上标明的图片尺寸是 720x385,那么我们如实配置即可

```java
DisplayOptions options = ...;
options.setResize(720, 385);
```

注意,Resize 有两种模式:
* ASPECT_RATIO_SAME: 新图片的尺寸不会比 resize 大,但宽高比一定会一样
* EXACTLY_SAME: 即使原图尺寸比 resize 小,也会得到一个跟 resize 尺寸一样的 bitmap

Resize 默认采用 ASPECT_RATIO_SAME 模式,这样的好处是会比较节省内存,因此通过上面的配置你会得到一张宽高比一定是 720/385 的图片,但尺寸可能会比 720x385 小的图片

如果你必须要求返回图片的尺寸跟 Resize 一模一样,那么你可以使用 EXACTLY_SAME 模式

```java
DisplayOptions options = ...;
options.setResize(new Resize(720, 385, Resize.EXACTLY_SAME));
```

### 调整尺寸时的裁剪规则

当 Resize 的尺寸和原图片的尺寸不一致时就会对原图片进行裁剪,具体的裁剪规则是根据 Resize 的 scaleType 属性决定的。

默认从 ImageView 获取,你也可以强制指定,如下:

```java
DisplayOptions options = ...;
options.setResize(new Resize(720, 385, ScaleType.CENTER_CROP));
```

### 自动使用 ImageView 的固定尺寸作为 Resize

当 ImageView 已经设置了固定尺寸的话,我们就可以不必再写一遍 resize 的尺寸,而是自动使用 ImageView 的尺寸,如下:

#### 使用
```java
DisplayOptions options = ...;
options.setResize(300, 300);
options.seForceUseResize(true);
options.setResize(Resize.byViewFixedSize());
```

Resize.byViewFixedSize() 方法也可以设置 Resize.Mode,如下:

```java
Sketch.with(context).load(R.drawable.ic_launcher, new LoadListener(){
...
})
.resize(300, 300)
.commit();
DisplayOptions options = ...;
options.setResize(Resize.byViewFixedSize(Resize.EXACTLY_SAME));
```

使用DisplayOptions的时候还可以使用resizeByFixedSize(true)方法自动使用SketchImageView的layout_width和layout_height作为resize
但是当你使用了此功能而 ImageView 却没有设置固定尺寸的话就会抛出异常,如下:

```java
IllegalStateException: ImageView's width and height are not fixed, can not be applied with the Resize.byViewFixedSize() function
```
2 changes: 1 addition & 1 deletion docs/wiki/thumbnail_mode.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ LayoutParams params = sketchImageView.getLayoutParams();

if (params.width != 0 && params.height != 0) {
// 用params.width和params.height做为resize
options.setResizeByFixedSize();
options.setResize(Resize.byViewFixedSize());

// Sketch会默认取params.width和params.height做为maxSize,因此不用设置
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import me.xiaopan.sketch.drawable.SketchShapeBitmapDrawable;
import me.xiaopan.sketch.request.DisplayOptions;
import me.xiaopan.sketch.request.RedisplayListener;
import me.xiaopan.sketch.request.Resize;
import me.xiaopan.sketch.uri.UriModel;
import me.xiaopan.sketch.util.SketchUtils;
import me.xiaopan.sketchsample.ImageOptions;
Expand Down Expand Up @@ -163,16 +164,20 @@ public void onPreCommit(String cacheUri, DisplayOptions cacheOptions) {
if (page == Page.PHOTO_LIST) {
final boolean thumbnailMode = AppConfig.getBoolean(getContext(), event.key);
getOptions().setThumbnailMode(thumbnailMode);
if (getOptions().getResize() == null) {
getOptions().setResizeByFixedSize(thumbnailMode);
if (thumbnailMode) {
getOptions().setResize(Resize.byViewFixedSize());
} else {
getOptions().setResize(null);
}

redisplay(new RedisplayListener() {
@Override
public void onPreCommit(String cacheUri, DisplayOptions cacheOptions) {
cacheOptions.setThumbnailMode(thumbnailMode);
if (cacheOptions.getResize() == null) {
cacheOptions.setResizeByFixedSize(thumbnailMode);
if (thumbnailMode) {
cacheOptions.setResize(Resize.byViewFixedSize());
} else {
cacheOptions.setResize(null);
}
}
});
Expand Down
14 changes: 2 additions & 12 deletions sketch/src/main/java/me/xiaopan/sketch/request/DisplayHelper.java
Original file line number Diff line number Diff line change
Expand Up @@ -200,16 +200,6 @@ public DisplayHelper resize(int width, int height, @NonNull ScaleType scaleType)
return this;
}

/**
* 使用 ImageView 的 layout_width 和 layout_height 作为 resize
*/
@NonNull
@SuppressWarnings("unused")
public DisplayHelper resizeByFixedSize() {
displayOptions.setResizeByFixedSize(true);
return this;
}

/**
* 强制使经过 resize 处理后的图片同 resize 的尺寸一致
*/
Expand Down Expand Up @@ -572,13 +562,13 @@ protected void preProcess() {

// 用 ImageVie 的固定宽高作为 resize
Resize resize = displayOptions.getResize();
if (resize == null && displayOptions.isResizeByFixedSize()) {
if (resize != null && resize instanceof Resize.ByViewFixedSizeResize) {
if (fixedSize != null) {
resize = new Resize(fixedSize.getWidth(), fixedSize.getHeight(), viewInfo.getScaleType());
displayOptions.setResize(resize);
} else {
throw new IllegalStateException("ImageView's width and height are not fixed," +
" can not be applied with the resizeByFixedSize function");
" can not be applied with the Resize.byViewFixedSize() function");
}
}

Expand Down
29 changes: 0 additions & 29 deletions sketch/src/main/java/me/xiaopan/sketch/request/DisplayOptions.java
Original file line number Diff line number Diff line change
Expand Up @@ -58,11 +58,6 @@ public class DisplayOptions extends LoadOptions {
*/
private StateImage pauseDownloadImage;

/**
* 使用 ImageView 的 layout_width 和 layout_height 作为 resize
*/
private boolean resizeByFixedSize;

/**
* 绘制时修改图片的形状
*/
Expand Down Expand Up @@ -337,28 +332,6 @@ public DisplayOptions setPauseDownloadImage(@Nullable StateImage pauseDownloadIm
return this;
}

/**
* 没有设置resize时使用fixed size作为resize
*
* @see FixedSize
*/
public boolean isResizeByFixedSize() {
return resizeByFixedSize;
}

/**
* 设置没有设置resize时使用fixed size作为resize
*
* @param isResizeByFixedSize 没有设置resize时,使用fixed size作为resize
* @return DisplayOptions
* @see FixedSize
*/
@NonNull
public DisplayOptions setResizeByFixedSize(boolean isResizeByFixedSize) {
this.resizeByFixedSize = isResizeByFixedSize;
return this;
}

/**
* 获取绘制时图片形状修改器
*
Expand Down Expand Up @@ -439,7 +412,6 @@ public void reset() {
super.reset();
cacheInMemoryDisabled = false;
imageDisplayer = null;
resizeByFixedSize = false;
loadingImage = null;
errorImage = null;
pauseDownloadImage = null;
Expand All @@ -463,7 +435,6 @@ public void copy(@Nullable DisplayOptions options) {

cacheInMemoryDisabled = options.cacheInMemoryDisabled;
imageDisplayer = options.imageDisplayer;
resizeByFixedSize = options.resizeByFixedSize;
loadingImage = options.loadingImage;
errorImage = options.errorImage;
pauseDownloadImage = options.pauseDownloadImage;
Expand Down
87 changes: 75 additions & 12 deletions sketch/src/main/java/me/xiaopan/sketch/request/Resize.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,35 +27,66 @@
* 修正的原则就是最终返回的图片的比例一定是跟resize一样的,但尺寸小于等于resize,如果需要必须同resize一致可以设置 {@link LoadOptions#forceUseResize}
*/
public class Resize implements Identifier {
private int width;
private int height;

/**
* 裁剪图片时scaleType将决定如何裁剪,原理同ImageView的scaleType相同
*/
protected int width;
protected int height;
protected Mode mode = Mode.ASPECT_RATIO_SAME;
private ImageView.ScaleType scaleType;

public Resize(int width, int height, ImageView.ScaleType scaleType, Mode mode) {
this.width = width;
this.height = height;
this.scaleType = scaleType;
this.mode = mode;
}

public Resize(int width, int height, ImageView.ScaleType scaleType) {
this.width = width;
this.height = height;
this.scaleType = scaleType;
}

public Resize(int width, int height, Mode mode) {
this.width = width;
this.height = height;
this.mode = mode;
}

public Resize(int width, int height) {
this.width = width;
this.height = height;
}

public Resize(Resize sourceResize) {
this.width = sourceResize.width;
this.height = sourceResize.height;
this.scaleType = sourceResize.scaleType;
}

public Resize(int width, int height) {
this.width = width;
this.height = height;
protected Resize() {
}

public Resize(int width, int height, ImageView.ScaleType scaleType) {
this(width, height);
this.scaleType = scaleType;
/**
* 使用 ImageView 的固定尺寸作为 resize
*/
@SuppressWarnings("unused")
public static Resize byViewFixedSize(Mode mode) {
return new ByViewFixedSizeResize(mode);
}

/**
* 使用 ImageView 的固定尺寸作为 resize
*/
@SuppressWarnings("unused")
public static Resize byViewFixedSize() {
return new ByViewFixedSizeResize();
}

public ImageView.ScaleType getScaleType() {
return scaleType;
}

public void setScaleType(ImageView.ScaleType scaleType) {
void setScaleType(ImageView.ScaleType scaleType) {
this.scaleType = scaleType;
}

Expand Down Expand Up @@ -87,4 +118,36 @@ public boolean equals(final Object obj) {
public String getKey() {
return String.format("Resize(%dx%d-%s)", width, height, scaleType != null ? scaleType.name() : "null");
}

public Mode getMode() {
return mode;
}

public enum Mode {
/**
* 新图片的尺寸不会比 resize 大,但宽高比一定会一样
*/
ASPECT_RATIO_SAME,

/**
* 即使原图尺寸比 resize 小,也会得到一个跟 resize 尺寸一样的 bitmap
*/
EXACTLY_SAME,
}

/**
* 使用 ImageView 的固定尺寸作为 resize
*/
static class ByViewFixedSizeResize extends Resize {

ByViewFixedSizeResize(@NonNull Mode mode) {
//noinspection ConstantConditions
if (mode != null) {
this.mode = mode;
}
}

ByViewFixedSizeResize() {
}
}
}

0 comments on commit 6db5422

Please sign in to comment.