Android TextView 带有渐变*和*描边

Lau*_*Lau 1 android styles gradient textview stroke

我现在正在寻找一段时间并测试了很多东西,但没有任何效果。我有一个 TextView,它应该有渐变填充颜色描边(不是 Textview 的背景,而是文本本身)。

我首先编写一个 GradientTextView 类。目前,我有一个带有渐变填充颜色和阴影的文本(阴影只是一个测试,也许我稍后需要一个。此时描边很重要)。但是,当我尝试添加描边时,仅显示描边或渐变填充颜色。我尝试了很多东西,例如 这里的解决方案。

import com.qualcomm.QCARSamples.ImageTargets.R;
import com.qualcomm.QCARSamples.ImageTargets.R.color;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Shader;
import android.graphics.Shader.TileMode;
import android.graphics.SweepGradient;
import android.util.AttributeSet;
import android.widget.TextView;

public class GradientTextView extends TextView
{
    public GradientTextView( Context context )
    {
        super( context, null, -1 );
    }
    public GradientTextView( Context context, 
        AttributeSet attrs )
    {
        super( context, attrs, -1 );
    }
    public GradientTextView( Context context, 
        AttributeSet attrs, int defStyle )
    {
        super( context, attrs, defStyle );
    }

int start_gradient = getResources().getColor(R.color.textview_start_gradient);
int end_gradient = getResources().getColor(R.color.textview_end_gradient);
Paint gradientpaint, strokepaint;

@Override
protected void onDraw(Canvas canvas) {
    // draw the shadow
    getPaint().setShadowLayer(10, 1, 1, 0xbf000000); 
    getPaint().setShader(null);
    super.onDraw(canvas);

    // draw the gradient filled text
    getPaint().clearShadowLayer();
    getPaint().setShader(new LinearGradient(0, 0, 0, getHeight(), 
        start_gradient, end_gradient, TileMode.CLAMP ) );
        super.onDraw(canvas);
        // **Attempts here**
    }
}
Run Code Online (Sandbox Code Playgroud)

(在“尝试此处”评论中插入尝试)

第一次尝试:

super.onDraw(canvas);   
Paint one = new Paint();
one.setStyle(Style.STROKE);
one.setTextSize(20);
one.setStrokeWidth(5);
setTextColor(Color.BLACK); 
canvas.drawText(VIEW_LOG_TAG, 0, 0, one);

Paint two = new Paint();
two.setStyle(Style.FILL);
two.setTextSize(20);
two.setStrokeWidth(0);
setTextColor(Color.BLUE);
two.setShader(new LinearGradient(0, 0, 0, getHeight(), 
    start_gradient, end_gradient, TileMode.CLAMP ) );
canvas.drawText(VIEW_LOG_TAG, 0, 0, two);
Run Code Online (Sandbox Code Playgroud)

第二次尝试:

Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
getPaint().setShader(new LinearGradient(0, 0, 0, getHeight(), 
    start_gradient, end_gradient, TileMode.CLAMP ) );
mPaint.setStyle(Paint.Style.FILL);
mPaint.setStrokeWidth(32);

super.onDraw(canvas);
Paint mCenterPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mCenterPaint.setStyle(Paint.Style.STROKE);
mCenterPaint.setColor(Color.GREEN);
mCenterPaint.setStrokeWidth(5);
super.onDraw(canvas);
Run Code Online (Sandbox Code Playgroud)

第三次尝试:

gradientpaint = this.getPaint();
gradientpaint.setShader(new LinearGradient(0, 0, 0, getHeight(), 
    start_gradient, end_gradient, TileMode.CLAMP ) );
super.onDraw(canvas);
strokepaint = new Paint(gradientpaint);
strokepaint.setStyle(Paint.Style.STROKE);
strokepaint.setStrokeWidth(30);
strokepaint.setARGB(255, 0, 0, 0);

super.onDraw(canvas);
Run Code Online (Sandbox Code Playgroud)

textview_start_gradienttextview_and_gradient只是渐变的两种颜色。

其中每一个都缺乏描边或填充(完全透明)。

我怎样才能做到这一点?

不,我尝试过这个:

新尝试:

// draw the shadow
getPaint().setShadowLayer(10, 6, 6, 0xbf000000); 
getPaint().setShader(null);
super.onDraw(canvas);

// draw the stroke
getPaint().clearShadowLayer();
getPaint().setColor(Color.BLACK);
getPaint().setStyle(Style.STROKE);
getPaint().setStrokeWidth(5);
super.onDraw(canvas);
// draw the gradient filled text
getPaint().setStyle(Style.FILL);
getPaint().setShader(new LinearGradient(0, 0, 0, getHeight(), start_gradient, end_gradient, TileMode.CLAMP ));
//getPaint().setStrokeWidth(32);
super.onDraw(canvas);
Run Code Online (Sandbox Code Playgroud)

有趣的是:阴影、填充渐变和描边都出现了!*但描边是白色的(不是黑色的)。我认为颜色设置错误,因此它显示为白色。有任何想法吗?

Lau*_*Lau 6

所以经过多次尝试,我解决了这个问题。现在我的 TextView 有一个黑色描边、一个渐变填充颜色和一个阴影。

我仍然有同样的GradientTextView.java课程,但我的 onDraw 解决方案是:

if(isInEditMode()){

}else{
    start_gradient = getResources().getColor(R.color.textview_start_gradient);
    end_gradient = getResources().getColor(R.color.textview_end_gradient);
}

// draw the shadow
getPaint().setShadowLayer(10, 6, 6, 0xbf000000); 
getPaint().setShader(null);
super.onDraw(canvas);

// draw the stroke
getPaint().clearShadowLayer();
getPaint().setStyle(Style.STROKE);
getPaint().setStrokeWidth(5);
getPaint().setShader(new LinearGradient(0, 0, 0, getHeight(), Color.BLACK, Color.BLACK, TileMode.CLAMP ));
super.onDraw(canvas);

// draw the gradient filled text
getPaint().setStyle(Style.FILL);
getPaint().setShader(new LinearGradient(0, 0, 0, getHeight(), start_gradient, end_gradient, TileMode.CLAMP ));
//getPaint().setStrokeWidth(32);
super.onDraw(canvas);

}
Run Code Online (Sandbox Code Playgroud)

getPaint().setColor(Color.BLACK); 不起作用,所以我只是设置了一个带有黑色渐变的着色器(不知道这是否是一个很好的解决方案,但它有效)。

在我的中,xml我只是将类(带包)作为 xmlns 添加到我的顶部布局中

像这样的东西

xmlns:gradient="http://schemas.android.com/apk/lib/package-name"

我写的不是 TextView:

<package-name.GradientTextView
        android:id="@+id/textView_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right|top"
        android:textSize="20sp"
        android:text="@string/main1" />
Run Code Online (Sandbox Code Playgroud)

所以感谢大家给予的帮助!

希望这会帮助别人!