zoukankan      html  css  js  c++  java
  • 一个高仿闲鱼键自定义数字键盘特效

    博客地址:

    http://www.jianshu.com/p/be68facfc4b8

    仿造android端闲鱼发布选择价格数字键盘,自定义数字键盘

    价格输入测试

    image

    image

    public class MyKeyBoardView extends KeyboardView {
        private Context  mContext;
        private Keyboard mKeyBoard;
    
        public MyKeyBoardView(Context context, AttributeSet attrs) {
            super(context, attrs);
            this.mContext = context;
        }
    
        public MyKeyBoardView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            this.mContext = context;
        }
    
        /**
         * 重新画一些按键
         */
        @Override
        public void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            mKeyBoard = this.getKeyboard();
            List<Key> keys = null;
            if (mKeyBoard != null) {
                keys = mKeyBoard.getKeys();
            }
    
            if (keys != null) {
                for (Key key : keys) {
                    // 数字键盘的处理
                    if (key.codes[0] == -4) {
                        drawKeyBackground(R.drawable.bg_keyboardview_yes, canvas, key);
                        drawText(canvas, key);
                    }
                }
            }
        }
    
        private void drawKeyBackground(int drawableId, Canvas canvas, Key key) {
            Drawable npd = mContext.getResources().getDrawable(
                    drawableId);
            int[] drawableState = key.getCurrentDrawableState();
            if (key.codes[0] != 0) {
                npd.setState(drawableState);
            }
            npd.setBounds(key.x, key.y, key.x + key.width, key.y
                    + key.height);
            npd.draw(canvas);
        }
    
        private void drawText(Canvas canvas, Key key) {
            Rect bounds = new Rect();
            Paint paint = new Paint();
            paint.setTextAlign(Paint.Align.CENTER);
    
    
            paint.setAntiAlias(true);
    
            paint.setColor(Color.WHITE);
            if (key.label != null) {
                String label = key.label.toString();
    
                Field field;
    
                if (label.length() > 1 && key.codes.length < 2) {
                    int labelTextSize = 0;
                    try {
                        field = KeyboardView.class.getDeclaredField("mLabelTextSize");
                        field.setAccessible(true);
                        labelTextSize = (int) field.get(this);
                    } catch (NoSuchFieldException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                    paint.setTextSize(labelTextSize);
                    paint.setTypeface(Typeface.DEFAULT_BOLD);
                } else {
                    int keyTextSize = 0;
                    try {
                        field = KeyboardView.class.getDeclaredField("mLabelTextSize");
                        field.setAccessible(true);
                        keyTextSize = (int) field.get(this);
                    } catch (NoSuchFieldException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                    paint.setTextSize(keyTextSize);
                    paint.setTypeface(Typeface.DEFAULT);
                }
    
                paint.getTextBounds(key.label.toString(), 0, key.label.toString()
                        .length(), bounds);
                canvas.drawText(key.label.toString(), key.x + (key.width / 2),
                        (key.y + key.height / 2) + bounds.height() / 2, paint);
            } else if (key.icon != null) {
                key.icon.setBounds(key.x + (key.width - key.icon.getIntrinsicWidth()) / 2, key.y + (key.height - key.icon.getIntrinsicHeight()) / 2,
                        key.x + (key.width - key.icon.getIntrinsicWidth()) / 2 + key.icon.getIntrinsicWidth(), key.y + (key.height - key.icon.getIntrinsicHeight()) / 2 + key.icon.getIntrinsicHeight());
                key.icon.draw(canvas);
            }
    
        }
    }

    增加随机数字键盘 增加速记数字键盘,用于输入安全级别高的密码输入

    private void randomKeyboardNumber() {
            List<Keyboard.Key> keyList = mKeyboardNumber.getKeys();
            // 查找出0-9的数字键
            List<Keyboard.Key> newkeyList = new ArrayList<Keyboard.Key>();
            for (int i = 0; i < keyList.size(); i++) {
                if (keyList.get(i).label != null
                        && isNumber(keyList.get(i).label.toString())) {
                    newkeyList.add(keyList.get(i));
                }
            }
            // 数组长度
            int count = newkeyList.size();
            // 结果集
            List<KeyModel> resultList = new ArrayList<KeyModel>();
            // 用一个LinkedList作为中介
            LinkedList<KeyModel> temp = new LinkedList<KeyModel>();
            // 初始化temp
            for (int i = 0; i < count; i++) {
                temp.add(new KeyModel(48 + i, i + ""));
            }
            // 取数
            Random rand = new Random();
            for (int i = 0; i < count; i++) {
                int num = rand.nextInt(count - i);
                resultList.add(new KeyModel(temp.get(num).getCode(),
                        temp.get(num).getLable()));
                temp.remove(num);
            }
            for (int i = 0; i < newkeyList.size(); i++) {
                newkeyList.get(i).label = resultList.get(i).getLable();
                newkeyList.get(i).codes[0] = resultList.get(i)
                        .getCode();
            }
    
            mKeyboardView.setKeyboard(mKeyboardNumber);
        }

    最近在调用使用的android系统的api,keyboardview和keyboard

    文本输入

    项目地址:

    https://github.com/xuejinwei/NumberKeyboard

    相信自己,没有做不到的,只有想不到的

    如果你觉得此文对您有所帮助,欢迎入群 QQ交流群 :644196190 微信公众号:终端研发部

    技术+职场

    支持所有的 View(AbsListView、RecyclerView、WebView....View) 和多层嵌套的视图结构

    支持自定义并且已经集成了很多炫酷的 Header 和 Footer

    支持和ListView的同步滚动 和 RecyclerView、AppBarLayout、CoordinatorLayout 的嵌套滚动 NestedScrolling.

    支持在Android Studio Xml 编辑器中预览 效果

    支持分别在 Default(默认)、Xml、JavaCode 三个中设置 Header 和 Footer

    支持自动刷新、自动上拉加载(自动检测列表惯性滚动到底部,而不用手动上拉)

    支持通用的刷新监听器 OnRefreshListener 和更详细的滚动监听 OnMultiPurposeListener

    支持自定义回弹动画的插值器,实现各种炫酷的动画效果.

    支持设置主题来适配任何场景的App,不会出现炫酷但很尴尬的情况.

    支持设置多种滑动方式来适配各种效果的Header和Footer:平移、拉伸、背后固定、顶层固定、全屏

    支持内容尺寸自适应 Content-wrap_content

    支持继承重写和扩展功能,内部实现没有 private 方法和字段,继承之后都可以重写覆盖

    支持越界回弹(Listview、RecyclerView、ScrollView、WebView...View)

    支持多点触摸,下拉、上拉各种手势冲突

  • 相关阅读:
    困勉而行
    6.12
    js 实现表格筛选不请求后台数据
    VUE方法和函数汇总
    sql isnull用法
    js forEach的用法
    js _this.$nextTick 解决页面渲染问题
    element table 复选框单选
    js attr 追加属性
    C# 过滤器 验证页面权限
  • 原文地址:https://www.cnblogs.com/gooder2-android/p/7403997.html
Copyright © 2011-2022 走看看