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

首頁 > 系統 > Android > 正文

Android自定義view實現輸入控件

2019-12-12 00:57:02
字體:
來源:轉載
供稿:網友

本文實例為大家分享了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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宜兴市| 青海省| 招远市| 塔城市| 金坛市| 手机| 奉化市| 黄陵县| 天峻县| 扬中市| 江津市| 汉川市| 资源县| 竹溪县| 常山县| 桃园县| 腾冲县| 襄垣县| 玉林市| 彭州市| 澄江县| 磐安县| 潜山县| 呼玛县| 邵武市| 历史| 姜堰市| 乡城县| 文昌市| 永寿县| 双辽市| 云林县| 叙永县| 通州区| 巴彦县| 华容县| 海城市| 曲水县| 响水县| 东海县| 临沭县|