Android:在图像资源上写入并在不同设备上保持相同的大小

时间:2017-05-10 04:51:27

标签: android canvas paint drawtext text-size

我一直在寻找如何解决问题的日子,而且我们找不到答案。如果已经有类似的问题,我提前道歉。

我的问题很简单。我希望用户输入一个名字,这个名字将写在一个图像上,在某种小盒子里。 (无论如何,图像在意图和所有内容中共享......)

图片是我的drawable文件夹中的png。因此,在任何类型的设备上,它应始终具有相同的像素大小。 我在一个位图上加载png,在该位图上使用canvas,创建一个paint并myPaint.setTextSize(100)(setTextSize占用像素,所以在这种情况下它是100像素),然后使用该paint在画布上使用drawText来生成相同的文本使用任何设备的大小(以像素为单位)。

结果是写了#My; MeName"在一台设备上非常适合,但在较小的设备上,它可以开箱即用,也可以放在更大的设备上。

我尝试使用dp或sp,即使我知道它不会改变任何东西,因为我们不是在讨论布局,而是一个具有固定大小的可绘制png。&#39; < / p>

我对文本的位置或任何事情没有任何问题;只有它的大小。

所以无论如何,我不知道从一个设备到另一个设备的文本化变化来自哪里。也许我没有处理某种细节。我希望你们能帮助我。

                    Context context = getBaseContext();
                    Resources resources = context.getResources();
                    Bitmap card = BitmapFactory.decodeResource(resources, R.drawable.card);

                    android.graphics.Bitmap.Config bitmapConfig = card.getConfig();
                    if(bitmapConfig == null) {
                        bitmapConfig = android.graphics.Bitmap.Config.ARGB_8888;
                    }
                    // Converting to mutable
                    card = card.copy(bitmapConfig, true);

                    Canvas canvas = new Canvas(card);
                    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
                    // text color
                    paint.setColor(Color.WHITE);
                    paint.setFakeBoldText(true);
                    paint.setTextAlign(Paint.Align.CENTER);
                    // text size in pixels
                    paint.setTextSize(100);

                    // Name Position
                    float xName = (float) (0.744 * card.getWidth() );
                    float yName = (float) (0.680424 * (card.getHeight() - (paint.ascent()/2)));
                    String name = editName.getText().toString();
                    canvas.drawText(name, xName, yName, paint);

2 个答案:

答案 0 :(得分:0)

试试这个。

/**
     * 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 static 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
        // http://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);
    }

答案 1 :(得分:0)

我能够通过使用密度来解决这个问题。不确定它是如何工作的,但它完成了工作......

<!DOCTYPE html>
<html>
<head>

  <script src="https://cdnjs.cloudflare.com/ajax/libs/raphael/2.2.7/raphael.min.js">
  </script>
  <script src="https://cdn.jsdelivr.net/wheelnav/1.7.0/wheelnav.min.js" type="text/javascript">
  </script>
  <title></title>
</head>
<body>
  <div id="wheelDiv"></div>
  <script>
  wheel = new wheelnav('wheelDiv');
  wheel.clockwise = false;
  wheel.createWheel(['title-0', 'title-1', 'title-2', 'title-3', 'title-4']);
  </script>
</body>
</html>