2016-11-15 55 views
0

我要实现这一点:绘制对象内的文本为背景

enter image description here

我创建了一个TextDrawable类,我已经绘制的文本。但是,我如何用我的drawable填充它?

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); 
    } 

} 

可绘制渐变:

<?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> 

如果有必要的连锁反应可以走了,但是,我需要能够绘制文本有这样的图像填充。

回答

0

使用方法如下:

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

谢谢你好先生,作品像一个魅力! –

1

使用的LinearGradient这样的:

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

什么的getWidth())和getHegiht()?我从哪个使用它? –

+0

哦,我很抱歉,我认为TextDrawable扩展**查看** –