2013-12-11 18 views
6

私のアプリは文字列を正確に測定できることが重要です。私はこれを行うにはPaint.measureText()を使用しています。残念なことに、4.4では、このメソッドは正確な値を返さないように変更されました。代わりに、これは最大値を返します。誰かが私がテキストを正確に測定するのに使うことができる別の方法を知っていますか、または他の提案がありますか?Android:4.4では、Paint.measureText()は下位互換性がありません。回避策はありますか?

Androidのソース:

Android 17 
    return w*mInvCompatScaling; 
Android 18 
    return (float) Math.ceil(w*mInvCompatScaling); 
+0

おそらく、reflexionを使用してmInvCompatScalingとnative_measureTextにアクセスできます。 – njzk2

+0

Yikes、これは本当に他の問題のように感じられるもののかなり大きな変更です:https://github.com/android/platform_frameworks_base/commit/8e04840f38a16f806754dfca3de50c2548e67913 njzk2が示唆しているように、あなたは 'reflectionを介して' native_measureText'を呼び出そうとしましたか? – CodingIntrigue

+2

好奇心の高まりから、テキスト長のサブピクセル測定のユースケースは何ですか?おそらく、あなたの大規模なユースケースに対する他の解決策があります。 – CommonsWare

答えて

0

それは後方反射に落下することは古い機能を取り戻すための唯一の方法であるに見えます。次のようにプライベートネイティブメソッドを検索し、それを呼び出す。

Paint paint = new Paint(); 
// configure paint here 

Method m = paint.getClass().getDeclaredMethod("native_measureText", 
       String.class, int.class); 
float size = m.invoke(paint, text, 0x2); 
      // text - text to measure 
      // 0x2 - default for Right-To-Left text 

非常にきれいに見えませんが、これは問題なく動作します。

0

あなたは設定する必要があります。

m.setAccessible(true); 

IllegalAccessExceptionを取得しないことを呼び出す前に。

関連する問題