feat:complete defination of LayoutConfig
This commit is contained in:
parent
eeed67b57a
commit
f78f3ed7d8
@ -26,7 +26,7 @@ android {
|
|||||||
afterEvaluate {
|
afterEvaluate {
|
||||||
buildJSBundle.exec()
|
buildJSBundle.exec()
|
||||||
buildDemo.exec()
|
buildDemo.exec()
|
||||||
buildDebugger.exec()
|
//buildDebugger.exec()
|
||||||
}
|
}
|
||||||
|
|
||||||
task buildJSBundle(type: Exec) {
|
task buildJSBundle(type: Exec) {
|
||||||
|
@ -67,8 +67,8 @@ public class DoricJSEngine implements Handler.Callback, DoricTimerExtension.Time
|
|||||||
|
|
||||||
|
|
||||||
private void initJSExecutor() {
|
private void initJSExecutor() {
|
||||||
// mDoricJSE = new DoricNativeJSExecutor();
|
mDoricJSE = new DoricNativeJSExecutor();
|
||||||
mDoricJSE = new DoricRemoteJSExecutor();
|
// mDoricJSE = new DoricRemoteJSExecutor();
|
||||||
mDoricJSE.injectGlobalJSFunction(DoricConstant.INJECT_LOG, new JavaFunction() {
|
mDoricJSE.injectGlobalJSFunction(DoricConstant.INJECT_LOG, new JavaFunction() {
|
||||||
@Override
|
@Override
|
||||||
public JavaValue exec(JSDecoder[] args) {
|
public JavaValue exec(JSDecoder[] args) {
|
||||||
|
@ -116,12 +116,42 @@ public abstract class GroupNode<F extends ViewGroup> extends ViewNode<F> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
|
protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
|
||||||
return new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
return new ViewGroup.LayoutParams(0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void blendChild(ViewNode viewNode, JSObject jsObject) {
|
protected void blendChild(ViewNode viewNode, JSObject jsObject) {
|
||||||
|
|
||||||
|
|
||||||
JSValue jsValue = jsObject.getProperty("margin");
|
JSValue jsValue = jsObject.getProperty("margin");
|
||||||
|
JSValue widthSpec = jsObject.getProperty("widthSpec");
|
||||||
|
JSValue heightSpec = jsObject.getProperty("widthSpec");
|
||||||
|
|
||||||
ViewGroup.LayoutParams layoutParams = viewNode.getLayoutParams();
|
ViewGroup.LayoutParams layoutParams = viewNode.getLayoutParams();
|
||||||
|
if (widthSpec.isNumber()) {
|
||||||
|
switch (widthSpec.asNumber().toInt()) {
|
||||||
|
case 1:
|
||||||
|
layoutParams.width = ViewGroup.LayoutParams.WRAP_CONTENT;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
layoutParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (heightSpec.isNumber()) {
|
||||||
|
switch (heightSpec.asNumber().toInt()) {
|
||||||
|
case 1:
|
||||||
|
layoutParams.height = ViewGroup.LayoutParams.WRAP_CONTENT;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
layoutParams.height = ViewGroup.LayoutParams.MATCH_PARENT;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (jsValue.isObject() && layoutParams instanceof ViewGroup.MarginLayoutParams) {
|
if (jsValue.isObject() && layoutParams instanceof ViewGroup.MarginLayoutParams) {
|
||||||
JSValue topVal = jsValue.asObject().getProperty("top");
|
JSValue topVal = jsValue.asObject().getProperty("top");
|
||||||
if (topVal.isNumber()) {
|
if (topVal.isNumber()) {
|
||||||
|
@ -50,7 +50,7 @@ public class LinearNode extends GroupNode<LinearLayout> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
|
protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
|
||||||
return new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
return new LinearLayout.LayoutParams(0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -62,6 +62,6 @@ public class StackNode extends GroupNode<FrameLayout> {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
|
protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
|
||||||
return new FrameLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
return new FrameLayout.LayoutParams(0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -86,16 +86,12 @@ public abstract class ViewNode<T extends View> extends DoricContextHolder {
|
|||||||
protected void blend(T view, ViewGroup.LayoutParams layoutParams, String name, JSValue prop) {
|
protected void blend(T view, ViewGroup.LayoutParams layoutParams, String name, JSValue prop) {
|
||||||
switch (name) {
|
switch (name) {
|
||||||
case "width":
|
case "width":
|
||||||
if (prop.asNumber().toInt() < 0) {
|
if (layoutParams.width >= 0) {
|
||||||
layoutParams.width = prop.asNumber().toInt();
|
|
||||||
} else {
|
|
||||||
layoutParams.width = DoricUtils.dp2px(prop.asNumber().toFloat());
|
layoutParams.width = DoricUtils.dp2px(prop.asNumber().toFloat());
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case "height":
|
case "height":
|
||||||
if (prop.asNumber().toInt() < 0) {
|
if (layoutParams.height >= 0) {
|
||||||
layoutParams.height = prop.asNumber().toInt();
|
|
||||||
} else {
|
|
||||||
layoutParams.height = DoricUtils.dp2px(prop.asNumber().toFloat());
|
layoutParams.height = DoricUtils.dp2px(prop.asNumber().toFloat());
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { Image, ViewHolder, VMPanel, ViewModel, Gravity, NativeCall, Text, Color, VLayout, log, logw, loge, Group, } from "doric"
|
import { Image, ViewHolder, VMPanel, ViewModel, Gravity, NativeCall, Text, Color, VLayout, log, logw, loge, Group, LayoutSpec, } from "doric"
|
||||||
|
|
||||||
|
|
||||||
interface CountModel {
|
interface CountModel {
|
||||||
@ -57,6 +57,10 @@ class CounterView extends ViewHolder {
|
|||||||
// iv.width = iv.height = 100
|
// iv.width = iv.height = 100
|
||||||
iv.imageUrl = "https://misc.aotu.io/ONE-SUNDAY/SteamEngine.png"
|
iv.imageUrl = "https://misc.aotu.io/ONE-SUNDAY/SteamEngine.png"
|
||||||
//iv.bgColor = Color.parse('#00ff00')
|
//iv.bgColor = Color.parse('#00ff00')
|
||||||
|
iv.layoutConfig = {
|
||||||
|
widthSpec: LayoutSpec.WRAP_CONTENT,
|
||||||
|
heightSpec: LayoutSpec.WRAP_CONTENT,
|
||||||
|
}
|
||||||
root.addChild(iv)
|
root.addChild(iv)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import { loge, log, ViewHolder, Stack, ViewModel, Gravity, Text, Color, HLayout, VLayout, Group, VMPanel } from "doric";
|
import { loge, log, ViewHolder, Stack, ViewModel, Gravity, Text, Color, HLayout, VLayout, Group, VMPanel, LayoutSpec } from "doric";
|
||||||
|
|
||||||
type SnakeNode = {
|
type SnakeNode = {
|
||||||
x: number
|
x: number
|
||||||
@ -154,10 +154,14 @@ class SnakeView extends ViewHolder {
|
|||||||
margin: {
|
margin: {
|
||||||
top: 20
|
top: 20
|
||||||
},
|
},
|
||||||
|
widthSpec: LayoutSpec.WRAP_CONTENT,
|
||||||
|
heightSpec: LayoutSpec.WRAP_CONTENT,
|
||||||
}
|
}
|
||||||
vlayout.space = 20
|
vlayout.space = 20
|
||||||
vlayout.layoutConfig = {
|
vlayout.layoutConfig = {
|
||||||
alignment: new Gravity().centerX().top()
|
alignment: new Gravity().centerX().top(),
|
||||||
|
widthSpec: LayoutSpec.WRAP_CONTENT,
|
||||||
|
heightSpec: LayoutSpec.WRAP_CONTENT,
|
||||||
}
|
}
|
||||||
this.panel.bgColor = Color.parse('#00ff00')
|
this.panel.bgColor = Color.parse('#00ff00')
|
||||||
vlayout.addChild(title)
|
vlayout.addChild(title)
|
||||||
@ -165,11 +169,20 @@ class SnakeView extends ViewHolder {
|
|||||||
root.addChild(vlayout)
|
root.addChild(vlayout)
|
||||||
|
|
||||||
const hlayout = new HLayout
|
const hlayout = new HLayout
|
||||||
this.start.text = "Start"
|
hlayout.layoutConfig = {
|
||||||
this.start.textSize = 30
|
widthSpec: LayoutSpec.WRAP_CONTENT,
|
||||||
this.start.textColor = Color.parse("#ffffff")
|
heightSpec: LayoutSpec.WRAP_CONTENT,
|
||||||
|
}
|
||||||
hlayout.addChild(this.start)
|
hlayout.addChild(this.start.also(
|
||||||
|
it => {
|
||||||
|
it.text = "Start"
|
||||||
|
it.textSize = 30
|
||||||
|
it.textColor = Color.parse("#ffffff")
|
||||||
|
it.layoutConfig = {
|
||||||
|
widthSpec: LayoutSpec.WRAP_CONTENT,
|
||||||
|
heightSpec: LayoutSpec.WRAP_CONTENT,
|
||||||
|
}
|
||||||
|
}))
|
||||||
vlayout.addChild(hlayout)
|
vlayout.addChild(hlayout)
|
||||||
|
|
||||||
|
|
||||||
@ -182,7 +195,9 @@ class SnakeView extends ViewHolder {
|
|||||||
controlArea.gravity = new Gravity().centerX()
|
controlArea.gravity = new Gravity().centerX()
|
||||||
controlArea.space = 10
|
controlArea.space = 10
|
||||||
controlArea.layoutConfig = {
|
controlArea.layoutConfig = {
|
||||||
alignment: new Gravity().centerX()
|
alignment: new Gravity().centerX(),
|
||||||
|
widthSpec: LayoutSpec.WRAP_CONTENT,
|
||||||
|
heightSpec: LayoutSpec.WRAP_CONTENT,
|
||||||
}
|
}
|
||||||
const line1 = new HLayout
|
const line1 = new HLayout
|
||||||
const line2 = new HLayout
|
const line2 = new HLayout
|
||||||
@ -191,6 +206,14 @@ class SnakeView extends ViewHolder {
|
|||||||
line2.addChild(this.left)
|
line2.addChild(this.left)
|
||||||
line2.addChild(this.down)
|
line2.addChild(this.down)
|
||||||
line2.addChild(this.right)
|
line2.addChild(this.right)
|
||||||
|
line1.layoutConfig = {
|
||||||
|
widthSpec: LayoutSpec.WRAP_CONTENT,
|
||||||
|
heightSpec: LayoutSpec.WRAP_CONTENT,
|
||||||
|
}
|
||||||
|
line2.layoutConfig = {
|
||||||
|
widthSpec: LayoutSpec.WRAP_CONTENT,
|
||||||
|
heightSpec: LayoutSpec.WRAP_CONTENT,
|
||||||
|
}
|
||||||
controlArea.addChild(line1)
|
controlArea.addChild(line1)
|
||||||
controlArea.addChild(line2)
|
controlArea.addChild(line2)
|
||||||
vlayout.addChild(controlArea)
|
vlayout.addChild(controlArea)
|
||||||
|
@ -99,7 +99,7 @@ export abstract class Panel {
|
|||||||
private retrospectView(ids: string[]): View {
|
private retrospectView(ids: string[]): View {
|
||||||
return ids.reduce((acc: View, cur) => {
|
return ids.reduce((acc: View, cur) => {
|
||||||
if (Reflect.has(acc, "subViewById")) {
|
if (Reflect.has(acc, "subViewById")) {
|
||||||
return Reflect.get(acc, "subViewById")(cur)
|
return Reflect.apply(Reflect.get(acc, "subViewById"), acc, [cur])
|
||||||
}
|
}
|
||||||
return acc
|
return acc
|
||||||
}, this.__root__)
|
}, this.__root__)
|
||||||
|
@ -19,9 +19,25 @@ import { uniqueId } from "../util/uniqueId";
|
|||||||
import { Gravity } from "../util/gravity";
|
import { Gravity } from "../util/gravity";
|
||||||
import { loge } from "../util/log";
|
import { loge } from "../util/log";
|
||||||
|
|
||||||
export const MATCH_PARENT = -1
|
export enum LayoutSpec {
|
||||||
|
EXACTLY = 0,
|
||||||
|
WRAP_CONTENT = 1,
|
||||||
|
AT_MOST = 2,
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface LayoutConfig {
|
||||||
|
widthSpec?: LayoutSpec
|
||||||
|
heightSpec?: LayoutSpec
|
||||||
|
margin?: {
|
||||||
|
left?: number,
|
||||||
|
right?: number,
|
||||||
|
top?: number,
|
||||||
|
bottom?: number,
|
||||||
|
}
|
||||||
|
alignment?: Gravity
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
export const WRAP_CONTENT = -2
|
|
||||||
|
|
||||||
export function Property(target: Object, propKey: string) {
|
export function Property(target: Object, propKey: string) {
|
||||||
Reflect.defineMetadata(propKey, true, target)
|
Reflect.defineMetadata(propKey, true, target)
|
||||||
@ -29,10 +45,10 @@ export function Property(target: Object, propKey: string) {
|
|||||||
|
|
||||||
export abstract class View implements Modeling {
|
export abstract class View implements Modeling {
|
||||||
@Property
|
@Property
|
||||||
width: number = WRAP_CONTENT
|
width: number = 0
|
||||||
|
|
||||||
@Property
|
@Property
|
||||||
height: number = WRAP_CONTENT
|
height: number = 0
|
||||||
|
|
||||||
@Property
|
@Property
|
||||||
x: number = 0
|
x: number = 0
|
||||||
@ -70,7 +86,7 @@ export abstract class View implements Modeling {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Property
|
@Property
|
||||||
layoutConfig?: Config
|
layoutConfig?: LayoutConfig
|
||||||
|
|
||||||
@Property
|
@Property
|
||||||
onClick?: Function
|
onClick?: Function
|
||||||
@ -216,21 +232,11 @@ export abstract class View implements Modeling {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Config {
|
export interface StackConfig extends LayoutConfig {
|
||||||
margin?: {
|
|
||||||
left?: number,
|
|
||||||
right?: number,
|
|
||||||
top?: number,
|
|
||||||
bottom?: number,
|
|
||||||
}
|
|
||||||
alignment?: Gravity
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface StackConfig extends Config {
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface LinearConfig extends Config {
|
export interface LinearConfig extends LayoutConfig {
|
||||||
weight?: number
|
weight?: number
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -239,16 +245,6 @@ export interface SuperView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export abstract class Group extends View implements SuperView {
|
export abstract class Group extends View implements SuperView {
|
||||||
|
|
||||||
subViewById(id: string): View | undefined {
|
|
||||||
for (let view of this.children) {
|
|
||||||
if (view.viewId === id) {
|
|
||||||
return view
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return undefined
|
|
||||||
}
|
|
||||||
|
|
||||||
@Property
|
@Property
|
||||||
readonly children: View[] = new Proxy([], {
|
readonly children: View[] = new Proxy([], {
|
||||||
set: (target, index, value) => {
|
set: (target, index, value) => {
|
||||||
@ -269,6 +265,14 @@ export abstract class Group extends View implements SuperView {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
subViewById(id: string): View | undefined {
|
||||||
|
for (let view of this.children) {
|
||||||
|
if (view.viewId === id) {
|
||||||
|
return view
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return undefined
|
||||||
|
}
|
||||||
addChild(view: View) {
|
addChild(view: View) {
|
||||||
this.children.push(view)
|
this.children.push(view)
|
||||||
}
|
}
|
||||||
@ -461,27 +465,4 @@ export class Slide extends View implements SuperView {
|
|||||||
private renderBunchedPages(pages: number[]): View[] {
|
private renderBunchedPages(pages: number[]): View[] {
|
||||||
return pages.map(e => this.getPage(e))
|
return pages.map(e => this.getPage(e))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
export function stack() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
export function vlayout(providers: Array<() => View>, config: {
|
|
||||||
width: number
|
|
||||||
height: number
|
|
||||||
space?: number
|
|
||||||
}) {
|
|
||||||
const vlayout = new VLayout
|
|
||||||
vlayout.width = config.width
|
|
||||||
vlayout.height = config.height
|
|
||||||
if (config.space !== undefined) {
|
|
||||||
vlayout.space = config.space
|
|
||||||
}
|
|
||||||
providers.forEach(e => {
|
|
||||||
vlayout.addChild(e())
|
|
||||||
})
|
|
||||||
return vlayout
|
|
||||||
}
|
|
Reference in New Issue
Block a user