国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android自定義view實現輸入控件

2019-10-22 18:11:53
字體:
來源:轉載
供稿:網友

本文實例為大家分享了Android自定義view實現輸入控件的具體代碼,供大家參考,具體內容如下

Android,view,輸入控件

網絡上大部分的輸入控件都是多個EditText組合而成,本例中采用的是:

  • 單個EditText作為輸入的捕捉控件
  • 多個ImageView的子類作為顯示的控件,繪制EditText中的數據

如上圖:

  • 輸入前和輸入后輸入框需要發生響應的改變
  • 點擊自定義控件要彈出軟鍵盤
  • EditText數據捕捉,以及EditView不能操作(如果可以操作,數據處理會混亂)
  • 輸完后會得到相應的提示
  • ImageView的子類可以設置寬高,字體大小顏色,以及兩個View之間的間隔

那么代碼走起:

首先是ImageView的子類TextImageView,onDraw的實現也很簡單,就是判斷text是否長度大于0,如果大于0則繪制文字,還有一些細節處理就是設置字體顏色,字體大寫,獲取字體的寬高

@Override protected void onDraw(Canvas canvas) {    if (text.length() > 0) {      if (isDrawSrc) {        super.onDraw(canvas);      }      canvas.drawText(text, 0, text.length(), (getMeasuredWidth() - textWidth) / 2, (getMeasuredHeight() + dy) / 2, textPaint);    } else {      super.onDraw(canvas);  }}

其次PasswordView是一個自定義ViewGroup,引入了一個布局,布局中就是一個EditText(數據捕捉)和一個Linearlayout(代碼添加TextImageView)。EditText的寬高是1dp和0dp(避免用戶可以操作EditText);給Linearlayout設置divider屬性(兩個TextImageView的間隔)

PasswordView的核心代碼如下:

- 代碼控制EditView獲取輸入

public void requestEtFocus() {    catchInput.setFocusable(true);    catchInput.setFocusableInTouchMode(true);    catchInput.setClickable(true);    catchInput.requestFocus();    showSoftKeyboard(catchInput);    catchInput.setCursorVisible(false);    catchInput.setSelection(catchInput.length());}
// 動態添加TextImageView   for (int i = 0; i < passwordLength; i++) {      TextImageView view = new TextImageView(context);      view.setTextSize(textSize);      view.setTextColor(textColor);      content.addView(view);      if (unInputBg != 0) {        view.setBackgroundResource(unInputBg);// 設置未輸入前的背景      }      LinearLayout.LayoutParams params = new LinearLayout.LayoutParams((int) itemWidth, (int) itemHeight);      if (i == 0) {        params.setMargins((int) dpToPixel(1), 0, 0, 0);      }      if (i == passwordLength - 1) {        params.setMargins(0, 0, (int) dpToPixel(1), 0);      }      view.setLayoutParams(params);      views[i] = view;      // 分割字體,給TextIamgeView繪制文字      if (text != null && i < text.length()) {        setItemText(text.subSequence(i, i + 1));      }    }    // 輸入監聽    catchInput.addTextChangedListener(new TextWatcher() {      @Override      public void beforeTextChanged(CharSequence s, int start, int count, int after) {      }      @Override      public void onTextChanged(CharSequence s, int start, int before, int count) {        if (s.length() > 0) {          // index:成員變量;保存當前的輸入了幾個字符          if (index > s.length()) {            removeItemText();// 刪除          } else {            setText(s);            if (s.length() == passwordLength) {              if (listener != null) {                // 輸入完成回調                listener.onInputCodeEnd(s);              }            }          }        } else if (s.length() == 0 && index > 0) {          removeItemText();        }      }   @Override   public void afterTextChanged(Editable s) {  }});

實現比較簡單,大多都是一些細節處理,具體看源碼:PasswordView

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 吴桥县| 金昌市| 泽州县| 阳原县| 布尔津县| 孝感市| 页游| 台山市| 古浪县| 塔河县| 仪陇县| 泊头市| 南安市| 文昌市| 克东县| 德清县| 穆棱市| 罗城| 银川市| 读书| 北安市| 德格县| 茌平县| 镇原县| 江都市| 荥经县| 石泉县| 崇明县| 资中县| 涟水县| 平潭县| 绍兴县| 宁海县| 城口县| 遂宁市| 永济市| 西畴县| 四平市| 盐边县| 揭阳市| 泰州市|