diff --git a/doric-android/doric/src/main/java/pub/doric/shader/ImageNode.java b/doric-android/doric/src/main/java/pub/doric/shader/ImageNode.java index 11d70d4b..cccd57e6 100644 --- a/doric-android/doric/src/main/java/pub/doric/shader/ImageNode.java +++ b/doric-android/doric/src/main/java/pub/doric/shader/ImageNode.java @@ -98,12 +98,12 @@ public class ImageNode extends ViewNode { 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 { 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,55 +134,59 @@ public class ImageNode extends ViewNode { } } + private void loadImageUrl(String url) { + RequestBuilder requestBuilder = Glide.with(getContext()) + .load(url); + try { + if (isBlur) { + requestBuilder = requestBuilder + .apply(RequestOptions + .bitmapTransform(new BlurTransformation(25, 3))); + } + Drawable placeHolderDrawable = getPlaceHolderDrawable(); + + if (placeHolderDrawable != null) { + requestBuilder = requestBuilder.apply(RequestOptions.placeholderOf(placeHolderDrawable)); + } + + Drawable errorDrawable = getErrorDrawable(); + if (errorDrawable != null) { + requestBuilder = requestBuilder.apply(RequestOptions.errorOf(errorDrawable)); + } + } catch (Throwable e) { + e.printStackTrace(); + DoricLog.e("ImageNode blend error, please check the glide version"); + } + + requestBuilder + .listener(new RequestListener() { + @Override + public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { + if (!TextUtils.isEmpty(loadCallbackId)) { + callJSResponse(loadCallbackId); + } + return false; + } + + @Override + public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { + if (!TextUtils.isEmpty(loadCallbackId)) { + callJSResponse(loadCallbackId, new JSONBuilder() + .put("width", DoricUtils.px2dp(resource.getIntrinsicWidth())) + .put("height", DoricUtils.px2dp(resource.getIntrinsicHeight())) + .toJSONObject()); + } + return false; + } + }) + .into(mView); + } + @Override protected void blend(ImageView view, String name, JSValue prop) { switch (name) { case "imageUrl": - RequestBuilder requestBuilder = Glide.with(getContext()) - .load(prop.asString().value()); - try { - if (isBlur) { - requestBuilder = requestBuilder - .apply(RequestOptions - .bitmapTransform(new BlurTransformation(25, 3))); - } - Drawable placeHolderDrawable = getPlaceHolderDrawable(); - - if (placeHolderDrawable != null) { - requestBuilder = requestBuilder.apply(RequestOptions.placeholderOf(placeHolderDrawable)); - } - - Drawable errorDrawable = getErrorDrawable(); - if (errorDrawable != null) { - requestBuilder = requestBuilder.apply(RequestOptions.errorOf(errorDrawable)); - } - } catch (Throwable e) { - e.printStackTrace(); - DoricLog.e("ImageNode blend error, please check the glide version"); - } - - requestBuilder - .listener(new RequestListener() { - @Override - public boolean onLoadFailed(@Nullable GlideException e, Object model, Target target, boolean isFirstResource) { - if (!TextUtils.isEmpty(loadCallbackId)) { - callJSResponse(loadCallbackId); - } - return false; - } - - @Override - public boolean onResourceReady(Drawable resource, Object model, Target target, DataSource dataSource, boolean isFirstResource) { - if (!TextUtils.isEmpty(loadCallbackId)) { - callJSResponse(loadCallbackId, new JSONBuilder() - .put("width", DoricUtils.px2dp(resource.getIntrinsicWidth())) - .put("height", DoricUtils.px2dp(resource.getIntrinsicHeight())) - .toJSONObject()); - } - return false; - } - }) - .into(view); + loadImageUrl(prop.asString().value()); break; case "scaleType": int scaleType = prop.asNumber().toInt(); @@ -218,6 +222,30 @@ public class ImageNode extends ViewNode { } } 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; diff --git a/doric-iOS/Pod/Classes/Shader/DoricImageNode.m b/doric-iOS/Pod/Classes/Shader/DoricImageNode.m index c738269c..13dfcc83 100644 --- a/doric-iOS/Pod/Classes/Shader/DoricImageNode.m +++ b/doric-iOS/Pod/Classes/Shader/DoricImageNode.m @@ -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]; } diff --git a/doric-js/bundle/doric-lib.es5.js b/doric-js/bundle/doric-lib.es5.js index d8e07115..e7c967d5 100644 --- a/doric-js/bundle/doric-lib.es5.js +++ b/doric-js/bundle/doric-lib.es5.js @@ -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) diff --git a/doric-js/bundle/doric-lib.js b/doric-js/bundle/doric-lib.js index e2e8a90e..f996f51c 100644 --- a/doric-js/bundle/doric-lib.js +++ b/doric-js/bundle/doric-lib.js @@ -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) diff --git a/doric-js/bundle/doric-vm.js b/doric-js/bundle/doric-vm.js index 018e0af4..a4437293 100644 --- a/doric-js/bundle/doric-vm.js +++ b/doric-js/bundle/doric-vm.js @@ -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) diff --git a/doric-js/index.d.ts b/doric-js/index.d.ts index 67c092a3..820e5dc8 100644 --- a/doric-js/index.d.ts +++ b/doric-js/index.d.ts @@ -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; /** diff --git a/doric-js/lib/src/widget/image.d.ts b/doric-js/lib/src/widget/image.d.ts index 154326aa..397d72ad 100644 --- a/doric-js/lib/src/widget/image.d.ts +++ b/doric-js/lib/src/widget/image.d.ts @@ -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; /** diff --git a/doric-js/lib/src/widget/image.js b/doric-js/lib/src/widget/image.js index 18d84095..f2b6cd02 100644 --- a/doric-js/lib/src/widget/image.js +++ b/doric-js/lib/src/widget/image.js @@ -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) diff --git a/doric-js/src/widget/image.ts b/doric-js/src/widget/image.ts index 426c2c2c..64dcabf3 100644 --- a/doric-js/src/widget/image.ts +++ b/doric-js/src/widget/image.ts @@ -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