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:
Hristo Hristov
2017-08-08 16:04:41 +03:00
committed by GitHub
parent ca8a2eeed0
commit 2c27b1ac7a
3 changed files with 89 additions and 62 deletions

View File

@@ -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);
}
}
}

View File

@@ -9,7 +9,7 @@
"version": "3.1.0"
},
"tns-android": {
"version": "3.1.0"
"version": "3.1.1"
}
},
"dependencies": {

View File

@@ -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 {