我一直在 Android 中尝试并尝试通过 Java 应用程序进行移植。以下是我遇到的一些问题,希望得到一些指导。
这是一个相当大的问题(而是多个问题)。然而,我并不是盲目地询问他们,因为我已经对他们进行了研究,并试图运用我的理解。我花时间提出这些问题,希望他们对我想要实现的目标有一半的了解。
我将提供一半的代表作为赏金,因为我希望得到彻底的答案和帮助,希望这足以吸引一些人提供帮助。
预先感谢您的时间和帮助! (期待阅读回复)。
文本布局 && 字体 && Graphics2D
有问题的是以下类和方法:
TextLayout
TextLayout.getAdvance()
TextLayout.getAscent()
TextLayout.draw()
Graphics2D.getFontRenderContext()
我不太确定什么相当于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);
上述问题的回顾/总结:
- Android 的替代品是什么
TextLayout
?
- 什么相当于
TextLayout.getAdvance()
? (我可以使用fontMetrics
来实现它?)
- Android 上有类似的东西吗
Graphics2D.getFontRenderContext()
?
- 您能提供 Android 的示例源吗?
这是目前我将 Java 移植到 Android 的最大问题之一。如果您有任何帮助、建议、示例等,我将不胜感激。
Font
以下是我想要复制该处理的方法font
, textlayout
, and graphics2d
。第一个来源是 Java 方法和
下面是我尝试复制它的尝试。
有问题的是以下类和方法:
-
Font.deriveFont(float size)
通过复制当前字体对象并向其应用新样式来创建新的字体对象
-
TextLayout.getAdvance()
前进是从原点到沿行方向测量的最右边(最底部)字符的前进的距离
-
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;
}
安卓尝试:
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 源代码?如果不是,需要改变什么?
- 有更好的方法吗?如果是这样,怎么办?
Ellipse2D.Double(双 x、双 y、双 with、双 h)
有没有办法让 oval 的子类创建与 Java Ellipse2D.Double 相同的东西?如果是这样,人们会怎样做呢?
组件适配器 && 组件事件
我在 java 中有这些,因为我的组件可以调整大小,在 Android 中,这些视图的等价物是什么? (如果有的话)