webentwicklung-frage-antwort-db.com.de

Wie kann ich drawableLeft in Android TextView zentrieren?

In TextView stelle ich drawableLeft ein, wo die drawable vom Mittelpunkt angezeigt wird. Ich muss die drawableLeft mit der Oberseite von TextView wie diesem Bild ausrichten. 

enter image description here

Kann man das erreichen?

27

Siehe meine Antwort hier .

Sie können ein Zeichnen von Zeichnungsobjekten nach oben (oder nach unten) ausrichten, indem Sie ein benutzerdefiniertes Zeichnungsobjekt erstellen, das Ihr Zeichnungsobjekt umschließt, und anschließend die Zeichnung Ihres benutzerdefinierten Zeichnungsobjekts bearbeiten, indem Sie die Methode onDraw(Canvas) überschreiben.

Das folgende Beispiel ist das einfachste mögliche Beispiel. Dadurch wird das Bild nach oben ausgerichtet. Sie können es jedoch auch nach unten, links oder rechts von TextView ausrichten, indem Sie die erforderliche Logik in der onDraw(Canvas)- -Methode implementieren. Möglicherweise möchten Sie auch einen Rand in onDraw(Canvas) einbauen, um Ihre Designimplementierung perfekt zu machen.

Verwendungsbeispiel:

GravityCompoundDrawable gravityDrawable = new GravityCompoundDrawable(innerDrawable);
// NOTE: next 2 lines are important!
innerDrawable.setBounds(0, 0, innerDrawable.getIntrinsicWidth(), innerDrawable.getIntrinsicHeight());
gravityDrawable.setBounds(0, 0, innerDrawable.getIntrinsicWidth(), innerDrawable.getIntrinsicHeight());
mTextView.setCompoundDrawables(gravityDrawable, null, null, null);

Beispielcode:

public class GravityCompoundDrawable extends Drawable {

    // inner Drawable
    private final Drawable mDrawable;

    public GravityCompoundDrawable(Drawable drawable) {
        mDrawable = drawable;
    }

    @Override
    public int getIntrinsicWidth() {
        return mDrawable.getIntrinsicWidth();
    }

    @Override
    public int getIntrinsicHeight() {
        return mDrawable.getIntrinsicHeight();
    }

    @Override
    public void draw(Canvas canvas) {
        int halfCanvas= canvas.getHeight() / 2;
        int halfDrawable = mDrawable.getIntrinsicHeight() / 2;

        // align to top
        canvas.save();
        canvas.translate(0, -halfCanvas + halfDrawable);
        mDrawable.draw(canvas);
        canvas.restore();
    }
}
6
Reinier

Verwenden Sie dazu SpannableString und ImageSpan.

String msg=" "+"haii";
ImageSpan mImageSpan== new ImageSpan(mContext, R.drawable.icon);
SpannableString text = new SpannableString(msg);
text.setSpan(mImageSpan, 0, 1, 0);
mTextView.setText(text);

der zusätzliche Platz in der String-Variablen wird durch das Symbol ersetzt.

4
Rahul M Mohan

Ich denke, es ist noch einfacher als alle obigen Antworten: Sie müssen nur Folgendes tun:

public class TopGravityDrawable extends BitmapDrawable {

    public TopGravityDrawable(Resources res, Bitmap bitmap) {
        super(res, bitmap);
    }

    @Override
    public void draw(Canvas canvas) {
        int halfCanvas = canvas.getHeight() / 2;
        int halfDrawable = getIntrinsicHeight() / 2;
        canvas.save();
        canvas.translate(0, -halfCanvas + halfDrawable);
        super.draw(canvas);
        canvas.restore();
    }
}

Und dann

 final Bitmap bitmap = BitmapFactory.decodeResource(mTitle.getResources(), R.drawable.icon);
 icon = new TopGravityDrawable(mTitle.getResources(), bitmap);
 title.setCompoundDrawablesWithIntrinsicBounds(null, null, null, icon);

Denken Sie daran, dass dies nur mitLEFTundRIGHTcompound drawables funktioniert 

4
cesards

Wenn Sie eine reine XML-Lösung wünschen, können Sie einen Zeichnungssatz verwenden, um den gewünschten Zeichnungspunkt neu zu positionieren.

<?xml version="1.0" encoding="utf-8"?>
<inset
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:drawable="@drawable/actual_image_to_be_shown"
    Android:insetTop="-32dp" />

Abhängig von Ihrem Szenario müssen Sie möglicherweise mit dem Inset-Wert herumspielen. Dann verwenden Sie einfach dieses XML-Zeichenelement in Ihrer Definition von TextView drawableLeft/Start.

1
Andrew Kelly

das kannst du so machen:

public class DrawableTopLeftTextView extends TextView {

    public DrawableTopLeftTextView(Context context) {
        super(context);
    }

    public DrawableTopLeftTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public DrawableTopLeftTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onDraw(Canvas canvas) {

        if (!TextUtils.isEmpty(getText())) {

            Drawable[] drawables = getCompoundDrawables();

            if (drawables != null) {

                Drawable drawableLeft = drawables[0];

                if (drawableLeft != null) {

                    Paint.FontMetricsInt fontMetricsInt = getPaint().getFontMetricsInt();
                    Rect bounds = new Rect();
                    getPaint().getTextBounds((String) getText(), 0, length(), bounds);
                    int textVerticalSpace = Math.round(bounds.top - fontMetricsInt.top);
                    int offset = (getHeight() - drawableLeft.getIntrinsicHeight()) / 2 - textVerticalSpace - getPaddingTop() / 2;
                    drawableLeft.setBounds(0, -offset, drawableLeft.getIntrinsicWidth(), drawableLeft.getIntrinsicHeight() - offset);
                }
            }
        }
        super.onDraw(canvas);
    }
}
0
xzw happy