将Java类和方法移植到Android。(文本布局、字体、图形2D等)

将Java类和方法移植到Android。(文本布局、字体、图形2D等),java,android,text,porting,graphics2d,Java,Android,Text,Porting,Graphics2d,我一直在玩Android,试图通过Java应用程序进行移植。下面是一些关于我遇到的问题的问题,希望得到一些指导 这是一个相当大的问题(而不是多个问题)。然而,我不是盲目地问他们,因为我已经研究了我能做的关于他们的事情,并试图利用我的理解。我花了时间问这些问题,希望它们对我想要实现的目标有一半的了解 我将提供我的代表的一半作为赏金,因为我希望得到彻底的回答和帮助,希望这将足以吸引一些人来帮助 提前,感谢您的时间和帮助!(期待阅读回复) textloayout&Font&Graphics2D 有疑问

我一直在玩Android,试图通过Java应用程序进行移植。下面是一些关于我遇到的问题的问题,希望得到一些指导

这是一个相当大的问题(而不是多个问题)。然而,我不是盲目地问他们,因为我已经研究了我能做的关于他们的事情,并试图利用我的理解。我花了时间问这些问题,希望它们对我想要实现的目标有一半的了解

我将提供我的代表的一半作为赏金,因为我希望得到彻底的回答和帮助,希望这将足以吸引一些人来帮助

提前,感谢您的时间和帮助!(期待阅读回复)

textloayout&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
    ,Android的替代方案是什么
  • 什么等效于
    TextLayout.getAdvance()
    ?(我是否能够使用
    fontMetrics
    来实现它?)
  • 是否存在与
    Graphics2D.getFontRenderContext()相当的Android版本
  • 你能提供Android的示例源代码吗
这是目前我将Java移植到Android的最大问题之一。如果有任何帮助、建议、例子等,我将不胜感激

字体

下面是我想要复制的处理
font
textlayout
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=“打印此测试语句”;
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.getAdvance()
    ,我有什么选择?(如果由于与TextLayout有关的问题而得到回答,则忽略此选项)
  • 对于
    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);