Special handling of one key mini-keyboard to mitigate visual flicker

Use pre-computed width and height of mini keyboard if
 * Popup key preview is enabled
 * The mini keyboard has only one key
 * Pre-computed width and height are specified

Bug: 5248783
Change-Id: I53475698e87d5bd67d36e63323c25a9e9f18fbb1
main
Tadashi G. Takaoka 2011-10-12 18:50:04 +09:00
parent ed6bc82d97
commit a0e4f40994
7 changed files with 101 additions and 6 deletions

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
**
** Copyright 2011, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->
<resources>
<dimen name="keyboard_key_feedback_background_holo_width">46.67dp</dimen>
<dimen name="keyboard_key_feedback_background_holo_height">58.67dp</dimen>
</resources>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
**
** Copyright 2011, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->
<resources>
<dimen name="keyboard_key_feedback_background_holo_width">46dp</dimen>
<dimen name="keyboard_key_feedback_background_holo_height">58dp</dimen>
</resources>

View File

@ -0,0 +1,24 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
/*
**
** Copyright 2011, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
-->
<resources>
<dimen name="keyboard_key_feedback_background_holo_width">47dp</dimen>
<dimen name="keyboard_key_feedback_background_holo_height">57dp</dimen>
</resources>

View File

@ -88,6 +88,10 @@
<attr name="keyPreviewLeftBackground" format="reference" />
<!-- The background for the right edge key press feedback. -->
<attr name="keyPreviewRightBackground" format="reference" />
<!-- The width of rectangle part of the key press feedback background. -->
<attr name="keyPreviewBackgroundWidth" format="dimension" />
<!-- The height of rectangle part of the key press feedback background. -->
<attr name="keyPreviewBackgroundHeight" format="dimension" />
<!-- The text color for key press feedback. -->
<attr name="keyPreviewTextColor" format="color" />
<!-- Vertical offset of the key press feedback from the key. -->

View File

@ -259,6 +259,8 @@
<item name="keyPreviewBackground">@drawable/keyboard_key_feedback_ics</item>
<item name="keyPreviewLeftBackground">@drawable/keyboard_key_feedback_left_ics</item>
<item name="keyPreviewRightBackground">@drawable/keyboard_key_feedback_right_ics</item>
<item name="keyPreviewBackgroundWidth">@dimen/keyboard_key_feedback_background_holo_width</item>
<item name="keyPreviewBackgroundHeight">@dimen/keyboard_key_feedback_background_holo_height</item>
<item name="keyPreviewTextColor">#FFFFFFFF</item>
<item name="keyPreviewHeight">@dimen/key_preview_height_ics</item>
<item name="keyPreviewOffset">@dimen/key_preview_offset_ics</item>

View File

@ -100,7 +100,7 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
// Key preview
private final int mKeyPreviewLayoutId;
private final KeyPreviewDrawParams mKeyPreviewDrawParams;
protected final KeyPreviewDrawParams mKeyPreviewDrawParams;
private boolean mShowKeyPreviewPopup = true;
private final int mDelayBeforePreview;
private int mDelayAfterPreview;
@ -284,11 +284,13 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
}
}
private static class KeyPreviewDrawParams {
protected static class KeyPreviewDrawParams {
// XML attributes.
public final Drawable mPreviewBackground;
public final Drawable mPreviewLeftBackground;
public final Drawable mPreviewRightBackground;
public final int mPreviewBackgroundWidth;
public final int mPreviewBackgroundHeight;
public final int mPreviewTextColor;
public final int mPreviewOffset;
public final int mPreviewHeight;
@ -312,6 +314,10 @@ public class KeyboardView extends View implements PointerTracker.DrawingProxy {
setAlpha(mPreviewBackground, PREVIEW_ALPHA);
setAlpha(mPreviewLeftBackground, PREVIEW_ALPHA);
setAlpha(mPreviewRightBackground, PREVIEW_ALPHA);
mPreviewBackgroundWidth = a.getDimensionPixelSize(
R.styleable.KeyboardView_keyPreviewBackgroundWidth, 0);
mPreviewBackgroundHeight = a.getDimensionPixelSize(
R.styleable.KeyboardView_keyPreviewBackgroundHeight, 0);
mPreviewOffset = a.getDimensionPixelOffset(
R.styleable.KeyboardView_keyPreviewOffset, 0);
mPreviewHeight = a.getDimensionPixelSize(

View File

@ -215,10 +215,21 @@ public class MiniKeyboard extends Keyboard {
mParams.mIsRtlKeyboard = parentKeyboard.mIsRtlKeyboard;
mMoreKeys = parentKey.mMoreKeys;
final int keyWidth = getMaxKeyWidth(view, mMoreKeys, mParams.mDefaultKeyWidth);
mParams.setParameters(mMoreKeys.length, parentKey.mMaxMoreKeysColumn,
keyWidth, parentKeyboard.mMostCommonKeyHeight, parentKey.mX
+ (mParams.mDefaultKeyWidth - keyWidth) / 2, view.getMeasuredWidth());
final int previewWidth = view.mKeyPreviewDrawParams.mPreviewBackgroundWidth;
final int previewHeight = view.mKeyPreviewDrawParams.mPreviewBackgroundHeight;
final int width, height;
// Use pre-computed width and height if these values are available and mini keyboard
// has only one key to mitigate visual flicker between key preview and mini keyboard.
if (view.isKeyPreviewPopupEnabled() && mMoreKeys.length == 1 && previewWidth > 0
&& previewHeight > 0) {
width = previewWidth;
height = previewHeight + mParams.mVerticalGap;
} else {
width = getMaxKeyWidth(view, parentKey.mMoreKeys, mParams.mDefaultKeyWidth);
height = parentKeyboard.mMostCommonKeyHeight;
}
mParams.setParameters(mMoreKeys.length, parentKey.mMaxMoreKeysColumn, width, height,
parentKey.mX + (mParams.mDefaultKeyWidth - width) / 2, view.getMeasuredWidth());
}
private static int getMaxKeyWidth(KeyboardView view, CharSequence[] moreKeys,