EditText(第2章)-对hint进行整容

作者: 积木Blocks | 来源:发表于2016-06-19 22:12 被阅读835次

    2.如何改变hint的文字大小



    基于上次手术的成功,信心大增,开始下一刀改变文字的大小:

    技术支持:

    android:textSize="24sp"//设置文字大小
    

    术后效果:

    手术结果:

    失败!将text的文字大小也同时改变了(就像一个妹子想来隆个鼻子,然后你顺带把她脸给隆了,结果自行脑补)


    3.解决hint和text的文字大小冲突



    上面的手术失败了,于是我去韩国进修了一段时间,带来了最新技术:

    技术支持:

    editText.addTextChangedListener(new TextWatcher() {   
             @Override    
               public void beforeTextChanged(CharSequence s, int start, int count, int after) {       
                  //在文字改变之前        
                   editText.setTextSize(16);    
               }    
             @Override    
             public void onTextChanged(CharSequence s, int start, int before, int count) {        
                  //在文字改变的时候       
                  if (TextUtils.isEmpty(s)) {            
                      editText.setTextSize(16);//这里的单位是sp       
                      }else{            
                       editText.setTextSize(30);        
                     }   
                }   
             @Override   
               public void afterTextChanged(Editable s) {   
               //在文字改变的之后
              }
    });```
    **术后效果:**
    
    ![EditText04.gif](https://img.haomeiwen.com/i1348484/7ab6ce2245414f48.gif?imageMogr2/auto-orient/strip)
    
    **手术结果:**
    **成功!简单粗暴解决了text和hint的冲突**
    
    **原理分析:**
    **利用对输入文字的监听TextWatcher,根据是否输入文字来判断目前显示的是hint还是text,从而动态设置文字的小大。
    注意:在文字改变前也需要设置TextSize并且需要和onTextChanged中“没有文字时候”的大小统一**
    ****
    #### 4.解决hint和text的文字大小冲突方法2
    <br>
    上面已经可以成功解决了问题,可是好不容易去一次“韩国”,我还偷学了另一种技术:
    
    **技术支持:**
    ```java
    // 新建一个可以添加文本的对象
    SpannableString ss = new SpannableString("随便输");
    // 设置文本字体大小
    AbsoluteSizeSpan ass = new AbsoluteSizeSpan(8, true);
    // 将字体大小附加到文本的属性
    ss.setSpan(ass, 0, ss.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    // 设置hint属性 
    editText.setHint(new SpannedString(ss));
    

    手术结果:

    当然是成功的!这里就不贴图了

    特别说明:需要注意的是上面代码中8的单位dp,如果设置为false,那么单位就是px。

    这里提供一个工具类(摘自Android群英传,徐医生的书,强力推荐!)帮你转换成sp:

    public class DisplayUtil {
        /**
         * px转换为dp,保证文字大小不变
         * 
         * @param context
         * @param pxValue
         * @return
         */
        public static int pxTodp(Context context, float pxValue) {
            final float scale = context.getResources().getDisplayMetrics().density;
            return (int) (pxValue / scale + 0.5f);
        }
    
        /**
         * dp转换为px,保证文字大小不变
         * 
         * @param context
         * @param dpValue
         * @return
         */
        public static int dpTopx(Context context, float dpValue) {
            final float scale = context.getResources().getDisplayMetrics().density;
            return (int) (dpValue * scale + 0.5f);
        }
    
        /**
         * px转换为sp,保证文字大小不变
         * 
         * @param context
         * @param pxValue
         * @return
         */
        public static int pxTosp(Context context, float pxValue) {
            final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
            return (int) (pxValue / fontScale + 0.5f);
    
        }
    
        /**
         * sp转换为px,保证文字大小不变
         * 
         * @param context
         * @param spValue
         * @return
         */
        public static int spTopx(Context context, float spValue) {
            final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
            return (int) (spValue * fontScale + 0.5f);
        }
    
        /**
         * dp转换px,保证文字大小不变,系统的util
         * 
         * @param context
         * @param dp
         * @return
         */
        public static int dpTopx(Context context, int dp) {
            return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp,
                    context.getResources().getDisplayMetrics());
        }
    
        /**
         * sp转换px,保证文字大小不变,系统的util
         * 
         * @param context
         * @param dp
         * @return
         */
        public static int spTopx(Context context, int sp) {
            return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, sp,
                    context.getResources().getDisplayMetrics());
        }
    }
    

    使用方法:

    AbsoluteSizeSpan ass = new AbsoluteSizeSpan(DisplayUtil.spTopx(getApplicationContext(),16), false);
    

    5.感谢

    作者:小白james
    文章名称:EditText只改变Hint字体大小
    地址:http://blog.csdn.net/u011747761/article/details/47154897

    作者:徐宜生
    书籍:《Android群英传》
    博客地址:http://blog.csdn.net/eclipsexys

    相关文章

      网友评论

        本文标题:EditText(第2章)-对hint进行整容

        本文链接:https://www.haomeiwen.com/subject/mawbdttx.html