私はAndroidをいじって、Javaアプリを移植しようとしています。以下は、私が遭遇した問題に関するいくつかの質問であり、いくつかのガイダンスが必要です。
それはかなり大きな質問です(むしろ複数の質問)。しかし、私は彼らについて何ができるかを研究し、私の理解を生かそうとしたので、盲目的に彼らに尋ねているわけではありません。私は、私が達成したいことについて中途半端に明確になることを期待して、質問をすることに時間を費やしました。
徹底的な回答と支援を期待しているので、担当者の半分を報奨金として提供します。数人の人々を支援するのに十分であることを願っています。
よろしくお願いします!(回答を読むのを楽しみにしています)。
TextLayout && Font && Graphics2D
問題となっているのは、次のクラスとメソッドです。
TextLayout
TextLayout.getAdvance()
TextLayout.getAscent()
TextLayout.draw()
Graphics2D.getFontRenderContext()
TextLayout
Androidで何が同等かはよくわかりません。TextView
一部の人がそれを作って使うことを読んだことがありますが、それがうまくいくかどうかはわかりません
次のように働きます。私がやりたいことのいくつかの情報源を提供します、そしておそらく1つは私を助けることができます。
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に移植する際の私の最大の問題の1つです。私はどんな助け、アドバイス、例などのために素晴らしいでしょう。
フォント
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では、ビューのこれらに相当するものは何ですか?(もしあれば)