canvas.drawText с идеальным текстом на холсте

ЭТО НЕ О АНТИАЛИИ, Пожалуйста, прочитайте вопрос, прежде чем ответить спасибо.

ДОБАВЛЕНИЕ BOUNTY TO-> Android преобразует ширину текста (в пикселях) в процент от ширины экрана / высоты

Информация о качестве -> /questions/17654519/poluchit-razmeryi-ekrana-v-pikselyah/17654554#17654554

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

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

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

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

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

Например

1600X900 7-дюймовый планшет Киткат физический: противоречивые результаты

1920.1080 5.2 киткат физ. противоречивые результаты

1600x900 20-дюймовый эмулированный леденец противоречивые результаты

1280x720 4,7 дюйма противоречивые результаты

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

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

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

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);
        }
    }
}

Я попробовал предложение от /questions/14512770/android-canvasdrawtext-razmer-teksta-na-raznyih-razresheniyah-ekrana/14512791#14512791

Глядя на это

/questions/3911486/android-canvas-drawtext-ustanovit-razmer-shrifta-ot-shirinyi/3911497#3911497

/questions/41963548/java-android-canvasdrawtext-odinakovo-bolshoj-na-vseh-ekranah/41963561#41963561

/questions/3911486/android-canvas-drawtext-ustanovit-razmer-shrifta-ot-shirinyi/3911497#3911497 <- пытаюсь сейчас

1 ответ

Решение

Используемые ресурсы:

/questions/17654519/poluchit-razmeryi-ekrana-v-pikselyah/17654532#17654532

/questions/3911486/android-canvas-drawtext-ustanovit-razmer-shrifta-ot-shirinyi/3911497#3911497

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

лучшие результаты

а также

лучшие результаты

обратите внимание на второй 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://stackru.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);
Другие вопросы по тегам