2016-11-15 3 views
0

Je veux y parvenir:Drawable texte à l'intérieur comme arrière-plan

enter image description here

J'ai créé une classe TextDrawable et j'ai dessiné un texte. Mais comment puis-je le remplir avec le drawable que j'ai?

import android.content.res.Resources; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.ColorFilter; 
import android.graphics.Paint; 
import android.graphics.Paint.Align; 
import android.graphics.Rect; 
import android.graphics.drawable.Drawable; 
import android.util.TypedValue; 

public class TextDrawable extends Drawable { 
    private static final int DEFAULT_COLOR = Color.WHITE; 
    private static final int DEFAULT_TEXTSIZE = 45; 
    private Paint mPaint; 
    private CharSequence mText; 
    private int mIntrinsicWidth; 
    private int mIntrinsicHeight; 

    public TextDrawable(Resources res, CharSequence text) { 
     mText = text; 
     mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     mPaint.setStyle(Paint.Style.STROKE); 
     mPaint.setColor(Color.RED); 
     mPaint.setTextAlign(Align.CENTER); 
     mPaint.setStrokeWidth(5); 
     float textSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, DEFAULT_TEXTSIZE, res.getDisplayMetrics()); 
     mPaint.setTextSize(textSize); 
     mIntrinsicWidth = (int) (mPaint.measureText(mText, 0, mText.length()) + .5); 
     mIntrinsicHeight = mPaint.getFontMetricsInt(null); 
    } 

    @Override 
    public void draw(Canvas canvas) { 
     Rect bounds = getBounds(); 
     canvas.drawText(mText, 0, mText.length(), bounds.centerX() + 15, bounds.centerY() + 15, mPaint); 
    } 

    @Override 
    public int getOpacity() { 
     return mPaint.getAlpha(); 
    } 

    @Override 
    public int getIntrinsicWidth() { 
     return mIntrinsicWidth; 
    } 

    @Override 
    public int getIntrinsicHeight() { 
     return mIntrinsicHeight; 
    } 

    @Override 
    public void setAlpha(int alpha) { 
     mPaint.setAlpha(alpha); 
    } 

    @Override 
    public void setColorFilter(ColorFilter filter) { 
     mPaint.setColorFilter(filter); 
    } 

} 

gradient Drawable:

<?xml version="1.0" encoding="utf-8"?> 
<ripple xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:color="@color/night_blue" 
tools:targetApi="lollipop"> 
<item android:id="@android:id/background"> 
    <shape xmlns:android="http://schemas.android.com/apk/res/android" 
     android:shape="rectangle" > 

     <gradient 
      android:angle="0" 
      android:endColor="@color/color_end" 
      android:startColor="@color/color_start" /> 


    </shape> 
</item> 
</ripple> 

L'effet d'entraînement peut aller si nécessaire, mais, je dois être en mesure de dessiner du texte avec le remplissage comme cette image.

Répondre

0

utiliser comme ceci:

 mPaint.setShader(new LinearGradient(0, 0, 0, mIntrinsicHeight, res.getColor(R.color.color_start), res.getColor(R.color.color_end), Shader.TileMode.CLAMP)); 
+0

Merci monsieur, fonctionne comme un charme! –

1

utilisation LinearGradient comme ceci:

Shader linearGradient = new LinearGradient(getWidth()/2f, 0f, getWidth()/2f, getHeight() 
       , Color.RED, Color.GREEN, Shader.TileMode.CLAMP); 
mPaint.setShader(linearGradient); 
+0

ce sont getWidth()) et getHegiht()? De quel un je l'utilise? –

+0

oh je suis désolé, je pense que TextDrawable s'étend ** Voir ** –