将Java类和方法移植到Android。(文本布局、字体、图形2D等)
我一直在玩Android,试图通过Java应用程序进行移植。下面是一些关于我遇到的问题的问题,希望得到一些指导 这是一个相当大的问题(而不是多个问题)。然而,我不是盲目地问他们,因为我已经研究了我能做的关于他们的事情,并试图利用我的理解。我花了时间问这些问题,希望它们对我想要实现的目标有一半的了解 我将提供我的代表的一半作为赏金,因为我希望得到彻底的回答和帮助,希望这将足以吸引一些人来帮助 提前,感谢您的时间和帮助!(期待阅读回复) textloayout&Font&Graphics2D 有疑问的是以下类别和方法:将Java类和方法移植到Android。(文本布局、字体、图形2D等),java,android,text,porting,graphics2d,Java,Android,Text,Porting,Graphics2d,我一直在玩Android,试图通过Java应用程序进行移植。下面是一些关于我遇到的问题的问题,希望得到一些指导 这是一个相当大的问题(而不是多个问题)。然而,我不是盲目地问他们,因为我已经研究了我能做的关于他们的事情,并试图利用我的理解。我花了时间问这些问题,希望它们对我想要实现的目标有一半的了解 我将提供我的代表的一半作为赏金,因为我希望得到彻底的回答和帮助,希望这将足以吸引一些人来帮助 提前,感谢您的时间和帮助!(期待阅读回复) textloayout&Font&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);
审查/总结上述问题:
- 对于
,Android的替代方案是什么李>TextLayout
- 什么等效于
?(我是否能够使用TextLayout.getAdvance()
来实现它?)fontMetrics
- 是否存在与
Graphics2D.getFontRenderContext()相当的Android版本
- 你能提供Android的示例源代码吗李>
font
、textlayout
和graphics2d
的方法。第一个源代码是Java方法和
下面是我复制它的尝试
有疑问的是以下类别和方法:
通过复制当前字体对象并对其应用新样式来创建新的字体对象Font.deriveFont(float size)
前进是从原点到行方向上测量的最右(最底)字符前进的距离TextLayout.getAdvance()
Graphics2D.setRenderingHint(RenderingHints,RenderingHints)
封装应用程序提示,如抗锯齿和分数度量Graphics2D.getFontRenderContext()
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=“打印此测试语句”;
private int myStringFontSize=15;
私有颜色myStringFontColor=Color.red;
私有字体myStringFont=新字体(“Helvetica”,Font.BOLD,myStringFontSize);
private int midX=getWidth()/2;
private int midY=getHeight()/2;
公共抽绳(图形2D g2){
g2.setFont(myStringFont.deriveFont(determineFontSize(g2,myString));
g2.setRenderingHint(RenderingHits.KEY\u TEXT\u ANTIALISING,RenderingHits.VALUE\u TEXT\u Antialas\u ON);
TextLayout=newtextLayout(myString,g2.getFont(),g2.getFontRenderContext());
g2.setPaint(myStringFontColor);
g2.drawString(myString,midX-((int)layout.getAdvance()/2),midY);
}
受保护的浮点大小(Graphics2D g2,字符串myString){
int space=getWidth();
浮动字体大小=1.0f;
float finalFontSize=fontSize;
而(字体大小<25){
字体myString.deriveFont(fontSize);
Textlayout=newtextLayout(waitingMessage,font,g2.getFontRenderContext());
if(layout.getAdvance()>空格){
finalFontSize=fontSize-2;
打破
}
fontSize++;
}
finalFontSize=fontSize-4;
返回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;
}
private String myString=“打印此测试语句”;
private int myStringFontSize=15;
private int myStringFontColor=Color.RED//Android使用int而不是Color
字体tf=新字体()//Android使用字体而不是字体
private float midX=getWidth()/2//更改为浮动,因为drawText需要浮动
private float midY=getHeight()/2//更改为浮动,因为drawText需要浮动
公共拉绳(帆布、油漆){
tf.创建(“Helvetica”,粗体);
油漆。设置字体(tf);
paint.setTextSize((float)myStringFontSize);
paint.setTextSize(determineFontSize(画布、myString、paint);
paint.setAntiAlias(真);
//还不确定如何处理TextLayout
paint.setColor(myStringFontColor);
canvas.drawText(myString,midX-((int)layout.getAdvance()/2),midY,paint);//还不知道如何处理layout.getAdvance()
}
受保护的float determineFontSize(画布、字符串myString、油漆){
浮动字体大小=1.0f;
float finalFontSize=fontSize;
int space=getWidth();
而(字体大小<25){
油漆。setTextSize(fontSize);
//还不确定如何处理TextLayout.getAdvance()或g2.getFontRenderContext()
if(layout.getAdvance()>空格){
finalFontSize=fontSize-2;
打破
}
fontSize++;
}
finalFontSize=fontSize-4;
返回finalFontSize;
}
关于上述方法的最后问题:
- 对于
,我有什么选择?(如果由于与TextLayout有关的问题而得到回答,则忽略此选项)TextLayout.getAdvance()
- 对于
,我有什么选择Graphics2D.getFontRenderContext()
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;
}
<TextView android:id="@+id/logo"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:paddingTop="5dip"
android:text="Fancy Logo"
android:textSize="24sp"
android:layout_weight="0.8"
android:textStyle="bold"
android:textColor="@color/black" />
AssetManager assetManager = getContext().getAssets();
Typeface tf = Typeface.createFromAsset(assetManager,"GILB.TTF");
TextView logo = (TextView)findViewById(R.id.logo);
logo.setTypeface(tf);