【问题标题】:Android: How to create custom shape keys on keyboard?Android:如何在键盘上创建自定义形状键?
【发布时间】:2011-02-28 03:00:30
【问题描述】:

我想知道如何在 android 键盘上制作自定义形状键。创建自定义键盘相对容易,但创建新按钮需要做些什么。他们还需要像普通键盘一样响应所有事件。

任何想法从哪里开始?

【问题讨论】:

    标签: android keyboard key reshape


    【解决方案1】:

    您需要为自定义键盘上的每个键创建一个图像,然后创建支持键盘设计的 xml,并将其加载到您的应用程序中,并使用 Keyboard 类。 您需要更多详细信息吗? 如果是这样,如果你愿意,我会准备一个,我一直想在这门课上试一试。

    【讨论】:

    • 仅仅重写Keyboard类的createKeyFromXml()函数还不够吗?
    • 哦,是的,我想这是可能的,尽管我从未尝试过。没听懂你的意思,我以为你想换整个键盘
    • 你理解的没错,我只是觉得这样会更简单。我猜不会。也许你应该更详细一点:)
    【解决方案2】:

    像这样加载它

    Keyboard mQwertyKeyboard = new LatinKeyboard(this, R.xml.qwerty);
    

    拉丁键盘

    public class LatinKeyboard extends Keyboard
    {
    
        private Key mEnterKey;
        private Key mSpaceKey;
    
        private Key mModeChangeKey;
    
        private Key mLanguageSwitchKey;
    
        private Key mSavedModeChangeKey;
    
        private Key mSavedLanguageSwitchKey;
    
        public LatinKeyboard(Context context, int xmlLayoutResId) {
            super(context, xmlLayoutResId);
        }
    
        public LatinKeyboard(Context context, int layoutTemplateResId, 
                CharSequence characters, int columns, int horizontalPadding) {
            super(context, layoutTemplateResId, characters, columns, horizontalPadding);
        }
    
        @Override
        protected Key createKeyFromXml(Resources res, Row parent, int x, int y, 
                XmlResourceParser parser) {
            Key key = new LatinKey(res, parent, x, y, parser);
            if (key.codes[0] == 10) {
                mEnterKey = key;
            } else if (key.codes[0] == ' ') {
                mSpaceKey = key;
            } else if (key.codes[0] == Keyboard.KEYCODE_MODE_CHANGE) {
                mModeChangeKey = key;
                mSavedModeChangeKey = new LatinKey(res, parent, x, y, parser);
            } else if (key.codes[0] == LatinKeyboardView.KEYCODE_LANGUAGE_SWITCH) {
                mLanguageSwitchKey = key;
                mSavedLanguageSwitchKey = new LatinKey(res, parent, x, y, parser);
            }
            return key;
        }
    
    
        void setLanguageSwitchKeyVisibility(boolean visible) {
            if (visible) {
                // The language switch key should be visible. Restore the size of the mode change key
                // and language switch key using the saved layout.
                mModeChangeKey.width = mSavedModeChangeKey.width;
                mModeChangeKey.x = mSavedModeChangeKey.x;
                mLanguageSwitchKey.width = mSavedLanguageSwitchKey.width;
                mLanguageSwitchKey.icon = mSavedLanguageSwitchKey.icon;
                mLanguageSwitchKey.iconPreview = mSavedLanguageSwitchKey.iconPreview;
            } else {
                // The language switch key should be hidden. Change the width of the mode change key
                // to fill the space of the language key so that the user will not see any strange gap.
                mModeChangeKey.width = mSavedModeChangeKey.width + mSavedLanguageSwitchKey.width;
                mLanguageSwitchKey.width = 0;
                mLanguageSwitchKey.icon = null;
                mLanguageSwitchKey.iconPreview = null;
            }
        }
        void setImeOptions(Resources res, int options) {
            if (mEnterKey == null) {
                return;
            }
    
            switch (options&(EditorInfo.IME_MASK_ACTION|EditorInfo.IME_FLAG_NO_ENTER_ACTION)) {
                case EditorInfo.IME_ACTION_GO:
                    mEnterKey.iconPreview = null;
                    mEnterKey.icon = null;
                    mEnterKey.label = res.getText(R.string.label_go_key);
                    break;
                case EditorInfo.IME_ACTION_NEXT:
                    mEnterKey.iconPreview = null;
                    mEnterKey.icon = null;
                    mEnterKey.label = res.getText(R.string.label_next_key);
                    break;
                case EditorInfo.IME_ACTION_SEARCH:
                    mEnterKey.icon = res.getDrawable(R.drawable.sym_keyboard_search);
                    mEnterKey.label = null;
                    break;
                case EditorInfo.IME_ACTION_SEND:
                    mEnterKey.iconPreview = null;
                    mEnterKey.icon = null;
                    mEnterKey.label = res.getText(R.string.label_send_key);
                    break;
                default:
                    mEnterKey.icon = res.getDrawable(R.drawable.sym_keyboard_return);
                    mEnterKey.label = null;
                    break;
            }
        }
    
        void setSpaceIcon(final Drawable icon) {
            if (mSpaceKey != null) {
                mSpaceKey.icon = icon;
            }
        }
    
        static class LatinKey extends Keyboard.Key {
    
            public LatinKey(Resources res, Keyboard.Row parent, int x, int y,
                    XmlResourceParser parser) {
                super(res, parent, x, y, parser);
            }
    
            /**
             * Overriding this method so that we can reduce the target area for the key that
             * closes the keyboard. 
             */
            @Override
            public boolean isInside(int x, int y) {
                return super.isInside(x, codes[0] == KEYCODE_CANCEL ? y - 10 : y);
            }
        }
    
    }
    

    静态类 LatinKey 是必需的,因为借助它,您可以根据需要更改 xml 中的键状态。

    qwerty.xml

    <?xml version="1.0" encoding="utf-8"?>
    
    <Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
        android:keyWidth="10%p"
        android:horizontalGap="0px"
        android:verticalGap="0px"
        android:keyHeight="@dimen/key_height"
        >
    
        <Row>
            <Key android:codes="113" android:keyLabel="q" android:keyEdgeFlags="left"/>
            <Key android:codes="119" android:keyLabel="w"/>
            <Key android:codes="101" android:keyLabel="e"/>
            <Key android:codes="114" android:keyLabel="r"/>
            <Key android:codes="116" android:keyLabel="t"/>
            <Key android:codes="121" android:keyLabel="y"/>
            <Key android:codes="117" android:keyLabel="u"/>
            <Key android:codes="105" android:keyLabel="i"/>
            <Key android:codes="111" android:keyLabel="o"/>
            <Key android:codes="112" android:keyLabel="p" android:keyEdgeFlags="right"/>
        </Row>
    
        <Row>
            <Key android:codes="97" android:keyLabel="a" android:horizontalGap="5%p" 
                    android:keyEdgeFlags="left"/>
            <Key android:codes="115" android:keyLabel="s"/>
            <Key android:codes="100" android:keyLabel="d"/>
            <Key android:codes="102" android:keyLabel="f"/>
            <Key android:codes="103" android:keyLabel="g"/>
            <Key android:codes="104" android:keyLabel="h"/>
            <Key android:codes="106" android:keyLabel="j"/>
            <Key android:codes="107" android:keyLabel="k"/>
            <Key android:codes="108" android:keyLabel="l" android:keyEdgeFlags="right"/>
        </Row>
    
        <Row>
            <Key android:codes="-1" android:keyIcon="@drawable/sym_keyboard_shift" 
                    android:keyWidth="15%p" android:isModifier="true"
                    android:isSticky="true" android:keyEdgeFlags="left"/>
            <Key android:codes="122" android:keyLabel="z"/>
            <Key android:codes="120" android:keyLabel="x"/>
            <Key android:codes="99" android:keyLabel="c"/>
            <Key android:codes="118" android:keyLabel="v"/>
            <Key android:codes="98" android:keyLabel="b"/>
            <Key android:codes="110" android:keyLabel="n"/>
            <Key android:codes="109" android:keyLabel="m"/>
            <Key android:codes="-5" android:keyIcon="@drawable/sym_keyboard_delete" 
                    android:keyWidth="15%p" android:keyEdgeFlags="right"
                    android:isRepeatable="true"/>
        </Row>
    
        <Row android:rowEdgeFlags="bottom">
            <Key android:codes="-3" android:keyIcon="@drawable/sym_keyboard_done" 
                    android:keyWidth="15%p" android:keyEdgeFlags="left"/>
            <Key android:codes="-2" android:keyLabel="123" android:keyWidth="10%p"/>
            <!--
                android:codes: -101 is not a framework-defined key code but a key code that is
                privately defined in com.example.android.softkeyboard.LatinKeyboardView.
            -->
            <Key android:codes="-101" android:keyIcon="@drawable/sym_keyboard_language_switch"
                    android:keyWidth="10%p"/>
            <Key android:codes="32" android:keyIcon="@drawable/sym_keyboard_space" 
                    android:keyWidth="30%p" android:isRepeatable="true"/>
            <Key android:codes="46,44" android:keyLabel=". ,"
                    android:keyWidth="15%p"/>
            <Key android:codes="10" android:keyIcon="@drawable/sym_keyboard_return" 
                    android:keyWidth="20%p" android:keyEdgeFlags="right"/>
        </Row>
    </Keyboard>
    

    【讨论】:

      猜你喜欢
      • 2016-04-25
      • 2012-12-26
      • 2016-12-10
      • 1970-01-01
      • 2011-06-06
      • 2016-05-29
      • 2022-09-23
      相关资源
      最近更新 更多