feat:scroller add scrollBy

This commit is contained in:
pengfei.zhou 2020-03-03 13:54:36 +08:00 committed by osborn
parent 6d7562877e
commit 0641f5e223
12 changed files with 73 additions and 8 deletions

View File

@ -136,4 +136,20 @@ public class ScrollerNode extends SuperNode<HVScrollView> implements IDoricScrol
DoricUtils.dp2px(offset.getProperty("y").asNumber().toFloat())); DoricUtils.dp2px(offset.getProperty("y").asNumber().toFloat()));
} }
} }
@DoricMethod
public void scrollBy(JSObject params) {
boolean animated = false;
if (params.getProperty("animated").isBoolean()) {
animated = params.getProperty("animated").asBoolean().value();
}
JSObject offset = params.getProperty("offset").asObject();
if (animated) {
this.mView.smoothScrollBy(DoricUtils.dp2px(offset.getProperty("x").asNumber().toFloat()),
DoricUtils.dp2px(offset.getProperty("y").asNumber().toFloat()));
} else {
this.mView.scrollBy(DoricUtils.dp2px(offset.getProperty("x").asNumber().toFloat()),
DoricUtils.dp2px(offset.getProperty("y").asNumber().toFloat()));
}
}
} }

View File

@ -1,4 +1,4 @@
import { Group, text, gravity, Color, LayoutSpec, vlayout, hlayout, layoutConfig, scroller, Text, ViewHolder, VMPanel, ViewModel, network, loge, HLayout, stack, image, Gravity, takeNonNull, Scroller } from "doric"; import { Group, text, gravity, Color, LayoutSpec, vlayout, hlayout, layoutConfig, scroller, Text, ViewHolder, VMPanel, ViewModel, network, loge, HLayout, stack, image, Gravity, takeNonNull, Scroller, Image } from "doric";
import { colors } from "./utils"; import { colors } from "./utils";
interface DoubanModel { interface DoubanModel {
@ -109,6 +109,9 @@ class MovieVH extends ViewHolder {
}), }),
vlayout( vlayout(
[ [
text({
text: "↑",
}),
this.movieTitle = text({ this.movieTitle = text({
textSize: 20, textSize: 20,
}), }),
@ -123,7 +126,7 @@ class MovieVH extends ViewHolder {
], ],
{ {
layoutConfig: layoutConfig().most(), layoutConfig: layoutConfig().most(),
space: 50, space: 0,
}).in(root) }).in(root)
} }
@ -140,17 +143,26 @@ class MovieVM extends ViewModel<MovieModel, MovieVH>{
if (state.doubanModel) { if (state.doubanModel) {
vh.title.text = state.doubanModel.title vh.title.text = state.doubanModel.title
vh.gallery.children.length = 0 vh.gallery.children.length = 0
const vm = this
state.doubanModel.subjects.slice(0, 5).forEach((e, idx) => { state.doubanModel.subjects.slice(0, 5).forEach((e, idx) => {
vh.gallery.addChild(stack( vh.gallery.addChild(stack(
[ [
image({ image({
layoutConfig: layoutConfig().just(), layoutConfig: layoutConfig().just(),
width: 270 / 2 * (idx == state.selectedIdx ? 1.2 : 1), width: 270 / 2,
height: 400 / 2 * (idx == state.selectedIdx ? 1.2 : 1), height: 400 / 2,
imageUrl: e.images.large, imageUrl: e.images.large,
onClick: () => { scaleX: 1,
this.updateState(state => state.selectedIdx = idx) scaleY: 1,
vh.scrolled.contentOffset = { x: idx * 200, y: 0 } onClick: function () {
vm.updateState(state => state.selectedIdx = idx)
const v = this as Image
v.getLocationOnScreen(context).then(ret => {
const centerX = ret.x + v.width / 2;
vh.scrolled.scrollBy(context, { x: centerX - Environment.screenWidth / 2, y: 0 })
v.scaleX = 1.2
v.scaleY = 1.2
})
}, },
}) })
], ],

View File

@ -144,4 +144,14 @@ - (void)scrollTo:(NSDictionary *)params {
CGPoint offset = CGPointMake([offsetDic[@"x"] floatValue], [offsetDic[@"y"] floatValue]); CGPoint offset = CGPointMake([offsetDic[@"x"] floatValue], [offsetDic[@"y"] floatValue]);
[self.view setContentOffset:offset animated:animated]; [self.view setContentOffset:offset animated:animated];
} }
- (void)scrollBy:(NSDictionary *)params {
BOOL animated = [params[@"animated"] boolValue];
NSDictionary *offsetDic = params[@"offset"];
CGPoint offset = CGPointMake([offsetDic[@"x"] floatValue], [offsetDic[@"y"] floatValue]);
[self.view setContentOffset:CGPointMake(
MIN(self.view.contentSize.width - self.view.width, MAX(0, offset.x + self.view.contentOffset.x)),
MIN(self.view.contentSize.height - self.view.height, MAX(0, offset.y + self.view.contentOffset.y)))
animated:animated];
}
@end @end

View File

@ -2016,6 +2016,9 @@ var Scroller = /** @class */ (function (_super) {
Scroller.prototype.scrollTo = function (context, offset, animated) { Scroller.prototype.scrollTo = function (context, offset, animated) {
return this.nativeChannel(context, "scrollTo")({ offset: offset, animated: animated }); return this.nativeChannel(context, "scrollTo")({ offset: offset, animated: animated });
}; };
Scroller.prototype.scrollBy = function (context, offset, animated) {
return this.nativeChannel(context, "scrollBy")({ offset: offset, animated: animated });
};
__decorate$7([ __decorate$7([
Property, Property,
__metadata$7("design:type", Object) __metadata$7("design:type", Object)

View File

@ -1496,6 +1496,9 @@ class Scroller extends Superview {
scrollTo(context, offset, animated) { scrollTo(context, offset, animated) {
return this.nativeChannel(context, "scrollTo")({ offset, animated }); return this.nativeChannel(context, "scrollTo")({ offset, animated });
} }
scrollBy(context, offset, animated) {
return this.nativeChannel(context, "scrollBy")({ offset, animated });
}
} }
__decorate$7([ __decorate$7([
Property, Property,

View File

@ -2955,6 +2955,9 @@ class Scroller extends Superview {
scrollTo(context, offset, animated) { scrollTo(context, offset, animated) {
return this.nativeChannel(context, "scrollTo")({ offset, animated }); return this.nativeChannel(context, "scrollTo")({ offset, animated });
} }
scrollBy(context, offset, animated) {
return this.nativeChannel(context, "scrollBy")({ offset, animated });
}
} }
__decorate$7([ __decorate$7([
Property, Property,

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

@ -591,6 +591,10 @@ declare module 'doric/lib/src/widget/scroller' {
x: number; x: number;
y: number; y: number;
}, animated?: boolean): Promise<any>; }, animated?: boolean): Promise<any>;
scrollBy(context: BridgeContext, offset: {
x: number;
y: number;
}, animated?: boolean): Promise<any>;
} }
} }

View File

@ -20,4 +20,8 @@ export declare class Scroller extends Superview implements IScroller {
x: number; x: number;
y: number; y: number;
}, animated?: boolean): Promise<any>; }, animated?: boolean): Promise<any>;
scrollBy(context: BridgeContext, offset: {
x: number;
y: number;
}, animated?: boolean): Promise<any>;
} }

View File

@ -46,6 +46,9 @@ export class Scroller extends Superview {
scrollTo(context, offset, animated) { scrollTo(context, offset, animated) {
return this.nativeChannel(context, "scrollTo")({ offset, animated }); return this.nativeChannel(context, "scrollTo")({ offset, animated });
} }
scrollBy(context, offset, animated) {
return this.nativeChannel(context, "scrollBy")({ offset, animated });
}
} }
__decorate([ __decorate([
Property, Property,

View File

@ -52,4 +52,8 @@ export class Scroller extends Superview implements IScroller {
scrollTo(context: BridgeContext, offset: { x: number, y: number }, animated?: boolean) { scrollTo(context: BridgeContext, offset: { x: number, y: number }, animated?: boolean) {
return this.nativeChannel(context, "scrollTo")({ offset, animated }) return this.nativeChannel(context, "scrollTo")({ offset, animated })
} }
scrollBy(context: BridgeContext, offset: { x: number, y: number }, animated?: boolean) {
return this.nativeChannel(context, "scrollBy")({ offset, animated })
}
} }

View File

@ -3013,6 +3013,9 @@ class Scroller extends Superview {
scrollTo(context, offset, animated) { scrollTo(context, offset, animated) {
return this.nativeChannel(context, "scrollTo")({ offset, animated }); return this.nativeChannel(context, "scrollTo")({ offset, animated });
} }
scrollBy(context, offset, animated) {
return this.nativeChannel(context, "scrollBy")({ offset, animated });
}
} }
__decorate$7([ __decorate$7([
Property, Property,

File diff suppressed because one or more lines are too long