Android 画布没有在我的位图上绘制文本

我正在尝试从用户那里获取文本输入并将其绘制在图像上,Canvas但图像被保存而没有应该绘制的内容。现在,我只是想在担心字体、颜色、样式等之前获取图像上的文本。


这是我的代码:


 public void createBitmapAndSave(ImageView img){

        BitmapDrawable bitmapDrawable = ((BitmapDrawable) img.getDrawable());

        Bitmap bitmap = bitmapDrawable.getBitmap();

        Bitmap mutableBitmap = bitmap.copy(Bitmap.Config.ARGB_8888, true);


        Canvas canvas = new Canvas(mutableBitmap);

        Paint paint = new Paint();

        paint.setColor(Color.BLUE);

        paint.setTextSize(200);

        paint.setStyle(Paint.Style.FILL);

        paint.setShadowLayer(10f, 10f, 10f, Color.BLACK);


        String topText = topTextView.getText().toString();

        String bottomText = bottomTextView.getText().toString();


        canvas.drawText(topText, 0, 0, paint);

        canvas.drawText(bottomText, 50, 50, paint);


        File file;

        Intent mediaScanIntent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);


        String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath();

        file = new File(path + "/SimpliMeme/" + timeStamp + "-" + counter + ".jpg");

        file.getParentFile().mkdir();


        try{

            OutputStream stream = new FileOutputStream(file);

            bitmap.compress(Bitmap.CompressFormat.JPEG,100,stream);

            stream.flush();

            stream.close();

            Toast.makeText(getContext(), "Meme Saved", Toast.LENGTH_SHORT).show();

        }

        catch (IOException e){ e.printStackTrace();}


        Uri contentUri = Uri.fromFile(file);

        mediaScanIntent.setData(contentUri);

        Objects.requireNonNull(getContext()).sendBroadcast(mediaScanIntent);

        counter++;

    }

目前,.drawText()基于我在其他 SO 帖子中看到的示例,我只有 2 个实现。我的假设是文本不可见,并且没有对图像进行任何更改,因为我没有为paint对象提供任何属性。



翻过高山走不出你
浏览 111回答 1
1回答

跃然一笑

您看不到任何更改的主要问题是您进行了更改mutableBitmap但将原始文件保存bitmap到磁盘。这可以通过将前两个(甚至三个)语句连接在一起来避免:final Bitmap bitmap = bitmapDrawable.getBitmap()         .copy(Bitmap.Config.ARGB_8888, true);您在其他任何地方都不需要原始位图,这有效地防止了您犯错。不要做你不需要做的事情。一些技巧:绘图时始终明确。指定颜色,指定字体。您不能信任默认值。(至少我不确定这些值。默认颜色是黑色还是透明?)如果您想完全确定字体,请将其与您的应用程序捆绑在一起或使用可下载的字体。一些平台允许用户将默认字体更改为疯狂的东西。如果您想绘制多行文本,请查看StaticLayout.确保您的应用可在 Android 7 及更高版本上运行。禁止在您的应用之外发送带有文件 Uri 的意图。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java