How to draw text with background using canvas

I have a code in which I draw my text in a raster (canvas)

canvas.drawTextOnPath(Text, textPath[count], gipa, -10, text); 

Please tell me, is it possible to draw this text in a path (textPath) with the background color?

full function for drawing text only

  public void drawText(float x,float y ,String Text,Canvas canvas,Paint paint1 ,int count ) { float xren =text.measureText(Text.trim()); canvas.drawTextOnPath(Text, textPath[count], gipa, -10, text); } 

With this function, I draw text on my canvas. so how to change this function to draw this text from the background?

+8
source share
4 answers

Most likely, two steps are needed here. you draw a line along the path first with the color for the background, and then draw the text as indicated. Set the line thickness using the paint object. In addition, changing the style of the paint can help with the effect. try FILL , STROKE or FILL_AND_STROKE for different effects.

 mpaint.setStyle(Paint.Style.STROKE); mpaint.setStrokeWidth(strokeWidth); 

Added a pattern for drawing the path (rectangle) with red color:

  Paint mPaint = new Paint(); mPaint.setColor(Color.RED); Path mPath = new Path(); RectF mRectF = new RectF(20, 20, 240, 240); mPath.addRect(mRectF, Path.Direction.CCW); mPaint.setStrokeWidth(20); mPaint.setStyle(Paint.Style.STROKE); canvas.drawPath(mPath, mPaint); 

Then draw the text along the same path (blue color):

  mPaint.setColor(Color.BLUE); mPaint.setStrokeWidth(0); mPaint.setStyle(Paint.Style.FILL); mPaint.setTextSize(20); canvas.drawTextOnPath("Draw the text, with origin at (x,y), using the specified paint, along the specified path.", mPath, 0, 5, mPaint); 

results

+19
source

I believe this solution is better and more flexible than drawPath .

Use this to calculate the background size of text:

 private @NonNull Rect getTextBackgroundSize(float x, float y, @NonNull String text, @NonNull TextPaint paint) { Paint.FontMetrics fontMetrics = paint.getFontMetrics(); float halfTextLength = paint.measureText(text) / 2 + 5; return new Rect((int) (x - halfTextLength), (int) (y + fontMetrics.top), (int) (x + halfTextLength), (int) (y + fontMetrics.bottom)); } 

Then draw the background as Rect :

 Rect background = getTextBackgroundSize(x, y, text, textPaint); canvas.drawRect(background, bkgPaint); canvas.drawText(text, x, t, textPaint); 
+1
source

If you want to do so, then implement the code snippet below:

enter image description here

  /** * PUT THIS METHOD FOR IMPLEMENT WATER-MARK IN COMMON FILE */ public static Bitmap waterMark(Bitmap src, String watermark) { //get source image width and height int w = src.getWidth(); int h = src.getHeight(); Bitmap result = Bitmap.createBitmap(w, h, src.getConfig()); Canvas canvas = new Canvas(result); canvas.drawBitmap(src, 0, 0, null); Paint paint = new Paint(); Paint.FontMetrics fm = new Paint.FontMetrics(); paint.setColor(Color.WHITE); paint.getFontMetrics(fm); int margin = 5; canvas.drawRect(50 - margin, 50 + fm.top - margin, 50 + paint.measureText(watermark) + margin, 50 + fm.bottom + margin, paint); paint.setColor(Color.RED); canvas.drawText(watermark, 50, 50, paint); return result; } 

// To get a bitmap from a URI:

  private Bitmap getBitmapFromUri(String photoPath) { Bitmap image = null; BitmapFactory.Options options = new BitmapFactory.Options(); options.inPreferredConfig = Bitmap.Config.ARGB_8888; Bitmap bitmap = BitmapFactory.decodeFile(photoPath, options); return bitmap; } 

// Save Image:

  private String SaveImage(Bitmap finalBitmap) { String root = Environment.getExternalStorageDirectory().toString(); File myDir = new File(root + "/shareImage"); myDir.mkdirs(); Random generator = new Random(); int n = 10000; n = generator.nextInt(n); String fname = "Image" + n + ".jpg"; File file = new File(myDir, fname); if (file.exists()) file.delete(); try { FileOutputStream out = new FileOutputStream(file); finalBitmap.compress(Bitmap.CompressFormat.JPEG, 20, out); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } return file.getAbsolutePath(); } 

// Call like this:

  Bitmap bitmap = getBitmapFromUri(attachment.get(i).getPath()); // Enter here your Image path Bitmap bitmapp = waterMark(bitmap, "ENTER YOUR TEXT FOR WATERMARK LABEL"); String path = SaveImage(bitmapp); Uri uri = Uri.fromFile(new File(path)); 

Here, finally, from the URI you can get a new embedded watermark image.

Hope this helps you.

0
source

this method that I created will give you a better idea of ​​how easy you can do it

  public static Drawable getTextToDrawable(final String sText, final float textSize, final int textColor, final int bgColor, final int imageSize) { Shape shape = new Shape() { @Override public void draw(Canvas canvas, Paint paint) { paint.setTextSize(spToPixel(textSize)); int ivImageSize = SUtils.dpToPx(imageSize); paint.setTextAlign(Paint.Align.LEFT); float baseline = -paint.ascent(); // ascent() is negative int width = (int) (paint.measureText(sText)); // round int height = (int) (baseline + paint.descent()); Bitmap image = Bitmap.createBitmap(ivImageSize, (int) (ivImageSize), Bitmap.Config.ARGB_8888); canvas.drawBitmap(image, ivImageSize, ivImageSize, paint); paint.setColor(bgColor); if (sText != null) { if (sText.length() < 3) { canvas.drawCircle(ivImageSize / 2, ivImageSize / 2, ivImageSize / 2, paint); paint.setColor(textColor); canvas.drawText(sText, (ivImageSize - width) / 2, (height+baseline)/2, paint); } else { canvas.drawRect(0, 0, ivImageSize, height, paint); paint.setColor(textColor); canvas.drawText(sText, (ivImageSize - width) / 2, baseline, paint); } } } }; return new ShapeDrawable(shape); } 
0
source

Source: https://habr.com/ru/post/902198/


All Articles