0

ЭТО НЕ О AntiAlias, Пожалуйста, прочитайте вопрос, прежде чем ответить спасибо.canvas.drawText с пиксельным текстом на холсте

ДОБАВЛЕНИЕ BOUNTY TO ->android convert text width (in pixels) to percent of screen width/height

Качество Информация ->https://stackoverflow.com/a/1016941/1815624

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

Я хочу, чтобы текст, чтобы потреблять такое же количество масштабируемого пространства на всех устройствах

Я не заботятся о ANTI_ALIAS и добавили paint.setFlags(Paint.ANTI_ALIAS_FLAG); но проблема та же ...

1 экран текст потребляет половину ширины, а другой - только 1/3 и даже один, который использует полную ширину.

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

Для примера

1600x900 7inch таблетки Kitkat физическое: inconsistent results

1920,1080 5,2 KitKat физический inconsistent results

1600x900 20in леденец эмулировать inconsistent results

1280x720 4.7inch inconsistent results

Они были созданы с помощью руководства по http://www.gkproggy.com/2013/01/draw-text-on-canvas-with-font-size.html

, где, как учебник показывает стабильные результаты consistent results

Чтобы быть тщательными здесь источник:

public class MainActivity extends Activity 
{ 
    Paint paint; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     paint = new Paint(); 
     View test = new TestView(this); 

     setContentView(test); 
    } 

    public class TestView extends View 
    { 

     public TestView(Context context) 
     { 
      super(context); 
      setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 
     } 

     public float pixelsToSp(Context context, float px) { 
      float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity; 
      return px/scaledDensity; 
     } 

     public float spToPixels(float sp) { 
      Context context = getContext(); 
      float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity; 
      return scaledDensity*sp; 
     } 

     @Override 
     protected void onDraw(Canvas canvas) 
     { 
      int size = getResources().getDimensionPixelSize(R.dimen.sp20); 
      int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20, getResources().getDisplayMetrics()); 
      Log.v("intSize", Integer.toString(size)); 
      Log.v("intSize", Integer.toString(px)); 
      Log.v("intSize", Float.toString(spToPixels(20f))); 
      if(true) { 
       Typeface myTypeface = Typeface.createFromAsset(getContext().getAssets(), "fonts/Ultra.ttf"); 
       paint.setTypeface(myTypeface); 
      } 
      paint.setColor(Color.BLACK); 
      paint.setTextSize(size); 
      paint.setFlags(Paint.ANTI_ALIAS_FLAG); 
      canvas.drawText("HELLOOOOOOOOOOOOOO!", 0, size, paint); 
      super.onDraw(canvas); 
     } 
    } 
} 

I попробовали предложение от https://stackoverflow.com/a/5369766/1815624

Глядя в этот

https://stackoverflow.com/a/21895626/1815624

https://stackoverflow.com/a/14753968/1815624

https://stackoverflow.com/a/21895626/1815624 < - пытается в настоящее время

+0

Я не знаю, что вы просите, но, чтобы получить «гладкий» краями вы можете установить сглаживание на true на объект рисования –

+0

Я хочу, чтобы текст потреблял одинаковое количество масштабированного пространства на всех устройствах – CrandellWS

+1

Это похоже на t эй, делай. Вы хотите, чтобы они охватывали один и тот же * процент * ширины/высоты экрана или что они одного размера, если вы измеряли их линейкой? –

ответ

0

Ресурсы, используемые:

https://stackoverflow.com/a/4847027/1815624

https://stackoverflow.com/a/21895626/1815624

Получил ширину экрана, некоторую ссылку на размер текста и соотношение экрана и вычислил. поэтому результаты:

better results

и

better results

уведомление второй HELLOOOOOOOOOOOOOOOOO!

public class MainActivity extends Activity 
{ 
    Paint paint; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     paint = new Paint(); 
     View test = new TestView(this); 

     setContentView(test); 
    } 

    public class TestView extends View 
    { 

     public TestView(Context context) 
     { 
      super(context); 
      setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 
     } 

     public float pixelsToSp(float px) { 
      Context context = getContext(); 
      float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity; 
      return px/scaledDensity; 
     } 

     public float spToPixels(float sp) { 
      Context context = getContext(); 
      float scaledDensity = context.getResources().getDisplayMetrics().scaledDensity; 
      return scaledDensity*sp; 
     } 

     @Override 
     protected void onDraw(Canvas canvas) 
     { 
      int size = getResources().getDimensionPixelSize(R.dimen.sp20); 
      int px = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 20, getResources().getDisplayMetrics()); 
      Log.v("intSize", Integer.toString(size)); 
      Log.v("intSize", Integer.toString(px)); 
      Log.v("intSize", Float.toString(spToPixels(20f))); 

      DisplayMetrics metrics = new DisplayMetrics(); 
      getWindowManager().getDefaultDisplay().getMetrics(metrics); 

      Log.v("intSize hm", Integer.toString(metrics.heightPixels)); 
      Log.v("intSize wm", Integer.toString(metrics.widthPixels)); 

      if(true) { 
       Typeface myTypeface = Typeface.createFromAsset(getContext().getAssets(), "fonts/Ultra.ttf"); 
       paint.setTypeface(myTypeface); 
      } 
      paint.setColor(Color.BLACK); 
      paint.setTextSize(size); 
      paint.setFlags(Paint.ANTI_ALIAS_FLAG); 
      canvas.drawText("HELLOOOOOOOOOOOOOO!", 0, size, paint); 
      setTextSizeForWidth(paint, metrics.widthPixels * 0.5f, "HELLOOOOOOOOOOOOOO!"); 
      canvas.drawText("HELLOOOOOOOOOOOOOO!", 0, size*3, paint); 
      super.onDraw(canvas); 
     } 
     /** 
     * Sets the text size for a Paint object so a given string of text will be a 
     * given width. 
     * 
     * @param paint 
     *   the Paint to set the text size for 
     * @param desiredWidth 
     *   the desired width 
     * @param text 
     *   the text that should be that width 
     */ 
     private void setTextSizeForWidth(Paint paint, float desiredWidth, 
               String text) { 

      // Pick a reasonably large value for the test. Larger values produce 
      // more accurate results, but may cause problems with hardware 
      // acceleration. But there are workarounds for that, too; refer to 
      // https://stackoverflow.com/questions/6253528/font-size-too-large-to-fit-in-cache 
      final float testTextSize = 48f; 

      // Get the bounds of the text, using our testTextSize. 
      paint.setTextSize(testTextSize); 
      Rect bounds = new Rect(); 
      paint.getTextBounds(text, 0, text.length(), bounds); 

      // Calculate the desired size as a proportion of our testTextSize. 
      float desiredTextSize = testTextSize * desiredWidth/bounds.width(); 

      // Set the paint for that size. 
      paint.setTextSize(desiredTextSize); 
     } 

    } 
} 

Обратите внимание, если вы не распространяющие использовать информацию о

DisplayMetrics metrics = new DisplayMetrics(); 
    WindowManager windowManager = (WindowManager) context 
      .getSystemService(Context.WINDOW_SERVICE); 
    windowManager.getDefaultDisplay().getMetrics(metrics); 

вместо

DisplayMetrics metrics = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(metrics);