Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android中带有图像的自定义表情键盘_Android_Keyboard_Emoji_Android Input Method - Fatal编程技术网

Android中带有图像的自定义表情键盘

Android中带有图像的自定义表情键盘,android,keyboard,emoji,android-input-method,Android,Keyboard,Emoji,Android Input Method,我想用android创建我自己的表情键盘。用户应该能够选择这个键盘作为android手机的输入法 我尝试创建它,我可以在我的应用程序中使用它,但我不知道如何将其作为输入法,以便此键盘可用于我手机中的所有其他应用程序。 我在某个地方读到,我必须为此创建一个服务,以便它与输入服务绑定。除此之外,我无法理解其余内容 这就是我所做的。虽然这和我想做的不同,但只是开始,不知道如何继续 public class MainActivity extends FragmentActivity implements

我想用android创建我自己的表情键盘。用户应该能够选择这个键盘作为android手机的输入法

我尝试创建它,我可以在我的应用程序中使用它,但我不知道如何将其作为输入法,以便此键盘可用于我手机中的所有其他应用程序。 我在某个地方读到,我必须为此创建一个服务,以便它与输入服务绑定。除此之外,我无法理解其余内容

这就是我所做的。虽然这和我想做的不同,但只是开始,不知道如何继续

public class MainActivity extends FragmentActivity implements EmoticonsGridAdapter.KeyClickListener {

private static final int NO_OF_EMOTICONS = 100;

private ListView chatList;
private View popUpView;
private ArrayList<Spanned> chats;
private ChatListAdapter mAdapter;

private LinearLayout emoticonsCover;
private PopupWindow popupWindow;

private int keyboardHeight; 
private EditText content;

private LinearLayout parentLayout;

private boolean isKeyBoardVisible;

private Bitmap[] emoticons;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    chatList = (ListView) findViewById(R.id.chat_list);     

    parentLayout = (LinearLayout) findViewById(R.id.list_parent);

    emoticonsCover = (LinearLayout) findViewById(R.id.footer_for_emoticons);

    popUpView = getLayoutInflater().inflate(R.layout.emoticons_popup, null);

    // Setting adapter for chat list
    chats = new ArrayList<Spanned>();
    mAdapter = new ChatListAdapter(getApplicationContext(), chats);
    chatList.setAdapter(mAdapter);
    chatList.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (popupWindow.isShowing())
                popupWindow.dismiss();  
            return false;
        }
    });

    // Defining default height of keyboard which is equal to 230 dip
    final float popUpheight = getResources().getDimension(
            R.dimen.keyboard_height);
    changeKeyboardHeight((int) popUpheight);

    // Showing and Dismissing pop up on clicking emoticons button
    ImageView emoticonsButton = (ImageView) findViewById(R.id.emoticons_button);
    emoticonsButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            if (!popupWindow.isShowing()) {

                popupWindow.setHeight((int) (keyboardHeight));

                if (isKeyBoardVisible) {
                    emoticonsCover.setVisibility(LinearLayout.GONE);
                } else {
                    emoticonsCover.setVisibility(LinearLayout.VISIBLE);
                }
                popupWindow.showAtLocation(parentLayout, Gravity.BOTTOM, 0, 0);

            } else {
                popupWindow.dismiss();
            }

        }
    });

    readEmoticons();
    enablePopUpView();
    checkKeyboardHeight(parentLayout);
    enableFooterView();

}

/**
 * Reading all emoticons in local cache
 */
private void readEmoticons () {

    emoticons = new Bitmap[NO_OF_EMOTICONS];
    for (short i = 0; i < NO_OF_EMOTICONS; i++) {           
        emoticons[i] = getImage((i+1) + ".png");
    }

}

/**
 * Enabling all content in footer i.e. post window
 */
private void enableFooterView() {

    content = (EditText) findViewById(R.id.chat_content);
    content.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            if (popupWindow.isShowing()) {

                popupWindow.dismiss();

            }

        }
    });
    final Button postButton = (Button) findViewById(R.id.post_button);      

    postButton.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {

            if (content.getText().toString().length() > 0) {

                Spanned sp = content.getText();                 
                chats.add(sp);
                content.setText("");                    
                mAdapter.notifyDataSetChanged();

            }

        }
    });
}

/**
 * Overriding onKeyDown for dismissing keyboard on key down
 */
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (popupWindow.isShowing()) {
        popupWindow.dismiss();
        return false;
    } else {
        return super.onKeyDown(keyCode, event);
    }
}

/**
 * Checking keyboard height and keyboard visibility
 */
int previousHeightDiffrence = 0;
private void checkKeyboardHeight(final View parentLayout) {

    parentLayout.getViewTreeObserver().addOnGlobalLayoutListener(
            new ViewTreeObserver.OnGlobalLayoutListener() {

                @Override
                public void onGlobalLayout() {

                    Rect r = new Rect();
                    parentLayout.getWindowVisibleDisplayFrame(r);

                    int screenHeight = parentLayout.getRootView()
                            .getHeight();
                    int heightDifference = screenHeight - (r.bottom);

                    if (previousHeightDiffrence - heightDifference > 50) {                          
                        popupWindow.dismiss();
                    }

                    previousHeightDiffrence = heightDifference;
                    if (heightDifference > 100) {

                        isKeyBoardVisible = true;
                        changeKeyboardHeight(heightDifference);

                    } else {

                        isKeyBoardVisible = false;

                    }

                }
            });

}

/**
 * change height of emoticons keyboard according to height of actual
 * keyboard
 * 
 * @param height
 *            minimum height by which we can make sure actual keyboard is
 *            open or not
 */
private void changeKeyboardHeight(int height) {

    if (height > 100) {
        keyboardHeight = height;
        LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
                LayoutParams.MATCH_PARENT, keyboardHeight);
        emoticonsCover.setLayoutParams(params);
    }

}

/**
 * Defining all components of emoticons keyboard
 */
private void enablePopUpView() {

    ViewPager pager = (ViewPager) popUpView.findViewById(R.id.emoticons_pager);
    pager.setOffscreenPageLimit(3);
    pager.setBackgroundColor(Color.WHITE);
    ArrayList<String> paths = new ArrayList<String>();

    for (short i = 1; i <= NO_OF_EMOTICONS; i++) {          
        paths.add(i + ".png");
    }

    EmoticonsPagerAdapter adapter = new EmoticonsPagerAdapter(MainActivity.this, paths, this);
    pager.setAdapter(adapter);

    // Creating a pop window for emoticons keyboard
    popupWindow = new PopupWindow(popUpView, LayoutParams.MATCH_PARENT,
            (int) keyboardHeight, false);

    /*TextView backSpace = (TextView) popUpView.findViewById(R.id.back);
    backSpace.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            KeyEvent event = new KeyEvent(0, 0, 0, KeyEvent.KEYCODE_DEL, 0, 0, 0, 0, KeyEvent.KEYCODE_ENDCALL);
            content.dispatchKeyEvent(event);    
        }
    });*/

    popupWindow.setOnDismissListener(new OnDismissListener() {

        @Override
        public void onDismiss() {
            emoticonsCover.setVisibility(LinearLayout.GONE);
        }
    });
}

/**
 * For loading smileys from assets
 */
private Bitmap getImage(String path) {
    AssetManager mngr = getAssets();
    InputStream in = null;
    try {
        in = mngr.open("emoticons/" + path);
    } catch (Exception e) {
        e.printStackTrace();
    }

    Bitmap temp = BitmapFactory.decodeStream(in, null, null);
    return temp;
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    return true;
}

@Override
public void keyClickedIndex(final String index) {

    ImageGetter imageGetter = new ImageGetter() {
        public Drawable getDrawable(String source) {    
            StringTokenizer st = new StringTokenizer(index, ".");
            Drawable d = new BitmapDrawable(getResources(),emoticons[Integer.parseInt(st.nextToken()) - 1]);
            d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
            return d;
        }
    };

    Spanned cs = Html.fromHtml("<img src ='"+ index +"'/>", imageGetter, null);        

    int cursorPosition = content.getSelectionStart();       
    content.getText().insert(cursorPosition, cs);

}
编辑:
我们可以从图像列表中复制一个图像并粘贴到键盘打开的地方吗?

我发现的表情键盘的最佳实现是 这是一个非常好的实现,可能有一些冗余代码,但对于理解如何实现不适合普通“按钮到文本”键盘的键盘仍然非常好

更新

好的,在对两个项目进行了大量的重新分解之后,我现在已经能够成功地将集成到我自己的项目中

基本上,您对表情符号键盘所做的只是创建一个键盘大小的视图,然后用对应于表情符号的PNG文件填充该视图。每个图像都像一个按钮,并向inputConnection发送相应的表情符号

更新2


我已经扩展了,并创建了一个更清晰的版本,应该更容易理解。请看我的

检查此链接创建自定义输入法编辑器的内容。@rajahsekar我正在关注您提供的链接。如果我进入其他网站,将会更新problem@rajahsekar在教程的帮助下,我能够创建自定义键盘。但我也想在键盘上添加表情符号。怎么做呢?尝试使用unicodes for Smiles我想尝试8vim,但一开始它就崩溃了,原因是:java.lang.NullPointerException:尝试调用虚拟方法'java.lang.String android.content.Context.getString(int)在inc.flide.eightvim.Setting.(Setting.java:11)的空对象引用上,您是如何实现emojis的?使用popupwindow?@yanivtwin:我已经解决了如果键盘没有先打开,打开设置会导致崩溃的问题。你现在可以试试。谢谢,我会再试一次,你是在用popupwindow实现吗?或者是键盘xml?我实际上是android新手,一般来说并不真正理解术语“popupwindow”,但据我所知,它既不是popupwindow,也不是键盘xml。这只是键盘高度的另一个视图。
  public class SimpleIME extends InputMethodService
        implements KeyboardView.OnKeyboardActionListener {

    private KeyboardView kv;
    private Keyboard keyboard;
    private View popUpView;
    private boolean caps = false;
    @Override
    public View onCreateInputView() {
        kv = (KeyboardView)getLayoutInflater().inflate(R.layout.keyboard, null);
        keyboard = new Keyboard(this, R.xml.qwerty);
        kv.setKeyboard(keyboard);
        kv.setOnKeyboardActionListener(this);
        kv.invalidateAllKeys();
        popUpView = getLayoutInflater().inflate(R.layout.emoticons_popup, null);
        return kv;
    }

    @Override
    public void onKey(int primaryCode, int[] keyCodes) {
        InputConnection ic = getCurrentInputConnection();
        playClick(primaryCode);
        switch(primaryCode){
            case Keyboard.KEYCODE_DELETE :
                ic.deleteSurroundingText(1, 0);
                break;
            case Keyboard.KEYCODE_SHIFT:
                caps = !caps;
                keyboard.setShifted(caps);
                kv.invalidateAllKeys();
                break;
            case Keyboard.KEYCODE_DONE:
                ic.sendKeyEvent(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_ENTER));
                break;
            case -80 :
                Log.d("smiley", "smiley pressed");

                break;
            default:
                char code = (char)primaryCode;
                if(Character.isLetter(code) && caps){
                    code = Character.toUpperCase(code);
                }
                ic.commitText(String.valueOf(code),1);
        }
    }

    private void playClick(int keyCode){
        AudioManager am = (AudioManager)getSystemService(AUDIO_SERVICE);
        switch(keyCode){
            case 32:
                am.playSoundEffect(AudioManager.FX_KEYPRESS_SPACEBAR);
                break;
            case Keyboard.KEYCODE_DONE:
            case 10:
                am.playSoundEffect(AudioManager.FX_KEYPRESS_RETURN);
                break;
            case Keyboard.KEYCODE_DELETE:
                am.playSoundEffect(AudioManager.FX_KEYPRESS_DELETE);
                break;
            default: am.playSoundEffect(AudioManager.FX_KEYPRESS_STANDARD);
        }
    }


    @Override
    public void onPress(int primaryCode) {
    }

    @Override
    public void onRelease(int primaryCode) {
    }

    @Override
    public void onText(CharSequence text) {
    }

    @Override
    public void swipeDown() {
    }

    @Override
    public void swipeLeft() {
    }

    @Override
    public void swipeRight() {
    }

    @Override
    public void swipeUp() {
    }

}