Android5.1 Dialer digits 大小

来源:互联网 发布:帝国cms内容页调用列表 编辑:程序博客网 时间:2024/05/03 22:31

这里写图片描述
本篇文章记录digits大小修改,也就是上图中红色圈中的字体大小
通过Android-sdk工具Hierarchy view 查看本界面的进程是:
这里写图片描述
打开DialtactsActivity,发现好多代码,这怎么看呢?首先我们一般从onCreate 方法入手,还是有点多怎么办,可以在用Android-sdk工具Hierarchy view查看本页面的布局,从查找对应的id–> dialtacts_container入手:

 if (savedInstanceState == null) {            getFragmentManager().beginTransaction()                    .add(R.id.dialtacts_frame, new ListsFragment(), TAG_FAVORITES_FRAGMENT)                    .add(R.id.dialtacts_container, new DialpadFragment(), TAG_DIALPAD_FRAGMENT)                    .commit();        } else {

DialpadFragment 就是我们要找的
其中它onCreateView中调用了

 final View fragmentView = inflater.inflate(            R.layout.dialpad_fragment, container);        ..... mDialpadView = (DialpadView) fragmentView.findViewById(R.id.dialpad_view);        mDialpadView.setCanDigitsBeEdited(true);        mDigits = mDialpadView.getDigits();        mDigits.setKeyListener(UnicodeDialerKeyListener.INSTANCE);        mDigits.setOnClickListener(this);        mDigits.setOnKeyListener(this);        mDigits.setOnLongClickListener(this);        mDigits.addTextChangedListener(this);        mDigits.setElegantTextHeight(false);

首先我们找到布局文件R.layout.dialpad_fragment 发现里面有
dialpad_view
通过Android.mk 可以发现Dialer关联了其他的一些app
这里写图片描述
PhoneCommon 中就有我们要找的dialpad_view布局文件:
这里写图片描述
其中红色标记就是我们要找的digits大小的修改。

为什么这里用到了两个大小值呢,原来是为了拨号输入过长字体变小,规定了一个最小值。我们来看看具体的实现是怎么样的打开DigitsEditText 源码,发现只有两个事件的实现和一个构造方法,这里并没有我们要找的。
public class DigitsEditText extends ResizingTextEditText {    public DigitsEditText(Context context, AttributeSet attrs) {     ......    }    @Override    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {      ......    }    @Override    public boolean onTouchEvent(MotionEvent event) {       .......}

查看父类ResizingTextEditText

/** * EditText which resizes dynamically with respect to text length. */public class ResizingTextEditText extends EditText {    private final int mOriginalTextSize;    private final int mMinTextSize;    public ResizingTextEditText(Context context, AttributeSet attrs) {        super(context, attrs);        mOriginalTextSize = (int) getTextSize();        TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.ResizingText);        mMinTextSize = (int) a.getDimension(R.styleable.ResizingText_resizing_text_min_size,                mOriginalTextSize);        a.recycle();    }    @Override    protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {        super.onTextChanged(text, start, lengthBefore, lengthAfter);        ViewUtil.resizeText(this, mOriginalTextSize, mMinTextSize);    }    @Override    protected void onSizeChanged(int w, int h, int oldw, int oldh) {        super.onSizeChanged(w, h, oldw, oldh);        ViewUtil.resizeText(this, mOriginalTextSize, mMinTextSize);    }}

我们从注释中就可以明白我们要找的digits大小的变化就在这里通过
ViewUtil.resizeText(this, mOriginalTextSize, mMinTextSize);实现的

 public static void resizeText(TextView textView, int originalTextSize, int minTextSize) {        final Paint paint = textView.getPaint();        final int width = textView.getWidth();        if (width == 0) return;        textView.setTextSize(TypedValue.COMPLEX_UNIT_PX, originalTextSize);        float ratio = width / paint.measureText(textView.getText().toString());        if (ratio <= 1.0f) {            textView.setTextSize(TypedValue.COMPLEX_UNIT_PX,                    Math.max(minTextSize, originalTextSize * ratio));        }    }

通过TextView 的宽度和输入字体的宽度比来进行控制字体大小的变化。哈哈 ,虽然好多类不懂,但是也找到了。

0 0