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.
Kann man das erreichen?
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();
}
}
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.
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
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.
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);
}
}