feat:add imagepath and imageRes for Image

This commit is contained in:
pengfei.zhou 2020-03-12 19:56:47 +08:00 committed by osborn
parent 7b371ca58b
commit a6df529f8f
9 changed files with 172 additions and 58 deletions

View File

@ -98,12 +98,12 @@ public class ImageNode extends ViewNode<ImageView> {
private Drawable getPlaceHolderDrawable() {
if (!TextUtils.isEmpty(placeHolderImage)) {
int resId = getDoricContext().getContext().getResources().getIdentifier(
int resId = getContext().getResources().getIdentifier(
placeHolderImage.toLowerCase(),
"drawable",
getDoricContext().getContext().getPackageName());
getContext().getPackageName());
if (resId > 0) {
return getDoricContext().getContext().getResources().getDrawable(resId);
return getContext().getResources().getDrawable(resId);
} else {
DoricLog.e("Cannot find PlaceHolder Drawable for " + placeHolderImage);
return new ColorDrawable(Color.GRAY);
@ -117,12 +117,12 @@ public class ImageNode extends ViewNode<ImageView> {
private Drawable getErrorDrawable() {
if (!TextUtils.isEmpty(errorImage)) {
int resId = getDoricContext().getContext().getResources().getIdentifier(
int resId = getContext().getResources().getIdentifier(
errorImage.toLowerCase(),
"drawable",
getDoricContext().getContext().getPackageName());
getContext().getPackageName());
if (resId > 0) {
return getDoricContext().getContext().getResources().getDrawable(resId);
return getContext().getResources().getDrawable(resId);
} else {
DoricLog.e("Cannot find Error Drawable for " + errorImage);
return new ColorDrawable(Color.GRAY);
@ -134,12 +134,9 @@ public class ImageNode extends ViewNode<ImageView> {
}
}
@Override
protected void blend(ImageView view, String name, JSValue prop) {
switch (name) {
case "imageUrl":
private void loadImageUrl(String url) {
RequestBuilder<Drawable> requestBuilder = Glide.with(getContext())
.load(prop.asString().value());
.load(url);
try {
if (isBlur) {
requestBuilder = requestBuilder
@ -182,7 +179,14 @@ public class ImageNode extends ViewNode<ImageView> {
return false;
}
})
.into(view);
.into(mView);
}
@Override
protected void blend(ImageView view, String name, JSValue prop) {
switch (name) {
case "imageUrl":
loadImageUrl(prop.asString().value());
break;
case "scaleType":
int scaleType = prop.asNumber().toInt();
@ -218,6 +222,30 @@ public class ImageNode extends ViewNode<ImageView> {
}
}
break;
case "imagePath":
String localName = prop.asString().value();
loadImageUrl("file:///android_asset/" + localName);
break;
case "imageRes":
int resId = getContext().getResources().getIdentifier(
prop.asString().value().toLowerCase(),
"drawable",
getDoricContext().getContext().getPackageName());
if (resId > 0) {
Drawable drawable = getContext().getResources().getDrawable(resId);
view.setImageResource(resId);
if (!TextUtils.isEmpty(loadCallbackId)) {
callJSResponse(loadCallbackId, new JSONBuilder()
.put("width", DoricUtils.px2dp(drawable.getIntrinsicWidth()))
.put("height", DoricUtils.px2dp(drawable.getIntrinsicHeight()))
.toJSONObject());
}
} else {
if (!TextUtils.isEmpty(loadCallbackId)) {
callJSResponse(loadCallbackId);
}
}
break;
default:
super.blend(view, name, prop);
break;

View File

@ -181,6 +181,33 @@ - (void)blendView:(UIImageView *)view forPropName:(NSString *)name propValue:(id
}
}
} else if ([@"imageRes" isEqualToString:name]) {
UIImage *image = [UIImage imageNamed:prop];
view.image = image;
if (self.loadCallbackId.length > 0) {
if (image) {
[self callJSResponse:self.loadCallbackId,
@{@"width": @(image.size.width), @"height": @(image.size.height)},
nil];
} else {
[self callJSResponse:self.loadCallbackId, nil];
}
}
} else if ([@"imagePath" isEqualToString:name]) {
NSString *path = [[NSBundle mainBundle] bundlePath];
NSString *fullPath = [path stringByAppendingPathComponent:prop];
UIImage *image = [UIImage imageWithContentsOfFile:fullPath];
view.image = image;
if (self.loadCallbackId.length > 0) {
if (image) {
[self callJSResponse:self.loadCallbackId,
@{@"width": @(image.size.width), @"height": @(image.size.height)},
nil];
} else {
[self callJSResponse:self.loadCallbackId, nil];
}
}
} else {
[super blendView:view forPropName:name propValue:prop];
}

View File

@ -1667,7 +1667,11 @@ var Image = /** @class */ (function (_super) {
__decorate$4([
Property,
__metadata$4("design:type", String)
], Image.prototype, "imageBase64", void 0);
], Image.prototype, "imagePath", void 0);
__decorate$4([
Property,
__metadata$4("design:type", String)
], Image.prototype, "imageRes", void 0);
__decorate$4([
Property,
__metadata$4("design:type", Number)

View File

@ -1233,7 +1233,11 @@ __decorate$4([
__decorate$4([
Property,
__metadata$4("design:type", String)
], Image.prototype, "imageBase64", void 0);
], Image.prototype, "imagePath", void 0);
__decorate$4([
Property,
__metadata$4("design:type", String)
], Image.prototype, "imageRes", void 0);
__decorate$4([
Property,
__metadata$4("design:type", Number)

View File

@ -2692,7 +2692,11 @@ __decorate$4([
__decorate$4([
Property,
__metadata$4("design:type", String)
], Image.prototype, "imageBase64", void 0);
], Image.prototype, "imagePath", void 0);
__decorate$4([
Property,
__metadata$4("design:type", String)
], Image.prototype, "imageRes", void 0);
__decorate$4([
Property,
__metadata$4("design:type", Number)

15
doric-js/index.d.ts vendored
View File

@ -483,6 +483,18 @@ declare module 'doric/lib/src/widget/image' {
}
export interface IImage extends IView {
imageUrl?: string;
/**
* Read image from local path
* For android,it based on assets dir.
* For iOS,it based on main bundle dir.
*/
imagePath?: string;
/**
* Read image from resource
* For android,it will try to read from drawable.
* For iOS,it will try to read from Image.Assets.
*/
imageRes?: string;
imageBase64?: string;
scaleType?: ScaleType;
isBlur?: boolean;
@ -497,7 +509,8 @@ declare module 'doric/lib/src/widget/image' {
}
export class Image extends View implements IImage {
imageUrl?: string;
imageBase64?: string;
imagePath?: string;
imageRes?: string;
scaleType?: ScaleType;
isBlur?: boolean;
/**

View File

@ -7,6 +7,18 @@ export declare enum ScaleType {
}
export interface IImage extends IView {
imageUrl?: string;
/**
* Read image from local path
* For android,it based on assets dir.
* For iOS,it based on main bundle dir.
*/
imagePath?: string;
/**
* Read image from resource
* For android,it will try to read from drawable.
* For iOS,it will try to read from Image.Assets.
*/
imageRes?: string;
imageBase64?: string;
scaleType?: ScaleType;
isBlur?: boolean;
@ -21,7 +33,8 @@ export interface IImage extends IView {
}
export declare class Image extends View implements IImage {
imageUrl?: string;
imageBase64?: string;
imagePath?: string;
imageRes?: string;
scaleType?: ScaleType;
isBlur?: boolean;
/**

View File

@ -40,7 +40,11 @@ __decorate([
__decorate([
Property,
__metadata("design:type", String)
], Image.prototype, "imageBase64", void 0);
], Image.prototype, "imagePath", void 0);
__decorate([
Property,
__metadata("design:type", String)
], Image.prototype, "imageRes", void 0);
__decorate([
Property,
__metadata("design:type", Number)

View File

@ -25,6 +25,20 @@ export enum ScaleType {
export interface IImage extends IView {
imageUrl?: string
/**
* Read image from local path
* For android,it based on assets dir.
* For iOS,it based on main bundle dir.
*/
imagePath?: string
/**
* Read image from resource
* For android,it will try to read from drawable.
* For iOS,it will try to read from Image.Assets.
*/
imageRes?: string
imageBase64?: string
scaleType?: ScaleType
isBlur?: boolean
@ -40,7 +54,10 @@ export class Image extends View implements IImage {
imageUrl?: string
@Property
imageBase64?: string
imagePath?: string
@Property
imageRes?: string
@Property
scaleType?: ScaleType