Перенос классов и методов Java на Android. (TextLayout, Font, Graphics2D и др.)

Я играл в Android и пытался перенести приложение Java. Ниже приведены некоторые вопросы, касающиеся проблем, с которыми я столкнулся, и мне хотелось бы получить некоторые рекомендации.

. Это довольно большой вопрос (скорее, несколько вопросов). Однако я не задаю их вслепую, поскольку я исследовал все, что мог о них, и попытался применить свое понимание. Я потратил время на то, чтобы задавать вопросы в надежде, что они наполовину ясны в том, чего я хочу достичь.

Я предлагаю половину своей репутации в качестве награды, так как надеюсь на исчерпывающие ответы и помощь, надеюсь, этого будет достаточно, чтобы соблазните нескольких людей помочь.

Заранее благодарю вас за ваше время и помощь! (с нетерпением жду ответов).

TextLayout && Font && Graphics2D

Под вопросом находятся следующие классы и методы:

  • TextLayout
  • TextLayout.getAdvance ()
  • TextLayout.getAscent ()
  • TextLayout.draw ()
  • Graphics2D.getFontRenderContext ()

Я не совсем уверен, что эквивалентно TextLayout в Android. Я читал, что некоторые создают 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 и 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;
}

Попытка 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 какие эквиваленты для представлений? (если есть)

8
задан Shlublu 27 July 2011 в 21:28
поделиться