Toleranz der Android Tastatur

  • 6 Antworten
  • Letztes Antwortdatum
Y

yolonaut

Neues Mitglied
0
Hallo,
ich habe es jetzt endlich geschafft mir die Android Tastatur nachzubauen. Die Tasten sind bei mir Buttons die ein Bild als background haben. Die Größenverhältnisse stimmen mit der originalen Tastatur überein.
Mir ist aufgefallen, dass es viel schwieriger ist auf meiner Tastatur zu tippen, als auf der originalen. Es scheint eine Art Toleranz zu geben:

fdMgaPX.png


Drückt man hier also ins "Leere" wird trotzdem eine Taste gedrückt. Drückt man auf den roten Punkt, wird trotzdem ein A geschrieben. Drück man an die Stelle des blauen Punktes bekommt man ein U oder ein J.
Ich habe es nicht geschafft einen Punkt zu treffen, bei dem nichts geschieht.
Diese Toleranz ist sehr hilfreich beim Tippen und ich möchte das auch auf meiner Tastatur, habe aber überhaupt keine Idee wie das umgesetzt wurde.
Habt ihr vielleicht Ideen oder genauere Informationen zu dieser Funktion ?

LG
 
Mir fallen dazu spontan zwei sachen ein:

1. Du setzt hinter die Buttons jeweils ein unsichbares View, welches auch klickbar ist, und weißt entsprechend einen Buchstaben zu.

2. Dein Hintergrund ist generell Klickbar und du schreibst ein algorythmus und "berechnest dir" was er eventuell schreiben wollte und ersetzt den entsprechenden leeren buchstaben. Als hilfe kann man sich dann ja noch die position wiedergeben lassen. So zum beisiel beim Blauenpunkt "u/h/j/i"...

Gruß

€dit: Um 1 zu verdeutlichen siehe anhang
 

Anhänge

  • tastatur.png
    tastatur.png
    14,2 KB · Aufrufe: 288
Schau doch mal in den SDK Samples da gibt es auch ein Keyboard. Vllt gibts da den Code. Projekt heißt glaube ich SoftKeyboard
 
Jo, die geht natürlich auch. @yolonaut der Code müsste dir definitv helfen.
 
Im Code der AOSP-Tastatur wurde ich fündig. Im Sample SoftKeyboard fand ich zum Thema nichts.


In der Keyboard.java findet man das hier am Ende:

Code:
[LIST=1]
[*]  /**
[*]     * Returns the array of the keys that are closest to the given point.
[*]     * @param x the x-coordinate of the point
[*]     * @param y the y-coordinate of the point
[*]     * @return the array of the nearest keys to the given point. If the given
[*]     * point is out of range, then an array of size zero is returned.
[*]     */
[*]    public Key[] getNearestKeys(final int x, final int y) {
[*]        // Avoid dead pixels at edges of the keyboard
[*]        final int adjustedX = Math.max(0, Math.min(x, mOccupiedWidth - 1));
[*]        final int adjustedY = Math.max(0, Math.min(y, mOccupiedHeight - 1));
[*]        return mProximityInfo.getNearestKeys(adjustedX, adjustedY);
[*]    }
[/LIST]
In der KeyDetector.Java das hier:

Code:
[LIST=1]
[*]/**
[*]     * Detect the key whose hitbox the touch point is in.
[*]     *
[*]     * @param x The x-coordinate of a touch point
[*]     * @param y The y-coordinate of a touch point
[*]     * @return the key that the touch point hits.
[*]     */
[*]    public Key detectHitKey(int x, int y) {
[*]        final int touchX = getTouchX(x);
[*]        final int touchY = getTouchY(y);
[*]        int minDistance = Integer.MAX_VALUE;
[*]        Key primaryKey = null;
[*]        for (final Key key: mKeyboard.getNearestKeys(touchX, touchY)) {
[*]            // An edge key always has its enlarged hitbox to respond to an event that occurred in
[*]            // the empty area around the key. (@see Key#markAsLeftEdge(KeyboardParams)} etc.)
[*]            if (!key.isOnKey(touchX, touchY)) {
[*]                continue;
[*]            }
[*]            final int distance = key.squaredDistanceToEdge(touchX, touchY);
[*]            if (distance > minDistance) {
[*]                continue;
[*]            }
[*]            // To take care of hitbox overlaps, we compare key's code here too.
[*]            if (primaryKey == null || distance < minDistance
[*]                    || key.getCode() > primaryKey.getCode()) {
[*]                minDistance = distance;
[*]                primaryKey = key;
[*]            }
[*]        }
[*]        return primaryKey;
[*]    }
[/LIST]

In der ProximityInfo.Java gibt es noch diesen Teil:

  1. public void fillArrayWithNearestKeyCodes(final int x, final int y, final int primaryKeyCode,
  2. final int[] dest) {
  3. final int destLength = dest.length;
  4. if (destLength < 1) {
  5. return;
  6. }
  7. int index = 0;
  8. if (primaryKeyCode > Constants.CODE_SPACE) {
  9. dest[index++] = primaryKeyCode;
  10. }
  11. final Key[] nearestKeys = getNearestKeys(x, y);
  12. for (Key key : nearestKeys) {
  13. if (index >= destLength) {
  14. break;
  15. }
  16. final int code = key.getCode();
  17. if (code <= Constants.CODE_SPACE) {
  18. break;
  19. }
  20. dest[index++] = code;
  21. }
  22. if (index < destLength) {
  23. dest[index] = Constants.NOT_A_CODE;
  24. }
  25. }
  26. public Key[] getNearestKeys(final int x, final int y) {
  27. if (mGridNeighbors == null) {
  28. return EMPTY_KEY_ARRAY;
  29. }
  30. if (x >= 0 && x < mKeyboardMinWidth && y >= 0 && y < mKeyboardHeight) {
  31. int index = (y / mCellHeight) * mGridWidth + (x / mCellWidth);
  32. if (index < mGridSize) {
  33. return mGridNeighbors[index];
  34. }
  35. }
  36. return EMPTY_KEY_ARRAY;
  37. }

Ich habe aufgrund der vielen verschiedenen Klassen Schwierigkeiten zu verstehen, wie das letzten Endes funktioniert und wie ich es auf meine Buttons (Tasten) übertragen kann.
Könnt ihr mir dabei helfen zu verstehen und den Code etwas zu entschlüsseln ?
Vielen Dank schonmal !
 
Zuletzt bearbeitet:
Am besten du gehst das mal Schritt für Schritt durch. Debuggen hilft da meiner Meinung nach. Zumindest versuche ich anderen Code so zu verstehen. Ist ja verständlich das du nach ner Stunde den kompletten Code nicht verstehen kannst.
Gruß dee
 

Ähnliche Themen

M
Antworten
21
Aufrufe
1.360
swa00
swa00
Mr-Fisch
Antworten
5
Aufrufe
965
migi01
migi01
Mr-Fisch
Antworten
8
Aufrufe
1.006
Mr-Fisch
Mr-Fisch
M
Antworten
9
Aufrufe
789
mkuz24
M
A
Antworten
5
Aufrufe
694
swa00
swa00
Zurück
Oben Unten