一個高仿閑魚鍵自定義數字鍵盤特效


博客地址:

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)

支持多點觸摸,下拉、上拉各種手勢沖突


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM