В TextView
я устанавливаю drawableLeft
, где drawable
показывает из центра. Мне нужно выровнять drawableLeft
с вершиной внутри TextView
, как это изображение.
Можно ли это достичь?
В TextView
я устанавливаю drawableLeft
, где drawable
показывает из центра. Мне нужно выровнять drawableLeft
с вершиной внутри TextView
, как это изображение.
Можно ли это достичь?
Смотрите мой ответ здесь.
Вы можете выровнять составную часть Drawable с вершиной (или снизу), создав пользовательский Drawable, который обертывает ваш Drawable, а затем манипулирует чертежом вашего пользовательского Drawable, переопределяя метод onDraw(Canvas)
.
Пример, приведенный ниже, является самым простым примером. Это выравнивает изображение вверху, но вы также можете сделать его выровненным в нижней, левой или правой части TextView, выполнив требуемую логику в методе onDraw(Canvas)
. Возможно, вы также захотите создать резервную копию в onDraw(Canvas)
, чтобы сделать пиксель реализации проекта идеальным.
Использование образца:
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);
Пример кода:
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();
}
}
Используйте SpannableString и 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);
дополнительное пространство в строковой переменной заменяется значком.
Я думаю, что это даже проще, чем все ответы выше: вам нужно только сделать это:
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();
}
}
И затем
final Bitmap bitmap = BitmapFactory.decodeResource(mTitle.getResources(), R.drawable.icon);
icon = new TopGravityDrawable(mTitle.getResources(), bitmap);
title.setCompoundDrawablesWithIntrinsicBounds(null, null, null, icon);
Помните, что это работает только с LEFT и RIGHT составными чертежами
Если вы хотите чисто XML-решение, вы можете использовать вставку, пригодную для повторной установки желаемого.
<?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" />
Возможно, вам придется играть со значением вставки в зависимости от вашего сценария. Затем просто используйте этот XML-документ в своем определении Textable drawableLeft/Start.
Вы можете использовать этот способ. Пусть это может вам помочь.
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="100dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:src="@drawable/ic_launcher" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/imageView1"
android:text=" Text Text Text Text Text Text Text Text Text Text Text Text
Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text Text" />
</RelativeLayout>
вы можете сделать вот так:
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);
}
}