java - 文本呈现在实心矩形上,但不呈现在渐变上

标签 java android

我是 Android 开发的新手,并尝试在 onDraw 方法中将按钮呈现给 Canvas 对象,基本上是在后场上显示文本。这是让我熟悉一些渲染命令的好方法。

我可以填充一个实心矩形,然后在其上绘制居中文本,但是当我尝试填充一个渐变矩形,然后在其上绘制文本时,文本不会绘制。

代码如下,由各种示例拼凑而成。基本上:

  • DO_PAINT=0, DO_GRADIENT=0 -> 文本渲染
  • DO_PAINT=1, DO_GRADIENT=0 -> 顶部有文本的实心矩形
  • DO_PAINT=0, DO_GRADIENT=1 -> 渐变矩形(无文字)!!!

所以我的渐变绘图会干扰我的文本渲染。我猜想我在 Paint 对象中留下了一些处于不良状态的东西,但我不确定那会是什么属性......

非常感谢任何见解或想法...

import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Shader;
import android.graphics.Typeface;
import android.view.View;
import android.graphics.Paint;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Canvas;
import android.util.Log;
import android.view.MotionEvent;
import android.app.Activity;

public class cMyView extends View
{
    public cMyView(Context context, Activity owner_activity)
    {
        super(context);
    }

    final Paint m_paint = new Paint();
    public String m_Text = "Button";
    private final Rect textBounds = new Rect(); 
    public Typeface m_TypeFace = Typeface.create("Arial",Typeface.NORMAL);
    public int m_TextColor = Color.argb(255,0,0,0);
    public int m_TextSize = 32;

    @Override
    protected void onDraw(Canvas canvas) {

        Rect m_Bounds = new Rect(100,100,500,200);
        boolean DO_PAINT = false;
        boolean DO_GRADIENT = true;


    if ( DO_PAINT) {
        m_paint.setStyle(Paint.Style.FILL);
        m_paint.setColor(Color.GREEN);
        canvas.drawRect(m_Bounds, m_paint);
    }

    if (DO_GRADIENT) {
        m_paint.setShader(new LinearGradient(0, m_Bounds.top, 0, m_Bounds.bottom, Color.BLACK, Color.WHITE, Shader.TileMode.MIRROR));
        canvas.drawRect(m_Bounds.left, m_Bounds.top, m_Bounds.right, m_Bounds.bottom, m_paint);
    }

    m_paint.setColor(m_TextColor);
    m_paint.setTextSize(m_TextSize);
    m_paint.setTypeface(m_TypeFace);

    m_paint.getTextBounds(m_Text, 0, m_Text.length(), textBounds);

    double x = m_Bounds.left + m_Bounds.width()/2  - textBounds.exactCenterX();
    double y = m_Bounds.top  + m_Bounds.height()/2 - textBounds.exactCenterY();

    canvas.drawText(m_Text, (float) x, (float) y, m_paint);

}

最佳答案

只需为文本添加另一个 Paint,这对我有用,我找到了原因,如果您在 DO_GRADIENT 案例中注释第二行(在您的代码中),那么将看到文本是渐变的,这意味着它绘制,但具有与背景相同的渐变,并且变得不可见。

public class CustomView extends View {
public CustomView(Context context) {
    super(context);
}

public CustomView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public CustomView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
}

final Paint m_paint = new Paint();
public String m_Text = "Button";
private final Rect textBounds = new Rect();
public Typeface m_TypeFace = Typeface.create("Arial",Typeface.NORMAL);
public int m_TextColor = Color.argb(255, 0, 0, 0);
public int m_TextSize = 32;
private final Paint textPaint = new Paint();

@Override
protected void onDraw(Canvas canvas) {

    Rect m_Bounds = new Rect(100,100,500,200);
    boolean DO_PAINT = true;
    boolean DO_GRADIENT = true;


    if ( DO_PAINT) {
        m_paint.setStyle(Paint.Style.FILL);
        m_paint.setColor(Color.GREEN);
        canvas.drawRect(m_Bounds, m_paint);
    }

    if (DO_GRADIENT) {
        m_paint.setShader(new LinearGradient(0, m_Bounds.top, 0, m_Bounds.bottom, Color.BLACK, Color.WHITE, Shader.TileMode.MIRROR));
        canvas.drawRect(m_Bounds.left, m_Bounds.top, m_Bounds.right, m_Bounds.bottom, m_paint);
    }

    m_paint.setColor(m_TextColor);
    m_paint.setTextSize(m_TextSize);
    m_paint.setTypeface(m_TypeFace);

    m_paint.getTextBounds(m_Text, 0, m_Text.length(), textBounds);

    double x = m_Bounds.left + m_Bounds.width()/2  - textBounds.exactCenterX();
    double y = m_Bounds.top  + m_Bounds.height()/2 - textBounds.exactCenterY();

    textPaint.setColor(m_TextColor);
    textPaint.setTextSize(m_TextSize);
    textPaint.setTypeface(m_TypeFace);
    canvas.drawText(m_Text, (float) x, (float) y, textPaint);

}

Screenshot

关于java - 文本呈现在实心矩形上,但不呈现在渐变上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28681590/

相关文章:

java - JRE 8 与 weblogic 10.3.6 (11g

android - 我想在android studio中使用限定符<large>,但我无法添加目录layout-large

android - "failed to map segment from shared object: operation not permitted"的可能原因是什么,如何调试?

android - 谷歌地图应用程序不显示 map

java - 如何让 Aspect 触发带注释的函数?

java - 格式化日期以获取年份数字的最后两位数字(例如 : 19 from 2019)

java - 如何知道我的 HTTP 请求是否使用 UTF-8?

java - 导入com.facebook.android.R;未找到

android - 向下滚动 ListView 时将图像从服务器加载到Android自定义 ListView

java - 多个 jboss 托管域和 SSL