8

私はAndroidをいじって、Javaアプリを移植しようとしています。以下は、私が遭遇した問題に関するいくつかの質問であり、いくつかのガイダンスが必要です。

それはかなり大きな質問です(むしろ複数の質問)。しかし、私は彼らについて何ができるかを研究し、私の理解を生かそうとしたので、盲目的に彼らに尋ねているわけではありません。私は、私が達成したいことについて中途半端に明確になることを期待して、質問をすることに時間を費やしました。

徹底的な回答と支援を期待しているので、担当者の半分を報奨金として提供します。数人の人々を支援するのに十分であることを願っています。

よろしくお願いします!(回答を読むのを楽しみにしています)。

TextLayout && Font && Graphics2D

問題となっているのは、次のクラスとメソッドです。

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

TextLayoutAndroidで何が同等かはよくわかりません。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では、ビューのこれらに相当するものは何ですか?(もしあれば)

4

4 に答える 4

3

、および質問はTextLayout、レイアウトxmlファイルのいくつかのレイアウト属性を使用し、場合によってはいくつかのコードで拡張することにより、Androidで簡単に実現できます。例を挙げて説明すると、レイアウトxmlで次のように宣言できます。FontGraphics2DTextViewTextView

<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" />

ほとんどの属性は自明ですが、使用する幅に影響を与えるフォントでlayout_width拡張するため、は設定されていません。TextView

AssetManager assetManager = getContext().getAssets();       

Typeface tf = Typeface.createFromAsset(assetManager,"GILB.TTF");                

TextView logo = (TextView)findViewById(R.id.logo);
logo.setTypeface(tf);

メソッドは、setTypeface()太字や斜体の効果を提供できる追加のスタイルパラメータでオーバーロードされています。

このテキストが画面上に描画される特定の位置は、選択したレイアウトまたはレイアウトの組み合わせによって異なります。たとえばRelativeLayoutAbsoluteLayoutなどです。これらを効果的に使用する方法を説明できるリソースはたくさんあります。

これが制限されすぎている場合は、Canvasに直接描画できます。ここでは、ペイントまたはTextPaintオブジェクトを指定できます。ここで、アンチエイリアシングやその他のいくつかのペイント効果を設定できます。

の代わりに、オブジェクトが楕円のバウンディングボックスを指定する場所Ellipse2D.Doubleを使用できます。Canvas.drawOval(RectF oval, Paint paint)RectF

ビュー(コンポーネント)のサイズを自動的に変更できるようにするには、可能な場合は、特定の「ディップ」サイズではなくwrap_contentmatch_parentなどの柔軟なレイアウト属性を使用する必要があります。fill_parentグラフィックは、サイズの変更に対応できるように拡張できるように、9パッチ形式に変換する必要があります。

本当にテキストの長さを計算する必要がある場合、または特定の物理スペースに合うようにテキストサイズを指定する必要がある場合は、SOでこの回答を参照できます。

于 2011-07-28T19:31:28.507 に答える
2

TextLayoutに完全に相当するものはありませんが、FontMetrics(Paintを参照)クラスを使用して、前進と上昇を取得できます。テキストを描画するには、Canvasを使用するだけです。FontRenderContextに相当するものはありません(Androidでは必要ありません)。

Graphics2Dのレンダリングヒントに相当するものは、Paintクラスの単なるプロパティです。Font.deriveFont()には同等のものはなく、Paintに適切なプロパティを設定するだけです。

楕円はCanvasを使用して描画され、楕円クラスはありません。ただし、Pathインスタンスを使用して同じことを行うことができます。

于 2011-07-28T18:48:47.660 に答える
1

これはジョン・J・スミスの答えに対するコメントですが、コメントボックスには長すぎます。

レイアウトのJavaとXMLについて:Androidはこの点で非常に柔軟性があり、ビューの作成に関してはほとんど機能が同等です。しかし、私は非常にコードで同じことを行うとエラーが発生しやすく、非常に迅速に冗長になるため、少なくとも基本的なレイアウトにはXMLの使用を検討することをお勧めします。これらのビュー要素への参照は後でいつでも取得して、コードで調整できます。また、さまざまなフォームファクターに対応する場合、Androidの優れた機能は、デバイスの解像度とピクセル密度に応じて一意のレイアウトを指定できることです。これらのレイアウトと適切なリソース(画像など)の選択は、システム。追加の利点は、Springのような(しかしより優れた)レイアウト編集ができることです。これは、コンパイルされたアプリケーションをデバイスまたはエミュレーターにロードするよりも、小さな変更を行うのにはるかに高速です。

于 2011-07-31T21:19:06.580 に答える
1

私はあなたがandroid.text.layoutを探しているかもしれないと思います

于 2011-07-28T19:46:03.217 に答える