搞定了,原来TextView在onPaint中已经将canvas的坐标按照scrollX进行了偏移,原来的0点坐标必须加上getScrollX才能起作用,更正代码:

解决方案 »

  1.   

    super.onDraw(canvas);

    if(mDrawableLeft == null)
    return;

    canvas.save();
    int comPad = getCompoundDrawablePadding();

    int w = getWidth();
    int h = getHeight(); int pl = getPaddingLeft();
    int pt = getPaddingTop();
    int pr = getPaddingRight();
    int pb = getPaddingBottom();

    Layout layout = getLayout(); //compute left drawable size to fit this view
    int imgW = mDrawableLeft.getIntrinsicWidth();
    int imgH = mDrawableLeft.getIntrinsicHeight(); int validH = h - pt - pb;
    FontMetrics fm = getPaint().getFontMetrics();
    validH = (int)((fm.descent - fm.ascent) * 0.85);
    if(imgH > validH)
    {
    float scale = validH * 1.0f / imgH;
    imgH = validH;
    imgW = (int)(imgW * scale);
    } //draw left icon 
    String text = getText().toString();

    int left = 0;
    int top = ((h - imgH) >> 1);
    int scrollX = getScrollX(); if(text != null && text.length() != 0)
    {
    //when this edit has text in it
    left = (int)(w - layout.getLineWidth(0)) / 2 - imgW;
    left -= comPad;
    }
    else
    {
    //compute icon left of hit text
        CharSequence chs = getHint();
        if(chs != null)
         text = chs.toString(); int textWidth = 0; if(text != null && text.length() != 0)
    {
    TextPaint paint = getPaint();
    textWidth = (int)layout.getDesiredWidth(text, paint);
    } int gravity = getGravity() & Gravity.HORIZONTAL_GRAVITY_MASK;

    if(gravity == Gravity.LEFT)
    {
    left = pl + textWidth + comPad;
    }
    else if(gravity == Gravity.CENTER_HORIZONTAL)
    {
    left = ((w - textWidth) >> 1) + pl - imgW - comPad;
    }
    else
    left = w - textWidth - pr - imgW - comPad;
    }

    if(left >= pl && ((left + imgW) < (w - pr)))
    {
    mDrawableLeft.setBounds(left + scrollX, top, left + scrollX + imgW, top + imgH);
    mDrawableLeft.draw(canvas);
    }

    canvas.restore();
    }