All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.paf.rn.view.KeyBoardView Maven / Gradle / Ivy

There is a newer version: 0.52.u
Show newest version
/*
 * 文件名: KeyBoardView.java
 * 版    权:  Copyright PingAn Technology All Rights Reserved.
 * 描    述: [该类的简要描述]
 * 创建人: EX-XUJIAO001
 * 创建时间: 2012-2-6
 * 
 * 修改人:
 * 修改时间:
 * 修改内容:[修改内容]
 */
package com.paf.rn.view;

import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
import android.os.Handler;
import android.os.SystemClock;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.Gravity;
import android.view.InputDevice;
import android.view.KeyCharacterMap;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.TextView;

import com.facebook.react.R;

import java.util.ArrayList;
import java.util.List;

/**
 * 密码键盘
 *
 * @author EX-XUJIAO001
 * @version [Android PABank C01, @2012-2-6]
 * @date 2012-2-6
 * @description
 */
public class KeyBoardView extends PopupWindow implements OnClickListener, OnTouchListener {
    private Button btnq;
    private Button btnw;
    private Button btne;
    private Button btnr;
    private Button btnt;
    private Button btny;
    private Button btnu;
    private Button btni;
    private Button btno;
    private Button btnp;

    private Button btna;
    private Button btns;
    private Button btnd;
    private Button btnf;
    private Button btng;
    private Button btnh;
    private Button btnj;
    private Button btnk;
    private Button btnl;

    private Button btnz;
    private Button btnx;
    private Button btnc;
    private Button btnv;
    private Button btnb;
    private Button btnn;
    private Button btnm;

    private OnKeyDownBtnListener onKeyDownBtnListener;
    private Button btnpoint;
    private ImageView keyboardDot;
    private ImageView keyboardShift;

    private int keyBoradType = -1;
    private int letterTag = 0;
    private boolean isDelPress = false;
    private int linearDelWidth;
    private int linearDelHeight;
    private int clickTimes;

    private Context context;

    private KeyView popKeyView;
    private EditText editText;
    private OnKeyboardShowListener mKeyboardShowListener;

    private static final int FIRST_DELETE_DELAYED_TIME = 1500;
    private static final int SECOND_DELETE_DELAYED_TIME = 150;
    private static final int SENDEVENT = 300;

    public static final int KEYBOARD_TYPE_NUM = -1;//数字键盘
    public static final int KEYBOARD_TYPE_FULL = 2;//全键盘

    /**
     * [构造简要说明]
     *
     * @param contentView
     * @param width
     * @param height
     */
    public KeyBoardView(View contentView, int width, int height, int keyBoardType, Context context) {
        super(contentView, width, height);
        this.keyBoradType = keyBoardType;
        this.context = context;
        init();
    }

    public static int getActualSize(Context ctx, int orgSize) {
        WindowManager windowManager = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);

        DisplayMetrics displayMetrics = new DisplayMetrics();
        windowManager.getDefaultDisplay().getMetrics(displayMetrics);
        float density = displayMetrics.density;

        return (int) (orgSize * density);
    }

    /**
     * 初始化
     */
    private void init() {
        ViewGroup contentView = (ViewGroup) getContentView();

        View view = LayoutInflater.from(context).inflate(R.layout.pop_key, null);
        int w = getActualSize(this.context, 66);
        int y = getActualSize(this.context, 66);
        popKeyView = new KeyView(view, w, y);

        btnViewList = new ArrayList();

        contentView.setOnTouchListener(keyTouchListener);

        (contentView.findViewById(R.id.btn1)).setOnClickListener(this);
        (contentView.findViewById(R.id.btn2)).setOnClickListener(this);
        (contentView.findViewById(R.id.btn3)).setOnClickListener(this);
        (contentView.findViewById(R.id.btn4)).setOnClickListener(this);
        (contentView.findViewById(R.id.btn5)).setOnClickListener(this);
        (contentView.findViewById(R.id.btn6)).setOnClickListener(this);
        (contentView.findViewById(R.id.btn7)).setOnClickListener(this);
        (contentView.findViewById(R.id.btn8)).setOnClickListener(this);
        (contentView.findViewById(R.id.btn9)).setOnClickListener(this);
        (contentView.findViewById(R.id.btn0)).setOnClickListener(this);
        btnpoint = (Button) contentView.findViewById(R.id.btnpoint);
        btnpoint.setOnClickListener(this);
        View lineardel = contentView.findViewById(R.id.lineardel);
        if (lineardel != null) {
            lineardel.setOnClickListener(this);
            lineardel.setOnTouchListener(new OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    onTouchEventDispatch(v, event);
                    return false;
                }
            });
        }

        View linearLinearDel = contentView.findViewById(R.id.linear_lineardel);
        if (linearLinearDel != null) {
            linearLinearDel.setOnClickListener(this);
            linearLinearDel.setOnTouchListener(new OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    onTouchEventDispatch(v, event);
                    return false;
                }
            });
        }

        View btnDigitSure1 = contentView.findViewById(R.id.digitbtnsure1);
        if (btnDigitSure1 != null) {
            btnDigitSure1.setOnClickListener(this);
        }

        View btnDigitSure2 = contentView.findViewById(R.id.digitbtnsure2);
        if (btnDigitSure2 != null) {
            btnDigitSure2.setOnClickListener(this);
        }

        // 如果不等于-1表示当前的键盘是全键盘
        if (keyBoradType != -1) {
            LetterKeyBoardFirstLineContainer llLine1 = (LetterKeyBoardFirstLineContainer) contentView.findViewById(R.id.ll_line0);

            LetterKeyBoardNormalLineContainer llLine2 = (LetterKeyBoardNormalLineContainer) contentView.findViewById(R.id.ll_line1);
            LetterKeyBoardNormalLineContainer llLine3 = (LetterKeyBoardNormalLineContainer) contentView.findViewById(R.id.ll_line2);

            llLine1.addLine(llLine2);
            llLine1.addLine(llLine3);

            contentView.findViewById(R.id.linear_btn0).setOnClickListener(this);
            contentView.findViewById(R.id.linear_btnpoint).setOnClickListener(this);
            contentView.findViewById(R.id.btnABC).setOnClickListener(this);
            contentView.findViewById(R.id.btnsignABC).setOnClickListener(this);

            btnq = (Button) contentView.findViewById(R.id.btnq);
            btnw = (Button) contentView.findViewById(R.id.btnw);
            btne = (Button) contentView.findViewById(R.id.btne);
            btnr = (Button) contentView.findViewById(R.id.btnr);
            btnt = (Button) contentView.findViewById(R.id.btnt);
            btny = (Button) contentView.findViewById(R.id.btny);
            btnu = (Button) contentView.findViewById(R.id.btnu);
            btni = (Button) contentView.findViewById(R.id.btni);
            btno = (Button) contentView.findViewById(R.id.btno);
            btnp = (Button) contentView.findViewById(R.id.btnp);

            btna = (Button) contentView.findViewById(R.id.btna);
            btns = (Button) contentView.findViewById(R.id.btns);
            btnd = (Button) contentView.findViewById(R.id.btnd);
            btnf = (Button) contentView.findViewById(R.id.btnf);
            btng = (Button) contentView.findViewById(R.id.btng);
            btnh = (Button) contentView.findViewById(R.id.btnh);
            btnj = (Button) contentView.findViewById(R.id.btnj);
            btnk = (Button) contentView.findViewById(R.id.btnk);
            btnl = (Button) contentView.findViewById(R.id.btnl);

            btnz = (Button) contentView.findViewById(R.id.btnz);
            btnx = (Button) contentView.findViewById(R.id.btnx);
            btnc = (Button) contentView.findViewById(R.id.btnc);
            btnv = (Button) contentView.findViewById(R.id.btnv);
            btnb = (Button) contentView.findViewById(R.id.btnb);
            btnn = (Button) contentView.findViewById(R.id.btnn);
            btnm = (Button) contentView.findViewById(R.id.btnm);

            contentView.findViewById(R.id.linearshift).setOnClickListener(this);

            contentView.findViewById(R.id.btn123).setOnClickListener(this);
            contentView.findViewById(R.id.btnSign123).setOnClickListener(this);

            contentView.findViewById(R.id.linearSwiChar).setOnClickListener(this);
            contentView.findViewById(R.id.btnSignSwiChar).setOnClickListener(this);

            contentView.findViewById(R.id.btnsure).setOnClickListener(this);
            contentView.findViewById(R.id.digitbtnsure1).setOnClickListener(this);
            contentView.findViewById(R.id.digitbtnsure2).setOnClickListener(this);
            contentView.findViewById(R.id.btsignnsure).setOnClickListener(this);

            contentView.findViewById(R.id.linearspace).setOnClickListener(this);

            btnViewList.add(btnq);
            btnViewList.add(btnw);
            btnViewList.add(btne);
            btnViewList.add(btnr);
            btnViewList.add(btnt);
            btnViewList.add(btny);
            btnViewList.add(btnu);
            btnViewList.add(btni);
            btnViewList.add(btno);
            btnViewList.add(btnp);
            btnViewList.add(btna);
            btnViewList.add(btns);
            btnViewList.add(btnd);
            btnViewList.add(btnf);
            btnViewList.add(btng);
            btnViewList.add(btnh);
            btnViewList.add(btnj);
            btnViewList.add(btnk);
            btnViewList.add(btnl);
            btnViewList.add(btnz);
            btnViewList.add(btnx);
            btnViewList.add(btnc);
            btnViewList.add(btnv);
            btnViewList.add(btnb);
            btnViewList.add(btnn);
            btnViewList.add(btnm);

            LinearLayout linearcharDel = (LinearLayout) contentView.findViewById(R.id.linearchardel);
            linearcharDel.setOnClickListener(this);
            linearcharDel.setOnTouchListener(new OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    onTouchEventDispatch(v, event);
                    return false;
                }
            });

            contentView.findViewById(R.id.lt).setOnClickListener(this);
            contentView.findViewById(R.id.gt).setOnClickListener(this);

            contentView.findViewById(R.id.leftbracket).setOnClickListener(this);
            contentView.findViewById(R.id.rightbracket).setOnClickListener(this);
            contentView.findViewById(R.id.leftbracketshift).setOnClickListener(this);
            contentView.findViewById(R.id.rightbracketshift).setOnClickListener(this);
            contentView.findViewById(R.id.backslash).setOnClickListener(this);
            contentView.findViewById(R.id.backslashshift).setOnClickListener(this);

            contentView.findViewById(R.id.comma).setOnClickListener(this);
            contentView.findViewById(R.id.period).setOnClickListener(this);
            contentView.findViewById(R.id.slashshift).setOnClickListener(this);
            contentView.findViewById(R.id.exclamationmark).setOnClickListener(this);
            contentView.findViewById(R.id.semicolonshift).setOnClickListener(this);
            contentView.findViewById(R.id.semicolon).setOnClickListener(this);
            contentView.findViewById(R.id.at).setOnClickListener(this);
            contentView.findViewById(R.id.signat).setOnClickListener(this);
            contentView.findViewById(R.id.graveshift).setOnClickListener(this);
            contentView.findViewById(R.id.bottomline).setOnClickListener(this);
            contentView.findViewById(R.id.middleline).setOnClickListener(this);
            contentView.findViewById(R.id.quot).setOnClickListener(this);
            contentView.findViewById(R.id.apos).setOnClickListener(this);
            contentView.findViewById(R.id.slash).setOnClickListener(this);
            contentView.findViewById(R.id.pound).setOnClickListener(this);
            contentView.findViewById(R.id.star).setOnClickListener(this);
            contentView.findViewById(R.id.plus).setOnClickListener(this);

            contentView.findViewById(R.id.sleftbracket).setOnClickListener(this);
            contentView.findViewById(R.id.srightbracket).setOnClickListener(this);
            contentView.findViewById(R.id.dol).setOnClickListener(this);
            contentView.findViewById(R.id.equals).setOnClickListener(this);
            contentView.findViewById(R.id.with).setOnClickListener(this);
            contentView.findViewById(R.id.remainder).setOnClickListener(this);
            contentView.findViewById(R.id.topsharp).setOnClickListener(this);
            contentView.findViewById(R.id.grave).setOnClickListener(this);

            keyboardDot = (ImageView) contentView.findViewById(R.id.keyboard_dot);
            keyboardShift = (ImageView) contentView.findViewById(R.id.keyboard_shift);
        }
    }

    public int getKeyBoradType() {
        return keyBoradType;
    }

    public void setKeyBoradType(int keyBoradType) {
        this.keyBoradType = keyBoradType;
    }

    public void setBtnpoint(Button btnpoint) {
        this.btnpoint = btnpoint;
    }

    public Button getBtnpoint() {
        return btnpoint;
    }

    private List btnViewList;

    private OnTouchListener keyTouchListener = new OnTouchListener() {
        private View preView;

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            if (keyBoradType != 2) {
                return false;
            }
            if (preView != null && event.getAction() == MotionEvent.ACTION_UP) {
                //preView.setBackgroundResource(R.drawable.keyboard_btn_c);
                preView.setBackgroundResource(R.drawable.paf_keyboard_btn_general_up);
                KeyBoardView.this.onTouch(preView, event);
                preView = null;
                return true;
            }
            int[] location = new int[2];
            int gx = (int) event.getX();
            int gy = (int) event.getY();
            for (View view : btnViewList) {
                view.getLocationInWindow(location);
                int top = location[1];
                int buttom = top + view.getHeight();
                int left = location[0];
                int right = left + view.getWidth();
                if (gx > left && gy > top && gx < right && gy < buttom) {
                    if (preView == null) {
                        preView = view;
                        //preView.setBackgroundResource(R.drawable.keyboard_btn_c);
                        preView.setBackgroundResource(R.drawable.paf_keyboard_btn_general_down);
                    } else if (preView != view) {
                        //preView.setBackgroundResource(R.drawable.keyboard_btn);
                        preView.setBackgroundResource(R.drawable.paf_keyboard_btn_general_up);
                        preView = view;
                        //preView.setBackgroundResource(R.drawable.keyboard_btn_c);
                        preView.setBackgroundResource(R.drawable.paf_keyboard_btn_general_down);
                    }
                    return KeyBoardView.this.onTouch(view, event);
                }
            }
            return false;
        }
    };

    private void onTouchEventDispatch(View v, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                isDelPress = true;
                new Thread(new DeleteTask()).start();
                linearDelWidth = v.getWidth();
                linearDelHeight = v.getHeight();
                break;
            case MotionEvent.ACTION_MOVE:
                if (event.getX() < 0 || event.getY() < 0
                        || event.getX() > linearDelWidth
                        || event.getY() > linearDelHeight) {
                    isDelPress = false;
                }
                break;
            case MotionEvent.ACTION_UP:
                isDelPress = false;
                break;
            default:
                break;
        }
    }

    @Override
    public void onClick(View v) {
        int id = v.getId();
        if (id == R.id.btn1) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(
                        KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_1));
            }
        } else if (id == R.id.btn2) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(
                        KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_2));
            }
        } else if (id == R.id.btn3) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(
                        KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_3));
            }
        } else if (id == R.id.btn4) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(
                        KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_4));
            }
        } else if (id == R.id.btn5) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(
                        KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_5));
            }
        } else if (id == R.id.btn6) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(
                        KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_6));
            }
        } else if (id == R.id.btn7) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(
                        KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_7));
            }
        } else if (id == R.id.btn8) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(
                        KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_8));
            }
        } else if (id == R.id.btn9) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(
                        KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_9));
            }
        } else if (id == R.id.btn0) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(
                        KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_0));
            }
        } else if (id == R.id.btnpoint) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(
                        KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_PERIOD));
            }
        } else if (id == R.id.btn123 || id == R.id.btnSign123) {
            //变更键盘
            if (onSwitchKeyBoardListenter != null) {
                onSwitchKeyBoardListenter.onSwitchKeyBoard(1);
            }
            //如果目前键盘是大写    就切换成小写
            if (letterTag == 1) {
                keyboardShift.setBackgroundResource(R.drawable.paf_keyboard_shift_no);
                keyboardDot.setBackgroundResource(R.drawable.paf_keyboard_white_dot);
                updateLetterKeyBoard(letterTag);
                letterTag = 0;
                clickTimes = 0;
            }
        } else if (id == R.id.linearSwiChar || id == R.id.btnSignSwiChar) {
            //特殊字符键盘切换
            if (onSwitchKeyBoardListenter != null) {
                onSwitchKeyBoardListenter.onSwitchKeyBoard(3);
            }
            //如果目前键盘是大写    就切换成小写
            if (letterTag == 1) {
                keyboardShift.setBackgroundResource(R.drawable.paf_keyboard_shift_no);
                keyboardDot.setBackgroundResource(R.drawable.paf_keyboard_white_dot);
                updateLetterKeyBoard(letterTag);
                letterTag = 0;
                clickTimes = 0;
            }
        } else if (id == R.id.btnABC || id == R.id.btnsignABC) {
            if (onSwitchKeyBoardListenter != null) {
                onSwitchKeyBoardListenter.onSwitchKeyBoard(2);
            }
            if (letterTag == 1) {
                updateLetterKeyBoard(letterTag);
                letterTag = 0;
            }
        } else if (id == R.id.linear_btn0) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_0));
            }
        } else if (id == R.id.linear_btnpoint) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_PERIOD));
            }
        } else if (id == R.id.btnsure || id == R.id.digitbtnsure1 || id == R.id.digitbtnsure2 || id == R.id.btsignnsure) {
            if (onKeySureBtnListener != null) {
                onKeySureBtnListener.onKeySureBtn();
            }
        } else if (id == R.id.linearspace) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_SPACE));
            }
        } else if (id == R.id.linearshift) {
            clickTimes++;
            if (onKeyDownBtnListener != null) {
                //切换成一次性大写
                if (clickTimes == 1) {
                    if (letterTag == 0) {
                        keyboardShift.setBackgroundResource(R.drawable.paf_keyboard_shift);
                        updateLetterKeyBoard(letterTag);
                        letterTag = 1;
                    }
                }
                //切换成永久性大写
                else if (clickTimes == 2) {
                    keyboardDot.setBackgroundResource(R.drawable.paf_keyboard_blue_dot);
                }
                //切换成小写
                else if (clickTimes == 3) {
                    keyboardShift.setBackgroundResource(R.drawable.paf_keyboard_shift_no);
                    keyboardDot.setBackgroundResource(R.drawable.paf_keyboard_white_dot);
                    clickTimes = 0;
                    updateLetterKeyBoard(letterTag);
                    letterTag = 0;
                }
            }
        } else if (id == R.id.lt) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(SystemClock.uptimeMillis(), "<", KeyCharacterMap.BUILT_IN_KEYBOARD, 0));
            }
        } else if (id == R.id.gt) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(SystemClock.uptimeMillis(), ">", KeyCharacterMap.BUILT_IN_KEYBOARD, 0));
            }
        } else if (id == R.id.leftbracket) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_LEFT_BRACKET));
            }
        } else if (id == R.id.rightbracket) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_RIGHT_BRACKET));
            }
        } else if (id == R.id.leftbracketshift) {
            if (onKeyDownBtnListener != null) {
                onCapitalKeyDownBtn(KeyEvent.KEYCODE_LEFT_BRACKET);
            }
        } else if (id == R.id.rightbracketshift) {
            if (onKeyDownBtnListener != null) {
                onCapitalKeyDownBtn(KeyEvent.KEYCODE_RIGHT_BRACKET);
            }
        } else if (id == R.id.backslash) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_BACKSLASH));
            }
        } else if (id == R.id.backslashshift) {
            if (onKeyDownBtnListener != null) {
                onCapitalKeyDownBtn(KeyEvent.KEYCODE_BACKSLASH);
            }
        } else if (id == R.id.sleftbracket) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(SystemClock.uptimeMillis(), "(", KeyCharacterMap.BUILT_IN_KEYBOARD, 0));
            }
        } else if (id == R.id.srightbracket) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(SystemClock.uptimeMillis(), ")", KeyCharacterMap.BUILT_IN_KEYBOARD, 0));
            }
        } else if (id == R.id.dol) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(SystemClock.uptimeMillis(), "$", KeyCharacterMap.BUILT_IN_KEYBOARD, 0));
            }
        } else if (id == R.id.equals) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(
                        KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_EQUALS));
            }
        } else if (id == R.id.with) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(SystemClock.uptimeMillis(), "&", KeyCharacterMap.BUILT_IN_KEYBOARD, 0));
            }
        } else if (id == R.id.remainder) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(SystemClock.uptimeMillis(), "%", KeyCharacterMap.BUILT_IN_KEYBOARD, 0));
            }
        } else if (id == R.id.topsharp) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(SystemClock.uptimeMillis(), "^", KeyCharacterMap.BUILT_IN_KEYBOARD, 0));
            }
        } else if (id == R.id.grave) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(
                        KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_GRAVE));
            }
        } else if (id == R.id.comma) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(
                        KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_COMMA));
            }
        } else if (id == R.id.period) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(
                        KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_PERIOD));
            }
        } else if (id == R.id.slashshift) {
            if (onKeyDownBtnListener != null) {
                onCapitalKeyDownBtn(KeyEvent.KEYCODE_SLASH);
            }
        } else if (id == R.id.exclamationmark) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(SystemClock.uptimeMillis(), "!", KeyCharacterMap.BUILT_IN_KEYBOARD, 0));
            }
        } else if (id == R.id.semicolonshift) {
            if (onKeyDownBtnListener != null) {
                onCapitalKeyDownBtn(KeyEvent.KEYCODE_SEMICOLON);
            }
        } else if (id == R.id.semicolon) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(
                        KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_SEMICOLON));
            }
        } else if (id == R.id.at || id == R.id.signat) {
            if (onKeyDownBtnListener != null) {

                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(
                        KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_AT));
            }
        } else if (id == R.id.graveshift) {
            if (onKeyDownBtnListener != null) {
                onCapitalKeyDownBtn(KeyEvent.KEYCODE_GRAVE);
            }
        } else if (id == R.id.bottomline) {
            if (onKeyDownBtnListener != null) {
                onCapitalKeyDownBtn(KeyEvent.KEYCODE_MINUS);
            }
        } else if (id == R.id.middleline) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(
                        KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_MINUS));
            }
        } else if (id == R.id.quot) {
            if (onKeyDownBtnListener != null) {
                onCapitalKeyDownBtn(KeyEvent.KEYCODE_APOSTROPHE);
            }
        } else if (id == R.id.apos) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(
                        KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_APOSTROPHE));
            }
        } else if (id == R.id.slash) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(
                        KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_SLASH));
            }
        } else if (id == R.id.pound) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(
                        KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_POUND));
            }
        } else if (id == R.id.star) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(
                        KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_STAR));
            }
        } else if (id == R.id.plus) {
            if (onKeyDownBtnListener != null) {
                onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(
                        KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_PLUS));
            }
        } else {
        }
    }

    private View mParent;

    @Override
    public void showAtLocation(View parent, int gravity, int x, int y) {
        try {
            super.showAtLocation(parent, gravity, x, y);
            mParent = parent;
            if (mKeyboardShowListener != null) {
                mKeyboardShowListener.onShow(this.context.getResources()
                        .getDimensionPixelSize(R.dimen.keyboard_max_height));
            }
        } catch (Exception ignored) {
        }
    }

    private void sendKeyEvent(int keyEvent, View view, MotionEvent event) {
        Button btn = (Button) view;
        if (event.getAction() == MotionEvent.ACTION_DOWN || event.getAction() == MotionEvent.ACTION_MOVE) {
            int location[] = new int[2];
            view.getLocationOnScreen(location);
            TextView keyTextView = popKeyView.getTextView();
            int x = getActualSize(this.context, 17);
            int y = getActualSize(this.context, 65);

            if (popKeyView.isShowing()) {
                if (keyTextView.getText().equals(btn.getText())) {
                    return;
                }

                popKeyView.update(location[0] - x, location[1] - y, -1, -1);
            } else {
                popKeyView.showAtLocation(mParent, Gravity.TOP | Gravity.LEFT, location[0] - x, location[1] - y);
            }

            keyTextView.setText(btn.getText());

        } else if (event.getAction() == MotionEvent.ACTION_UP) {
            if (onKeyDownBtnListener != null) {
                //如果是大写
                if (letterTag == 1) {
                    onCapitalKeyDownBtn(keyEvent);
                    //如果单击那么大写只是一次性的,点击完大写之后,界面变成小写界面,标志变量回复
                    if (clickTimes == 1) {
                        keyboardShift.setBackgroundResource(R.drawable.paf_keyboard_shift_no);
                        updateLetterKeyBoard(letterTag);
                        letterTag = 0;
                        clickTimes = 0;
                    } else if (clickTimes == 2) {//如果是双击

                    }
                }
                //如果是小写
                else if (letterTag == 0) {
                    onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(KeyEvent.ACTION_DOWN, keyEvent));
                }
            }
            if (popKeyView.isShowing()) {
                popKeyView.dismiss();
            }
        }
    }

    private void updateLetterKeyBoard(int letterTag) {
        //如果是小写的话就切换成大写
        if (letterTag == 0) {
            btnq.setText("Q");
            btnw.setText("W");
            btne.setText("E");
            btnr.setText("R");
            btnt.setText("T");
            btny.setText("Y");
            btnu.setText("U");
            btni.setText("I");
            btno.setText("O");
            btnp.setText("P");

            btna.setText("A");
            btns.setText("S");
            btnd.setText("D");
            btnf.setText("F");
            btng.setText("G");
            btnh.setText("H");
            btnj.setText("J");
            btnk.setText("K");
            btnl.setText("L");

            btnz.setText("Z");
            btnx.setText("X");
            btnc.setText("C");
            btnv.setText("V");
            btnb.setText("B");
            btnn.setText("N");
            btnm.setText("M");
        }
        //如果是大写的话九切换成小写
        else if (letterTag == 1) {
            btnq.setText("q");
            btnw.setText("w");
            btne.setText("e");
            btnr.setText("r");
            btnt.setText("t");
            btny.setText("y");
            btnu.setText("u");
            btni.setText("i");
            btno.setText("o");
            btnp.setText("p");

            btna.setText("a");
            btns.setText("s");
            btnd.setText("d");
            btnf.setText("f");
            btng.setText("g");
            btnh.setText("h");
            btnj.setText("j");
            btnk.setText("k");
            btnl.setText("l");

            btnz.setText("z");
            btnx.setText("x");
            btnc.setText("c");
            btnv.setText("v");
            btnb.setText("b");
            btnn.setText("n");
            btnm.setText("m");
        }
    }

    /**
     * event按下监听器
     *
     * @author EX-XUJIAO001
     * @version [Android PABank C01, 2012-2-15]
     */
    public interface OnKeyDownBtnListener {
        void onKeyDownBtn(KeyEvent event);
    }

    public void setOnKeyDownBtnListener(OnKeyDownBtnListener onKeyDownBtnListener) {
        this.onKeyDownBtnListener = onKeyDownBtnListener;
    }

    public interface OnSwitchKeyBoardListenter {
        void onSwitchKeyBoard(int keyBoardType);
    }

    private OnSwitchKeyBoardListenter onSwitchKeyBoardListenter;

    public void setOnSwitchKeyBoardListenter(
            OnSwitchKeyBoardListenter onSwitchKeyBoardListenter) {
        this.onSwitchKeyBoardListenter = onSwitchKeyBoardListenter;
    }

    public interface OnKeySureBtnListener {
        void onKeySureBtn();
    }

    private OnKeySureBtnListener onKeySureBtnListener;

    public void setOnKeySureBtnListener(OnKeySureBtnListener onKeySureBtnListener) {
        this.onKeySureBtnListener = onKeySureBtnListener;
    }

    @Override
    public void dismiss() {
        try {
            if (popKeyView.isShowing()) {
                popKeyView.dismiss();
            }
            super.dismiss();
        } catch (Exception e) {
            Log.e("KeyboardView", "dismiss exception:" + e.getMessage());
        }
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int id = v.getId();
        if (id == R.id.btnq) {
            sendKeyEvent(KeyEvent.KEYCODE_Q, v, event);
        } else if (id == R.id.btnw) {
            sendKeyEvent(KeyEvent.KEYCODE_W, v, event);
        } else if (id == R.id.btne) {
            sendKeyEvent(KeyEvent.KEYCODE_E, v, event);
        } else if (id == R.id.btnr) {
            sendKeyEvent(KeyEvent.KEYCODE_R, v, event);
        } else if (id == R.id.btnt) {
            sendKeyEvent(KeyEvent.KEYCODE_T, v, event);
        } else if (id == R.id.btny) {
            sendKeyEvent(KeyEvent.KEYCODE_Y, v, event);
        } else if (id == R.id.btnu) {
            sendKeyEvent(KeyEvent.KEYCODE_U, v, event);
        } else if (id == R.id.btni) {
            sendKeyEvent(KeyEvent.KEYCODE_I, v, event);
        } else if (id == R.id.btno) {
            sendKeyEvent(KeyEvent.KEYCODE_O, v, event);
        } else if (id == R.id.btnp) {
            sendKeyEvent(KeyEvent.KEYCODE_P, v, event);
        } else if (id == R.id.btna) {
            sendKeyEvent(KeyEvent.KEYCODE_A, v, event);
        } else if (id == R.id.btns) {
            sendKeyEvent(KeyEvent.KEYCODE_S, v, event);
        } else if (id == R.id.btnd) {
            sendKeyEvent(KeyEvent.KEYCODE_D, v, event);
        } else if (id == R.id.btnf) {
            sendKeyEvent(KeyEvent.KEYCODE_F, v, event);
        } else if (id == R.id.btng) {
            sendKeyEvent(KeyEvent.KEYCODE_G, v, event);
        } else if (id == R.id.btnh) {
            sendKeyEvent(KeyEvent.KEYCODE_H, v, event);
        } else if (id == R.id.btnj) {
            sendKeyEvent(KeyEvent.KEYCODE_J, v, event);
        } else if (id == R.id.btnk) {
            sendKeyEvent(KeyEvent.KEYCODE_K, v, event);
        } else if (id == R.id.btnl) {
            sendKeyEvent(KeyEvent.KEYCODE_L, v, event);
        } else if (id == R.id.btnz) {
            sendKeyEvent(KeyEvent.KEYCODE_Z, v, event);
        } else if (id == R.id.btnx) {
            sendKeyEvent(KeyEvent.KEYCODE_X, v, event);
        } else if (id == R.id.btnc) {
            sendKeyEvent(KeyEvent.KEYCODE_C, v, event);
        } else if (id == R.id.btnv) {
            sendKeyEvent(KeyEvent.KEYCODE_V, v, event);
        } else if (id == R.id.btnb) {
            sendKeyEvent(KeyEvent.KEYCODE_B, v, event);
        } else if (id == R.id.btnn) {
            sendKeyEvent(KeyEvent.KEYCODE_N, v, event);
        } else if (id == R.id.btnm) {
            sendKeyEvent(KeyEvent.KEYCODE_M, v, event);
        } else {
            return false;
        }
        return true;
    }

    /**
     * 长按删除按钮
     *
     * @author EX-XIAOFANQING001
     */
    class DeleteTask implements Runnable {
        private boolean isFirstAction = true;

        @Override
        public void run() {
            while (true) {
                if (!isDelPress) {
                    break;
                }
                handler.sendEmptyMessage(SENDEVENT);
                try {
                    if (isFirstAction) {
                        Thread.sleep(FIRST_DELETE_DELAYED_TIME);
                        isFirstAction = false;
                    } else {
                        Thread.sleep(SECOND_DELETE_DELAYED_TIME);
                    }

                } catch (InterruptedException e) {
                    // ignore
                }
            }
        }
    }

    private Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            switch (msg.what) {
                case SENDEVENT:
                    if (onKeyDownBtnListener != null) {
                        onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(
                                KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DEL));
                    }
                    break;
                default:
                    break;
            }
        }

        ;
    };

    public interface OnSwitchCharKeyBoardListener {
        void onSwitchCharKeyBoard(int charKeyBoardType);
    }

    public interface OnKeyboardShowListener {
        void onShow(int keyboardHeight);
    }

    public interface OnkeyboardDismissListener extends OnDismissListener {

    }

    public void setEditText(EditText editText) {
        this.editText = editText;
    }

    public EditText getEditText() {
        return editText;
    }

    public void setOnKeyboardShowListener(OnKeyboardShowListener listener) {
        mKeyboardShowListener = listener;
    }

    public static boolean hasKitKat() {
        return Build.VERSION.SDK_INT >= 19;
    }


    /**
     * shift组合键输入大写字母或特殊字符
     *
     * @param keyCode
     */
    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    private void onCapitalKeyDownBtn(int keyCode) {
        if (hasKitKat()) {
            onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(SystemClock
                    .uptimeMillis(), SystemClock.uptimeMillis(),
                    KeyEvent.ACTION_DOWN, keyCode, 0, KeyEvent.META_SHIFT_ON,
                    KeyCharacterMap.VIRTUAL_KEYBOARD, KeyEvent.KEYCODE_A,
                    KeyEvent.FLAG_FROM_SYSTEM, InputDevice.SOURCE_KEYBOARD));
        } else {
            onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(
                    KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_SHIFT_LEFT));
            onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(
                    KeyEvent.ACTION_DOWN, keyCode));
            onKeyDownBtnListener.onKeyDownBtn(new KeyEvent(KeyEvent.ACTION_UP,
                    KeyEvent.KEYCODE_SHIFT_LEFT));
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy