Search code examples
androidandroid-layouttextview

How to set drawable in Top-Left in a textview?


<TextView
        android:id="@+id/text"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:drawablePadding="@dimen/padding_small_6"
        android:includeFontPadding="false"
        android:text="@string/forgot_password_hint"
        android:drawableStart="@drawable/ic_edit"
        android:textSize="@dimen/text_size_medium_14"/>

This is my textview. I want to set the drawable on left of this textview. But the problem is, If the text is multiline, then drawable appears center-vertical in the text view.

Is there any option to set drawable on Top-Left of the textview?


Solution

  • Make Custom drawable class by extending a drawable class and use for drawable .eg:

    public class TopLeftGravityDrawable extends BitmapDrawable {
       private final Drawable mDrawable;
    
       public TopLeftGravityDrawable(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();
       }
    }
    

    Usage :

           Drawable drawable = getResources().getDrawable(R.drawable.ic_customer);
    
           TopGravityDrawable gravityDrawable = new TopGravityDrawable(drawable);
    
           drawable.setBounds(0, 6, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
           gravityDrawable.setBounds(0, 6, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
           textview.setCompoundDrawables(gravityDrawable, null, null, null);