mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-08-26 22:00:17 +08:00
feat(switch): add property for off state background color (#7138)
This commit is contained in:
@ -1,7 +1,16 @@
|
|||||||
<Page>
|
<Page>
|
||||||
<StackLayout>
|
<StackLayout>
|
||||||
<Progress value="42" color="red" backgroundColor="green" height="10" width="300" />
|
<Progress value="42" color="red" backgroundColor="green" height="10" width="300" />
|
||||||
|
|
||||||
<Switch checked="true" color="red" backgroundColor="green" height="30" width="52" borderWidth="2" borderColor="blue" borderRadius="15" />
|
<Switch checked="true" color="red" backgroundColor="green" height="30" width="52" borderWidth="2" borderColor="blue" borderRadius="15" />
|
||||||
|
<Switch checked="false" color="red" backgroundColor="green" height="30" width="52" borderWidth="2" borderColor="blue" borderRadius="15" />
|
||||||
|
|
||||||
|
<Switch checked="true" color="red" backgroundColor="green" offBackgroundColor="purple" height="30" width="52" borderWidth="2" borderColor="blue" borderRadius="15" />
|
||||||
|
<Switch checked="false" color="red" backgroundColor="green" offBackgroundColor="purple" height="30" width="52" borderWidth="2" borderColor="blue" borderRadius="15" />
|
||||||
|
|
||||||
|
<Switch checked="true" color="red" offBackgroundColor="purple" height="30" width="52" borderWidth="2" borderColor="blue" borderRadius="15" />
|
||||||
|
<Switch checked="false" color="red" offBackgroundColor="purple" height="30" width="52" borderWidth="2" borderColor="blue" borderRadius="15" />
|
||||||
|
|
||||||
<Switch />
|
<Switch />
|
||||||
</StackLayout>
|
</StackLayout>
|
||||||
</Page>
|
</Page>
|
||||||
|
@ -1,14 +1,27 @@
|
|||||||
import { Switch as SwitchDefinition } from ".";
|
import { Switch as SwitchDefinition } from ".";
|
||||||
import { View, Property, booleanConverter, CSSType } from "../core/view";
|
import { View, Property, booleanConverter, CSSType } from "../core/view";
|
||||||
|
import { Color } from "../../color";
|
||||||
|
|
||||||
export * from "../core/view";
|
export * from "../core/view";
|
||||||
|
|
||||||
@CSSType("Switch")
|
@CSSType("Switch")
|
||||||
export class SwitchBase extends View implements SwitchDefinition {
|
export class SwitchBase extends View implements SwitchDefinition {
|
||||||
public checked: boolean;
|
public checked: boolean;
|
||||||
|
public offBackgroundColor: Color;
|
||||||
|
|
||||||
|
_onCheckedPropertyChanged(newValue: boolean) {
|
||||||
|
//
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SwitchBase.prototype.recycleNativeView = "auto";
|
SwitchBase.prototype.recycleNativeView = "auto";
|
||||||
|
|
||||||
export const checkedProperty = new Property<SwitchBase, boolean>({ name: "checked", defaultValue: false, valueConverter: booleanConverter });
|
function onCheckedPropertyChanged(switchBase: SwitchBase, oldValue: boolean, newValue: boolean) {
|
||||||
|
switchBase._onCheckedPropertyChanged(newValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
export const checkedProperty = new Property<SwitchBase, boolean>({ name: "checked", defaultValue: false, valueConverter: booleanConverter, valueChanged: onCheckedPropertyChanged });
|
||||||
checkedProperty.register(SwitchBase);
|
checkedProperty.register(SwitchBase);
|
||||||
|
|
||||||
|
export const offBackgroundColorProperty = new Property<SwitchBase, Color>({ name: "offBackgroundColor", equalityComparer: Color.equals, valueConverter: (v) => new Color(v) });
|
||||||
|
offBackgroundColorProperty.register(SwitchBase);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import {
|
import {
|
||||||
SwitchBase, Color, colorProperty, backgroundColorProperty, backgroundInternalProperty, checkedProperty
|
SwitchBase, Color, colorProperty, backgroundColorProperty, backgroundInternalProperty, checkedProperty, offBackgroundColorProperty
|
||||||
} from "./switch-common";
|
} from "./switch-common";
|
||||||
|
|
||||||
export * from "./switch-common";
|
export * from "./switch-common";
|
||||||
@ -54,6 +54,24 @@ export class Switch extends SwitchBase {
|
|||||||
super.disposeNativeView();
|
super.disposeNativeView();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private setNativeBackgroundColor(value: string | number | Color) {
|
||||||
|
if (value instanceof Color) {
|
||||||
|
this.nativeViewProtected.getTrackDrawable().setColorFilter(value.android, android.graphics.PorterDuff.Mode.SRC_IN);
|
||||||
|
} else {
|
||||||
|
this.nativeViewProtected.getTrackDrawable().clearColorFilter();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_onCheckedPropertyChanged(newValue: boolean) {
|
||||||
|
if (this.offBackgroundColor) {
|
||||||
|
if (!newValue) {
|
||||||
|
this.setNativeBackgroundColor(this.offBackgroundColor);
|
||||||
|
} else {
|
||||||
|
this.setNativeBackgroundColor(this.backgroundColor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[checkedProperty.getDefault](): boolean {
|
[checkedProperty.getDefault](): boolean {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -76,10 +94,8 @@ export class Switch extends SwitchBase {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
[backgroundColorProperty.setNative](value: number | Color) {
|
[backgroundColorProperty.setNative](value: number | Color) {
|
||||||
if (value instanceof Color) {
|
if (!this.offBackgroundColor || this.checked) {
|
||||||
this.nativeViewProtected.getTrackDrawable().setColorFilter(value.android, android.graphics.PorterDuff.Mode.SRC_IN);
|
this.setNativeBackgroundColor(value);
|
||||||
} else {
|
|
||||||
this.nativeViewProtected.getTrackDrawable().clearColorFilter();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -89,4 +105,13 @@ export class Switch extends SwitchBase {
|
|||||||
[backgroundInternalProperty.setNative](value: any) {
|
[backgroundInternalProperty.setNative](value: any) {
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[offBackgroundColorProperty.getDefault](): number {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
[offBackgroundColorProperty.setNative](value: number | Color) {
|
||||||
|
if (!this.checked) {
|
||||||
|
this.setNativeBackgroundColor(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
6
tns-core-modules/ui/switch/switch.d.ts
vendored
6
tns-core-modules/ui/switch/switch.d.ts
vendored
@ -4,6 +4,7 @@
|
|||||||
*/ /** */
|
*/ /** */
|
||||||
|
|
||||||
import { View, Property } from "../core/view";
|
import { View, Property } from "../core/view";
|
||||||
|
import { Color } from "../../color";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a switch component.
|
* Represents a switch component.
|
||||||
@ -24,6 +25,11 @@ export class Switch extends View {
|
|||||||
* Gets or sets if a switch is checked or not.
|
* Gets or sets if a switch is checked or not.
|
||||||
*/
|
*/
|
||||||
checked: boolean;
|
checked: boolean;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets or sets the background color of the Switch when it is turned off.
|
||||||
|
*/
|
||||||
|
offBackgroundColor: Color;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import {
|
import {
|
||||||
SwitchBase, layout, Color, colorProperty, backgroundColorProperty, backgroundInternalProperty, checkedProperty
|
SwitchBase, layout, Color, colorProperty, backgroundColorProperty, backgroundInternalProperty, checkedProperty, offBackgroundColorProperty
|
||||||
} from "./switch-common";
|
} from "./switch-common";
|
||||||
|
|
||||||
export * from "./switch-common";
|
export * from "./switch-common";
|
||||||
@ -95,4 +95,15 @@ export class Switch extends SwitchBase {
|
|||||||
[backgroundInternalProperty.setNative](value: any) {
|
[backgroundInternalProperty.setNative](value: any) {
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[offBackgroundColorProperty.getDefault](): UIColor {
|
||||||
|
return this.nativeViewProtected.backgroundColor;
|
||||||
|
}
|
||||||
|
[offBackgroundColorProperty.setNative](value: Color | UIColor) {
|
||||||
|
const nativeValue = value instanceof Color ? value.ios : value;
|
||||||
|
|
||||||
|
this.nativeViewProtected.tintColor = nativeValue;
|
||||||
|
this.nativeViewProtected.backgroundColor = nativeValue;
|
||||||
|
this.nativeViewProtected.layer.cornerRadius = this.nativeViewProtected.frame.size.height / 2;
|
||||||
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user