这是一个相当大的问题(多个问题),但我并不是盲目提问,因为我已经尽力研究过它们并尝试了理解。我花了时间来提出问题,希望能清楚地表达出我想要实现的目标。
我将提供我的声誉作为赏金,因为我希望得到详细的答案和帮助,希望这足以吸引一些人来帮助。
提前感谢您的时间和帮助!(期待回复)
TextLayout&Font&Graphics2D
涉及以下类和方法:
- TextLayout - TextLayout.getAdvance() - TextLayout.getAscent() - TextLayout.draw() - Graphics2D.getFontRenderContext()
我不太确定在Android中等价于TextLayout的是什么。我曾经读到有些人创建TextView并使用它,但不确定是否适用于以下情况。我会提供一些我想做的东西的源代码,也许有人可以帮助我。
Java源代码:
private Font myStringFont = new Font("Helvetica", Font.BOLD, 12);
private String myString = "My Test String";
private int midX = getWidth() / 2;
private int midY = getHeight() / 2;
Graphics2D g2 = new Graphics2d();
TextLayout layout = new TextLayout(myString, font, g2.getFontRenderContext());
g2.drawString(myString, midX - ((int)layout.getAdvance() /2), midY);
Android复制尝试:
Canvas canvas;
Paint paint;
private String myString = "My Test String";
private float midX = getWidth() / 2;
private float midY = getHeight() / 2;
//Unsure what to do about TextLayout <- this is where I need an alternative
canvas.drawText(myString, midX - /* whatever my alternative to layout.getAdvance() is */ /2), midY);
我卡在如何创建TextLayout以及怎么处理getAdvance()方法上。我注意到在Paint.FontMetrics()中有一些可能的替代方案,但不确定哪个更好。此外,我也不确定如何处理以下Java代码:
Graphics2D g2 = new Graphics2d();
private int midX = getWidth() / 2;
private int midY = getHeight() / 2;
TextLayout layout = new TextLayout(myString, g2.getFont(), g2.getFontRenderContext());
layout.draw(g2, midX, MidY);
以上问题的回顾/总结:
TextLayout
的 Android 替代品是什么?- 相当于
TextLayout.getAdvance()
的方法是什么?(我能否使用fontMetrics
实现它?) - 是否有 Android 等效于
Graphics2D.getFontRenderContext()
的方法? - 你能提供 Android 的示例源代码吗?
这是我在将 Java 移植到 Android 时遇到的最大问题之一。我会非常感激任何帮助、建议、示例等。
字体
下面是我想要复制处理 font
、textlayout
和 graphics2d
的方法。第一个源是 Java 方法,
下面是我尝试复制它。
以下类和方法存在疑问:
Font.deriveFont(float size)
通过复制当前字体对象并对其应用新样式来创建新字体对象TextLayout.getAdvance()
Advance 是从原点到测量线方向上最右(最下)字符的前进距离Graphics2D.setRenderingHint(RenderingHints, RenderingHints)
Graphics2D.getFontRenderContext()
封装应用程序提示,如抗锯齿和分数度量
Java 源代码:
private String myString = "Print this test statement";
private int myStringFontSize = 15;
private Color myStringFontColor = Color.red;
private Font myStringFont = new Font("Helvetica", Font.BOLD, myStringFontSize);
private int midX = getWidth() / 2;
private int midY = getHeight() / 2;
public drawString(Graphics2D g2) {
g2.setFont(myStringFont.deriveFont(determineFontSize(g2, myString)));
g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALISING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
TextLayout layout = new TextLayout(myString, g2.getFont(), g2.getFontRenderContext());
g2.setPaint(myStringFontColor);
g2.drawString(myString, midX - ((int) layout.getAdvance() / 2), midY);
}
protected float determinFontSize(Graphics2D g2, String myString) {
int space = getWidth();
float fontSize = 1.0f;
float finalFontSize = fontSize;
while(fontSize < 25) {
Font font myString.deriveFont(fontSize);
Textlayout layout = new TextLayout(waitingMessage, font, g2.getFontRenderContext());
if(layout.getAdvance() > space) {
finalFontSize = fontSize - 2;
break;
}
fontSize++;
}
finalFontSize = fontSize - 4;
return finalFontSize;
}
Android 尝试:
private String myString = "Print this test statement";
private int myStringFontSize = 15;
private int myStringFontColor = Color.RED; //Android uses int rather than Color
Typeface tf = new Typeface(); //Android uses Typeface rather than Font
private float midX = getWidth() / 2; //Changed to float because drawText requires float
private float midY = getHeight() / 2; //changed to float because drawText requires float
public drawString(Canvas canvas, Paint paint) {
tf.create("Helvetica", BOLD);
paint.setTypeface(tf);
paint.setTextSize((float) myStringFontSize);
paint.setTextSize(determineFontSize(canvas, myString, paint);
paint.setAntiAlias(true);
//NOT SURE WHAT TO DO WITH TextLayout YET
paint.setColor(myStringFontColor);
canvas.drawText(myString, midX - ((int)layout.getAdvance() / 2), midY, paint); //Not sure how to deal with layout.getAdvance() just yet
}
protected float determineFontSize(Canvas canvas, String myString, Paint paint) {
float fontSize = 1.0f;
float finalFontSize = fontSize;
int space = getWidth();
while(fontSize < 25) {
paint.setTextSize(fontSize);
//NOT SURE WHAT TO DO ABOUT TextLayout.getAdvance() YET or g2.getFontRenderContext()
if(layout.getAdvance() > space) {
finalFontSize = fontSize - 2;
break;
}
fontSize++;
}
finalFontSize = fontSize - 4;
return finalFontSize;
}
上述方法的最终问题:
TextLayout.getAdvance()
有什么替代方案?(如果已经在关于TextLayout的问题中回答,请忽略)Graphics2D.getFontRenderContext()
有什么替代方案?- 我的Android源代码是否复制了Java源代码?如果没有,需要更改哪些内容?
- 有更好的方法吗?如果有,怎么做?
Elipse2D.Double(double x, double y, double w, double h)
有没有一种方法可以创建一个椭圆的子类,以创建与Java Ellipse2D.Double相等的东西?如果有,应该如何操作?
ComponentAdapter && ComponentEvent
我在Java中使用它们是因为我的组件可以调整大小,在Android中,视图的等效物是什么?(如果有的话)