This repository has been archived on 2024-07-22. You can view files and clone it, but cannot push or open issues or pull requests.
Doric/doric-demo/src/BlurEffectsDemo.tsx

278 lines
10 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import {
VLayout,
Group,
Panel,
jsx,
layoutConfig,
BlurEffect,
Image,
Text,
createRef,
Stack,
Color,
GestureContainer,
Scroller,
Gravity,
HLayout,
} from "doric";
import { colors } from "./utils";
@Entry
export class BlurEffectsDemo extends Panel {
build(root: Group) {
root.backgroundColor = Color.WHITE;
const blurEffectRef = createRef<BlurEffect>();
const gestureRef = createRef<GestureContainer>();
<Scroller parent={root} layoutConfig={layoutConfig().most()}>
<VLayout layoutConfig={layoutConfig().mostWidth().fitHeight()}>
<BlurEffect
layoutConfig={layoutConfig().mostWidth().fitHeight()}
radius={20}
ref={blurEffectRef}
effectiveRect={{
x: 50,
y: 50,
width: 200,
height: 200,
}}
>
<GestureContainer
ref={gestureRef}
layoutConfig={layoutConfig().mostWidth().fitHeight()}
>
<VLayout space={20} padding={{ left: 5, right: 5 }}>
<Image imageUrl="https://doric.pub/about/The_Parthenon_in_Athens.jpg" />
<HLayout space={10}>
<Image imageUrl="https://doric.pub/logo.png" />
<Text
layoutConfig={layoutConfig().mostWidth().fitHeight()}
maxLines={-1}
textAlignment={Gravity.Left}
>
Doric
Doric样式的廊柱撑起了神庙的千年风雨Doric项目能够作为前端页面的支柱
Doric正在持续迭代中Doric项目感兴趣
</Text>
</HLayout>
</VLayout>
</GestureContainer>
</BlurEffect>
<VLayout
layoutConfig={layoutConfig()
.mostWidth()
.fitHeight()
.configMargin({ top: 20 })}
space={5}
padding={{ left: 10, right: 10 }}
>
{(() => {
const labelRef = createRef<Text>();
const spinnerRef = createRef<Stack>();
const containerRef = createRef<GestureContainer>();
this.addOnRenderFinishedCallback(async () => {
const width = await containerRef.current.getWidth(this.context);
const maxValue = 25;
spinnerRef.current.width =
((blurEffectRef.current.radius || 0) * width) / maxValue;
labelRef.current.text = `Blur radius: ${blurEffectRef.current.radius}`;
containerRef.current.onTouchDown = async (event) => {
spinnerRef.current.width = event.x;
blurEffectRef.current.radius = Math.round(
(event.x / width) * maxValue
);
labelRef.current.text = `Blur radius: ${blurEffectRef.current.radius}`;
};
containerRef.current.onTouchMove = async (event) => {
spinnerRef.current.width = event.x;
blurEffectRef.current.radius = Math.round(
(event.x / width) * maxValue
);
labelRef.current.text = `Blur radius: ${blurEffectRef.current.radius}`;
};
});
return (
<>
<Text textSize={20} ref={labelRef}>
Blur radius:\t
</Text>
<GestureContainer
layoutConfig={layoutConfig().mostWidth().fitHeight()}
ref={containerRef}
border={{
width: 1,
color: colors[4],
}}
>
<Stack
ref={spinnerRef}
backgroundColor={colors[6]}
layoutConfig={layoutConfig().justWidth().justHeight()}
height={40}
></Stack>
</GestureContainer>
</>
);
})()}
</VLayout>
<VLayout
layoutConfig={layoutConfig()
.mostWidth()
.fitHeight()
.configMargin({ top: 20 })}
space={5}
padding={{ left: 10, right: 10 }}
>
{(() => {
const labelRef = createRef<Text>();
const spinnerRef = createRef<Stack>();
const containerRef = createRef<GestureContainer>();
this.addOnRenderFinishedCallback(async () => {
const width = await containerRef.current.getWidth(this.context);
const maxValue = await blurEffectRef.current.getWidth(
this.context
);
spinnerRef.current.width =
((blurEffectRef.current.effectiveRect?.width || 0) * width) /
maxValue;
labelRef.current.text = `Effective Width: ${blurEffectRef.current.effectiveRect?.width}`;
containerRef.current.onTouchDown = async (event) => {
spinnerRef.current.width = event.x;
blurEffectRef.current.effectiveRect = {
...blurEffectRef.current.effectiveRect!!,
width: Math.floor((event.x / width) * maxValue),
};
labelRef.current.text = `Effective Width: ${blurEffectRef.current.effectiveRect?.width}`;
};
containerRef.current.onTouchMove = async (event) => {
spinnerRef.current.width = event.x;
blurEffectRef.current.effectiveRect = {
...blurEffectRef.current.effectiveRect!!,
width: Math.floor((event.x / width) * maxValue),
};
labelRef.current.text = `Effective Width: ${blurEffectRef.current.effectiveRect?.width}`;
};
});
return (
<>
<Text textSize={20} ref={labelRef} />
<GestureContainer
layoutConfig={layoutConfig().mostWidth().fitHeight()}
ref={containerRef}
border={{
width: 1,
color: colors[4],
}}
>
<Stack
ref={spinnerRef}
backgroundColor={colors[6]}
layoutConfig={layoutConfig().justWidth().justHeight()}
height={40}
></Stack>
</GestureContainer>
</>
);
})()}
</VLayout>
<VLayout
layoutConfig={layoutConfig()
.mostWidth()
.fitHeight()
.configMargin({ top: 20 })}
space={5}
padding={{ left: 10, right: 10 }}
>
{(() => {
const labelRef = createRef<Text>();
const spinnerRef = createRef<Stack>();
const containerRef = createRef<GestureContainer>();
this.addOnRenderFinishedCallback(async () => {
const width = await containerRef.current.getWidth(this.context);
const maxValue = await blurEffectRef.current.getHeight(
this.context
);
spinnerRef.current.width =
((blurEffectRef.current.effectiveRect?.height || 0) * width) /
maxValue;
labelRef.current.text = `Effective Height: ${blurEffectRef.current.effectiveRect?.height}`;
containerRef.current.onTouchDown = async (event) => {
spinnerRef.current.width = event.x;
blurEffectRef.current.effectiveRect = {
...blurEffectRef.current.effectiveRect!!,
height: Math.floor((event.x / width) * maxValue),
};
labelRef.current.text = `Effective Height: ${blurEffectRef.current.effectiveRect?.height}`;
};
containerRef.current.onTouchMove = async (event) => {
spinnerRef.current.width = event.x;
blurEffectRef.current.effectiveRect = {
...blurEffectRef.current.effectiveRect!!,
height: Math.floor((event.x / width) * maxValue),
};
labelRef.current.text = `Effective Height: ${blurEffectRef.current.effectiveRect?.height}`;
};
});
return (
<>
<Text textSize={20} ref={labelRef} />
<GestureContainer
layoutConfig={layoutConfig().mostWidth().fitHeight()}
ref={containerRef}
border={{
width: 1,
color: colors[4],
}}
>
<Stack
ref={spinnerRef}
backgroundColor={colors[6]}
layoutConfig={layoutConfig().justWidth().justHeight()}
height={40}
></Stack>
</GestureContainer>
</>
);
})()}
</VLayout>
</VLayout>
</Scroller>;
this.addOnRenderFinishedCallback(() => {
let x = 0,
y = 0,
posX = 0,
posY = 0;
gestureRef.current.onTouchDown = (event) => {
const rect = blurEffectRef.current.effectiveRect || {
x: 0,
y: 0,
width: 0,
height: 0,
};
if (
event.x >= rect.x &&
event.x <= rect.x + rect.width &&
event.y >= rect.y &&
event.y <= rect.y + rect.height
) {
x = event.x;
y = event.y;
posX = rect.x;
posY = rect.y;
} else {
x = -1;
}
};
gestureRef.current.onTouchMove = (event) => {
if (x >= 0) {
blurEffectRef.current.effectiveRect = {
...blurEffectRef.current.effectiveRect!!,
x: posX + (event.x - x),
y: posY + (event.y - y),
};
}
};
});
}
}