gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:43:47 24 4
gpt4 key购买 nike

我是 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com