mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-11-05 13:26:48 +08:00
Cache android.widget.SeekBar as SeekBar for better performance (#4669)
* Cache android.widget.SeekBar as SeekBar for better performance Made singleton listener for SeekBar Fix slider issue Add slider test * Futher refactoring
This commit is contained in:
@@ -143,6 +143,35 @@ export function test_default_native_values() {
|
||||
helper.buildUIAndRunTest(slider, testAction);
|
||||
}
|
||||
|
||||
export function test_values_change_native_values() {
|
||||
const slider = new Slider();
|
||||
slider.minValue = 0;
|
||||
slider.value = 0;
|
||||
slider.maxValue = 10;
|
||||
function testAction(views: Array<View>) {
|
||||
TKUnit.assertEqual(getNativeValue(slider), 0, "1: wrong native slider.value");
|
||||
TKUnit.assertEqual(getNativeMaxValue(slider), 10, "1: Wrong native slider.maxValue");
|
||||
|
||||
slider.value = 5;
|
||||
TKUnit.assertEqual(getNativeValue(slider), 5, "2: wrong native slider.value");
|
||||
TKUnit.assertEqual(getNativeMaxValue(slider), 10, "2: Wrong native slider.maxValue");
|
||||
|
||||
slider.minValue = 10;
|
||||
TKUnit.assertEqual(getNativeValue(slider), isIOS ? 10 : 0, "3: wrong native slider.value");
|
||||
TKUnit.assertEqual(getNativeMaxValue(slider), isIOS ? 10 : 0, "3: Wrong native slider.maxValue");
|
||||
|
||||
slider.maxValue = 20;
|
||||
TKUnit.assertEqual(getNativeValue(slider), isIOS ? 10 : 0, "4: wrong native slider.value");
|
||||
TKUnit.assertEqual(getNativeMaxValue(slider), isIOS ? 20 : 10, "4: Wrong native slider.maxValue");
|
||||
|
||||
slider.value = 15;
|
||||
TKUnit.assertEqual(getNativeValue(slider), isIOS ? 15: 5, "5: wrong native slider.value");
|
||||
TKUnit.assertEqual(getNativeMaxValue(slider), isIOS ? 20 : 10, "5: Wrong native slider.maxValue");
|
||||
};
|
||||
|
||||
helper.buildUIAndRunTest(slider, testAction);
|
||||
}
|
||||
|
||||
export function test_set_min_max_value() {
|
||||
const slider = new Slider();
|
||||
slider.minValue = MIN_TEST_VALUE;
|
||||
@@ -315,10 +344,9 @@ export function test_property_changed_event_when_setting_minValue_no_adjust() {
|
||||
function testAction(views: Array<View>) {
|
||||
const changedProperties = {};
|
||||
let allChanges = 0;
|
||||
|
||||
attachValueChangedEvents(slider, (data: EventData) => {
|
||||
attachValueChangedEvents(slider, (data: PropertyChangeData) => {
|
||||
allChanges++;
|
||||
changedProperties[(<PropertyChangeData>data).propertyName] = true;
|
||||
changedProperties[data.propertyName] = true;
|
||||
});
|
||||
|
||||
// Act
|
||||
@@ -342,9 +370,9 @@ export function test_property_changed_event_when_setting_minValue_with_adjust()
|
||||
function testAction(views: Array<View>) {
|
||||
const changedProperties = {};
|
||||
let allChanges = 0;
|
||||
attachValueChangedEvents(slider, (data: EventData) => {
|
||||
attachValueChangedEvents(slider, (data: PropertyChangeData) => {
|
||||
allChanges++;
|
||||
changedProperties[(<PropertyChangeData>data).propertyName] = true;
|
||||
changedProperties[data.propertyName] = true;
|
||||
});
|
||||
|
||||
// Act
|
||||
@@ -369,9 +397,9 @@ export function test_property_changed_event_when_setting_maxValue_no_adjust() {
|
||||
function testAction(views: Array<View>) {
|
||||
const changedProperties = {};
|
||||
let allChanges = 0;
|
||||
attachValueChangedEvents(slider, (data: EventData) => {
|
||||
attachValueChangedEvents(slider, (data: PropertyChangeData) => {
|
||||
allChanges++;
|
||||
changedProperties[(<PropertyChangeData>data).propertyName] = true;
|
||||
changedProperties[data.propertyName] = true;
|
||||
});
|
||||
|
||||
// Act
|
||||
@@ -395,9 +423,9 @@ export function test_property_changed_event_when_setting_maxValue_with_adjust()
|
||||
function testAction(views: Array<View>) {
|
||||
const changedProperties = {};
|
||||
let allChanges = 0;
|
||||
attachValueChangedEvents(slider, (data: EventData) => {
|
||||
attachValueChangedEvents(slider, (data: PropertyChangeData) => {
|
||||
allChanges++;
|
||||
changedProperties[(<PropertyChangeData>data).propertyName] = true;
|
||||
changedProperties[data.propertyName] = true;
|
||||
});
|
||||
|
||||
// Act
|
||||
@@ -487,20 +515,19 @@ function getNativeValue(slider: Slider): number {
|
||||
function getNativeMaxValue(slider: Slider): number {
|
||||
if (slider.android) {
|
||||
return slider.android.getMax();
|
||||
}
|
||||
else if (slider.ios) {
|
||||
} else if (slider.ios) {
|
||||
return slider.ios.maximumValue;
|
||||
}
|
||||
}
|
||||
|
||||
function setNativeValue(slider: Slider, value: number) {
|
||||
if (slider.android) {
|
||||
slider.android.setProgress(value);
|
||||
}
|
||||
else if (slider.ios) {
|
||||
const seekBar = (<android.widget.SeekBar>slider.android);
|
||||
seekBar.setProgress(value);
|
||||
} else if (slider.ios) {
|
||||
slider.ios.value = value;
|
||||
|
||||
// setting value trough code does not send notification, so simulate that manually.
|
||||
slider.ios.sendActionsForControlEvents(UIControlEvents.ValueChanged);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,7 +9,7 @@
|
||||
"version": "3.1.0"
|
||||
},
|
||||
"tns-android": {
|
||||
"version": "3.1.0"
|
||||
"version": "3.1.1"
|
||||
}
|
||||
},
|
||||
"dependencies": {
|
||||
|
||||
@@ -6,66 +6,70 @@ import {
|
||||
|
||||
export * from "./slider-common";
|
||||
|
||||
interface SeekBarChangeListener {
|
||||
new (owner: Slider): android.widget.SeekBar.OnSeekBarChangeListener;
|
||||
interface OwnerSeekBar extends android.widget.SeekBar {
|
||||
owner: Slider;
|
||||
}
|
||||
|
||||
let SeekBarChangeListener: SeekBarChangeListener;
|
||||
let SeekBar: typeof android.widget.SeekBar;
|
||||
let SeekBarChangeListener: android.widget.SeekBar.OnSeekBarChangeListener;
|
||||
|
||||
function initializeSeekBarChangeListener(): void {
|
||||
if (SeekBarChangeListener) {
|
||||
return;
|
||||
function initializeModule(): void {
|
||||
if (!SeekBar) {
|
||||
SeekBar = android.widget.SeekBar;
|
||||
}
|
||||
|
||||
@Interfaces([android.widget.SeekBar.OnSeekBarChangeListener])
|
||||
class SeekBarChangeListenerImpl extends java.lang.Object implements android.widget.SeekBar.OnSeekBarChangeListener {
|
||||
constructor(public owner: Slider) {
|
||||
super();
|
||||
return global.__native(this);
|
||||
}
|
||||
if (!SeekBarChangeListener) {
|
||||
@Interfaces([android.widget.SeekBar.OnSeekBarChangeListener])
|
||||
class SeekBarChangeListenerImpl extends java.lang.Object implements android.widget.SeekBar.OnSeekBarChangeListener {
|
||||
constructor() {
|
||||
super();
|
||||
return global.__native(this);
|
||||
}
|
||||
|
||||
onProgressChanged(seekBar: android.widget.SeekBar, progress: number, fromUser: boolean): void {
|
||||
const owner = this.owner;
|
||||
if (!owner._supressNativeValue) {
|
||||
let newValue: number = seekBar.getProgress() + owner.minValue;
|
||||
valueProperty.nativeValueChange(owner, newValue);
|
||||
onProgressChanged(seekBar: OwnerSeekBar, progress: number, fromUser: boolean): void {
|
||||
const owner = seekBar.owner;
|
||||
if (!owner._supressNativeValue) {
|
||||
const newValue = progress + owner.minValue;
|
||||
valueProperty.nativeValueChange(owner, newValue);
|
||||
}
|
||||
}
|
||||
|
||||
onStartTrackingTouch(seekBar: OwnerSeekBar): void {
|
||||
//
|
||||
}
|
||||
|
||||
onStopTrackingTouch(seekBar: OwnerSeekBar): void {
|
||||
//
|
||||
}
|
||||
}
|
||||
|
||||
onStartTrackingTouch(seekBar: android.widget.SeekBar): void {
|
||||
//
|
||||
}
|
||||
|
||||
onStopTrackingTouch(seekBar: android.widget.SeekBar): void {
|
||||
//
|
||||
}
|
||||
SeekBarChangeListener = new SeekBarChangeListenerImpl();
|
||||
}
|
||||
}
|
||||
|
||||
SeekBarChangeListener = SeekBarChangeListenerImpl;
|
||||
function getListener(): android.widget.SeekBar.OnSeekBarChangeListener {
|
||||
return SeekBarChangeListener;
|
||||
}
|
||||
|
||||
export class Slider extends SliderBase {
|
||||
_supressNativeValue: boolean;
|
||||
nativeViewProtected: android.widget.SeekBar;
|
||||
nativeViewProtected: OwnerSeekBar;
|
||||
|
||||
public createNativeView() {
|
||||
initializeSeekBarChangeListener();
|
||||
const listener = new SeekBarChangeListener(this);
|
||||
const nativeView = new android.widget.SeekBar(this._context);
|
||||
initializeModule();
|
||||
const nativeView = new SeekBar(this._context);
|
||||
const listener = getListener();
|
||||
nativeView.setOnSeekBarChangeListener(listener);
|
||||
(<any>nativeView).listener = listener;
|
||||
return nativeView;
|
||||
}
|
||||
|
||||
public initNativeView(): void {
|
||||
super.initNativeView();
|
||||
const nativeView: any = this.nativeViewProtected;
|
||||
nativeView.listener.owner = this;
|
||||
this.nativeViewProtected.owner = this;
|
||||
}
|
||||
|
||||
public disposeNativeView() {
|
||||
const nativeView: any = this.nativeViewProtected;
|
||||
nativeView.listener.owner = null;
|
||||
this.nativeViewProtected.owner = null;
|
||||
super.disposeNativeView();
|
||||
}
|
||||
|
||||
@@ -82,34 +86,30 @@ export class Slider extends SliderBase {
|
||||
* We need this method to call native setMax and setProgress methods when minValue property is changed,
|
||||
* without handling the native value changed callback.
|
||||
*/
|
||||
private setNativeValuesSilently(newValue: number, newMaxValue: number) {
|
||||
private setNativeValuesSilently() {
|
||||
this._supressNativeValue = true;
|
||||
const nativeView = this.nativeViewProtected;
|
||||
try {
|
||||
nativeView.setMax(newMaxValue);
|
||||
nativeView.setProgress(newValue);
|
||||
nativeView.setMax(this.maxValue - this.minValue);
|
||||
nativeView.setProgress(this.value - this.minValue);
|
||||
} finally {
|
||||
this._supressNativeValue = false;
|
||||
}
|
||||
}
|
||||
|
||||
[valueProperty.getDefault](): number {
|
||||
return 0;
|
||||
}
|
||||
[valueProperty.setNative](value: number) {
|
||||
this.setNativeValuesSilently(value - this.minValue, this.maxValue - this.minValue);
|
||||
}
|
||||
[minValueProperty.getDefault](): number {
|
||||
return 0;
|
||||
this.setNativeValuesSilently();
|
||||
}
|
||||
|
||||
[minValueProperty.setNative](value: number) {
|
||||
this.setNativeValuesSilently(this.value - value, this.maxValue - value);
|
||||
this.setNativeValuesSilently();
|
||||
}
|
||||
|
||||
[maxValueProperty.getDefault](): number {
|
||||
return 100;
|
||||
}
|
||||
[maxValueProperty.setNative](value: number) {
|
||||
this.setNativeValuesSilently(value - this.minValue, value);
|
||||
this.setNativeValuesSilently();
|
||||
}
|
||||
|
||||
[colorProperty.getDefault](): number {
|
||||
|
||||
Reference in New Issue
Block a user