GVKun编程网logo

canvas中文字和图片的绘制(canvas绘制文字在图片上)

8

最近很多小伙伴都在问canvas中文字和图片的绘制和canvas绘制文字在图片上这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展androidTextView如何通过setComp

最近很多小伙伴都在问canvas中文字和图片的绘制canvas绘制文字在图片上这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展android TextView如何通过setCompoundDrawables调整文字和图片的位置(文字显示在图片内)?、Android 使用Canvas在图片上绘制文字的方法、android 开发 View _12_ 用Canvas 绘制一张图片(博客中演示用Canvas画验证码图片)、Android实现自定义带文字和图片的Button等相关知识,下面开始了哦!

本文目录一览:

canvas中文字和图片的绘制(canvas绘制文字在图片上)

canvas中文字和图片的绘制(canvas绘制文字在图片上)

绘制文字

<!DOCTYPE html>
<html lang="en"head>
    Meta charset="UTF-8"title>canvas</style>
        .canvas{border:1px solid pink;}
    bodycanvas class="canvas" id width="600" height="400">您的浏览器不支持canvascanvas>

    script>
        var canvas=document.getElementById("canvas);
         ctxcanvas.getContext(2d);//上下文,绘图环境

         strhello cyy;
        文字大小
        ctx.font50px sans-serif字符str
        位置100,100
        ctx.fillText(str,100,1)">);
        ctx.strokeText(str,1)">200);

    
    html>

 

 

水平对齐方式:left  center  right

文字居中,textAlign="center"

文字水平居中
        ctx.textAligncenter字符str 位置100,1)">>

 

 

需要注意的是,设置的并不是到画布的水平居中,而是以接下来你自己设置的fillText或者strokeText中的坐标作为文字的中心

如果想要设置到画布的居中,就需要对应的坐标点设为画布中心点

字符str 在画布位置水平居中
300>

 

 

垂直对齐方式 top  middle  bottom

文字水平居中,以300位为水平中心
文字垂直居中 ,以0为垂直中心
        ctx.textBaselinemiddle字符str 
0>

 

 

 

如果需要文字全部显示,就设置垂直为top

文字垂直居中 ,以0为垂直顶对齐
top>

 

 

获取文本宽度 

获取文本宽度
         widthctx.measureText(str).width;
        console.log(width);

    
    >

 

 

遗憾的是,canvas并没有提供获取高度的接口,因此需要通过文字大小或者自己去调试来获得

 

图片的绘制

加载图片
         imgnew Image();
        img.srcimg/right.png;

        绘制图片
        ctx.drawImage(img,1)">>

 

 打开以后发现并没有图片,这是因为图片的加载需要一定时间

因此绘制必须要在图片加载完成之后才能进行

使用onload函数来判定是否加载完成

图片加载完成后
        img.onloadfunction(){
                        ctx.drawImage(img,1)">);
        }
       
    
    >

 

 

给自己做一个头像,我又臭美了哈哈哈

1px solid #abcdefbackground-color #a9add2="600"img/cyy_small.png50>

 

 

设置图像尺寸

ctx.drawImage(img,100,50,width,height);

后面新增两个参数填写图片的宽高

绘制图片
            原图400,*600,缩放为200*300
>

 

 

图片的裁剪,需要

ctx.drawImage(img,要裁剪的起始点坐标,要裁剪的宽高尺寸,绘制区域的起始点坐标,绘制区域的宽高尺寸);

裁剪出原图的0,0到400,400位置
            绘制到0,1)">等于是不进行缩放的效果
400>

 

 

裁剪+缩放0.5倍+移动100,100的效果

(){

      //绘制图片
      //从原图的0,0开始裁剪,宽高400,300
      //从100,100开始绘制,宽高为200,150

            ctx.drawImage(img,0,400,300,100,200,150);

        }
       
    
    >

 

 

图形画刷

首先是star.jpg长这样

 

 

img/star.jpg创建图形画刷,模式为repeat
             patternctx.createPattern(img,1)">repeat);
            ctx.fillStylepattern;

            绘制矩形,使用画刷填充
            ctx.fillRect(>

 

 

模式总共有四种:no-repeat  repeat-x  repeat-y  repeat

no-repeat的效果

no-repeat>

 

 

其他两个同理

 

总结

以上是小编为你收集整理的canvas中文字和图片的绘制全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

android TextView如何通过setCompoundDrawables调整文字和图片的位置(文字显示在图片内)?

android TextView如何通过setCompoundDrawables调整文字和图片的位置(文字显示在图片内)?

TextView可以通过setCompoundDrawables来设置图片显示在文字的上下左右的地方,但是如何调整文字和图片的位置呢?

 

1.通过定义XML方式实现

 

  1. <TextView   
  2.         android:id="@+id/txtMsg"  
  3.         android:layout_width="wrap_content"  
  4.         android:layout_height="wrap_content"         android:textSize="19px"  
  5.         android:gravity="center_horizontal"  
  6.         android:text="测试文字"  
  7.         android:drawablePadding="-20px"  //设置字体和图片之间的距离, 这是实现文字叠加显示在图片之上的关键点~  
  8.         android:drawableTop="@drawable/ic_launcher" // 设置图片显示在文字的上方  
  9.         />  
2.通过动态代码实现

 

 

  1. TextView v = new TextView(this.getApplicationContext());  
  2.  v.setCompoundDrawablePadding(-20);      
  3. v.setGravity(Gravity.CENTER_HORIZONTAL);     
  4. Drawable image = getResources().getDrawable(icons[i]);  
  5.   
  6. image.setBounds(00, image.getMinimumWidth(), image.getMinimumHeight());//非常重要,必须设置,否则图片不会显示  
  7. v.setCompoundDrawables(null,image, nullnull);              
  8. v.setText("测试文字");    
  9. v.setTextSize(TypedValue.COMPLEX_UNIT_PX,19);//设置字体大小为19px  
  10.  
  11.  

Android 使用Canvas在图片上绘制文字的方法

Android 使用Canvas在图片上绘制文字的方法

【Android】Android中 Paint 字体、粗细等属性的一些设置

在Android SDK中使用Typeface类来定义字体,可以通过常用字体类型名称进行设置,如设置默认黑体:

Paint mp = new paint();
mp.setTypeface(Typeface.DEFAULT_BOLD)

常用的字体类型名称还有:

* Typeface.DEFAULT //常规字体类型

* Typeface.DEFAULT_BOLD //黑体字体类型

* Typeface.MONOSPACE //等宽字体类型

* Typeface.SANS_SERIF //sans serif字体类型

* Typeface.SERIF //serif字体类型

除了字体类型设置之外,还可以为字体类型设置字体风格,如设置粗体:

Paint mp = new Paint();
Typeface font = Typeface.create(Typeface.SANS_SERIF,Typeface.BOLD);
p.setTypeface( font );

常用的字体风格名称还有:

* Typeface.BOLD //粗体

* Typeface.BOLD_ITALIC //粗斜体

* Typeface.ITALIC //斜体

* Typeface.norMAL //常规

但是有时上面那些设置在绘图过程中是不起作用的,所以还有如下设置方式:

Paint mp = new Paint();
mp.setFakeBoldText(true); //true为粗体,false为非粗体
mp.setTextSkewX(-0.5f);  //float类型参数,负数表示右斜,整数左斜
mp.setUnderlineText(true); //true为下划线,false为非下划线
mp.setStrikeThruText(true); //true为删除线,false为非删除线

Paint常用的方法还有:

mp.setTextSize(); //设置字体大小,int型,如12
mp.setstrokeWidth(w); //设置线宽,float型,如2.5f,默认绘文本无需设置(默认值好像为0),但假如设置了,再绘制文本的时候一定要恢复到0

说明:对于中文粗体的设置,好像只能通过setFakeBoldText(true)来实现,尽管效果看起来不是很实在(字体中空效果)。实际发现,最后绘制的效果与手机硬件也有些关系,比如前面的绘图测试程序.

一个小应用,在图片上绘制文字,以下是绘制文字的方法,并且能够实现自动换行,字体自动适配屏幕大小

private void drawNewBitmap(ImageView imageView,String str) {
   Bitmap photo = BitmapFactory.decodeResource(this.getResources(),R.drawable.background);
   int width = photo.getWidth();
   int hight = photo.getHeight();
   //建立一个空的Bitmap
   Bitmap icon = Bitmap.createBitmap(width,hight,Bitmap.Config.ARGB_8888);
   // 初始化画布绘制的图像到icon上
   Canvas canvas = new Canvas(icon);
   // 建立画笔
   Paint photoPaint = new Paint(); 
   // 获取更清晰的图像采样,防抖动
   photoPaint.setDither(true); 
   // 过滤一下,抗剧齿
   photoPaint.setFilterBitmap(true);
   
   Rect src = new Rect(0,photo.getWidth(),photo.getHeight());// 创建一个指定的新矩形的坐标
   Rect dst = new Rect(0,width,hight);// 创建一个指定的新矩形的坐标
   canvas.drawBitmap(photo,src,dst,photoPaint);// 将photo 缩放或则扩大到dst使用的填充区photoPaint
      //自定义的画笔
   TextPaint textPaint=myTextPaint();
      drawText(canvas,textPaint,str,45,hight/5,width);
   
   canvas.save(Canvas.ALL_SAVE_FLAG);
   canvas.restore();
   
   imageView.setimageBitmap(icon);
   saveMyBitmap(this,icon);
 }
//设置画笔的字体和颜色
 public TextPaint myTextPaint(){
   
   TextPaint textPaint = new TextPaint(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);// 设置画笔
   int TEXT_SIZE = Math.round(25 * getRATIO());
   textPaint.setTextSize(TEXT_SIZE);// 字体大小
    textPaint.setTypeface(Typeface.DEFAULT_BOLD);// 采用默认的宽度
    textPaint.setColor(Color.argb(255,94,38,18));// 采用的颜色
    return textPaint;
//写入文字,自动换行的方法
 public void drawText(Canvas canvas,TextPaint Paint,String textString,int x,int y,int width) { 
  //int Width=Math.round(width* getRATIO());
  int start_x=Math.round(x * getRATIO());
  int start_y=Math.round(y * getRATIO());
  StaticLayout staticLayout=new StaticLayout(textString,Paint,width-start_x*2,Alignment.ALIGN_norMAL,1.5f,0.0f,false); 
   
  //绘制的位置 
  canvas.translate(start_x,start_y); 
  staticLayout.draw(canvas); 
 }

以上这篇Android 使用Canvas在图片上绘制文字的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持编程小技巧。

您可能感兴趣的文章:

  • Android编程之绘图canvas基本用法示例
  • Android中Canvas的常用方法总结
  • Android canvas drawBitmap方法详解及实例
  • Android中Paint类和Canvas类的方法汇总

android 开发 View _12_ 用Canvas 绘制一张图片(博客中演示用Canvas画验证码图片)

android 开发 View _12_ 用Canvas 绘制一张图片(博客中演示用Canvas画验证码图片)

package net.yt.yuncare.widgets;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;

import java.lang.*;
import java.util.Random;

/**
 * Created by lenovo on 2018/5/14.
 */

public class Code {

    //随机数数组
    private static final char[] CHARS = {
            ''2'', ''3'', ''4'', ''5'', ''6'', ''7'', ''8'', ''9'',
            ''a'', ''b'', ''c'', ''d'', ''e'', ''f'', ''g'', ''h'', ''j'', ''k'', ''m'',
            ''n'', ''p'', ''q'', ''r'', ''s'', ''t'', ''u'', ''v'', ''w'', ''x'', ''y'', ''z'',
            ''A'', ''B'', ''C'', ''D'', ''E'', ''F'', ''G'', ''H'', ''I'', ''J'', ''K'', ''L'', ''M'',
            ''N'', ''P'', ''Q'', ''R'', ''S'', ''T'', ''U'', ''V'', ''W'', ''X'', ''Y'', ''Z''
    };

    private static Code bmpCode;

    public static Code getInstance() { //单例模式
        if(bmpCode == null)
            bmpCode = new Code();
        return bmpCode;
    }

    //default settings
    //验证码默认随机数的个数
    private static final int DEFAULT_CODE_LENGTH = 4;
    //默认字体大小
    private static final int DEFAULT_FONT_SIZE = 35;
    //默认线条的条数
    private static final int DEFAULT_LINE_NUMBER = 2;
    //padding值
    private static final int BASE_PADDING_LEFT = 10, RANGE_PADDING_LEFT = 15, BASE_PADDING_TOP = 15, RANGE_PADDING_TOP = 20;
    //验证码的默认宽高
    private static final int DEFAULT_WIDTH = 100, DEFAULT_HEIGHT = 40;

    //settings decided by the layout xml
    //canvas width and height
    private int width = DEFAULT_WIDTH, height = DEFAULT_HEIGHT;

    //random word space and pading_top
    private int base_padding_left = BASE_PADDING_LEFT, range_padding_left = RANGE_PADDING_LEFT,
            base_padding_top = BASE_PADDING_TOP, range_padding_top = RANGE_PADDING_TOP;

    //number of chars, lines; font size
    private int codeLength = DEFAULT_CODE_LENGTH, line_number = DEFAULT_LINE_NUMBER, font_size = DEFAULT_FONT_SIZE;

    //variables
    private String code;
    private int padding_left, padding_top;
    private Random random = new Random();
    //生成验证码图片  在外部Image调用,用setImageBitmap添加图片到ImageView控件中
    public Bitmap createBitmap() {
        padding_left = 0;
        //重点:创建Bt图片
        Bitmap bp = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); //
        Canvas c = new Canvas(bp);//创建画板导入bt图片

        code = createCode();

        c.drawColor(Color.WHITE);//添加画板背景色为白色
        Paint paint = new Paint();//创建画笔
        paint.setAntiAlias(true);
        paint.setTextSize(font_size);//设置画笔大小
        //画验证码
        for (int i = 0; i < code.length(); i++) {
            randomTextStyle(paint); //画笔传入生成随机样式
            randomPadding();
            c.drawText(code.charAt(i) + "", padding_left, padding_top, paint);
        }
        //画线条
        for (int i = 0; i < line_number; i++) {
            drawLine(c, paint);
        }

        c.save( Canvas.ALL_SAVE_FLAG );//保存
        c.restore();//
        return bp;
    }

    public String getCode() {
        return code;
    }

    //生成验证码
    private String createCode() {
        StringBuilder buffer = new StringBuilder();
        for (int i = 0; i < codeLength; i++) {
            buffer.append(CHARS[random.nextInt(CHARS.length)]);
        }
        return buffer.toString();
    }
    //画干扰线
    private void drawLine(Canvas canvas, Paint paint) {
        int color = randomColor();
        int startX = random.nextInt(width);
        int startY = random.nextInt(height);
        int stopX = random.nextInt(width);
        int stopY = random.nextInt(height);
        paint.setStrokeWidth(1);
        paint.setColor(color);
        canvas.drawLine(startX, startY, stopX, stopY, paint);
    }
    //生成随机颜色
    private int randomColor() {
        return randomColor(1);
    }

    private int randomColor(int rate) {
        int red = random.nextInt(256) / rate;
        int green = random.nextInt(256) / rate;
        int blue = random.nextInt(256) / rate;
        return Color.rgb(red, green, blue);
    }
    //随机生成文字样式,颜色,粗细,倾斜度
    private void randomTextStyle(Paint paint) {
        int color = randomColor();
        paint.setColor(color);
        paint.setFakeBoldText(random.nextBoolean());  //true为粗体,false为非粗体
        //float skewX = random.nextInt(11) / 10;
        //skewX = random.nextBoolean() ? skewX : -skewX;
        //paint.setTextSkewX(skewX); //float类型参数,负数表示右斜,整数左斜
        //paint.setUnderlineText(true); //true为下划线,false为非下划线
        //paint.setStrikeThruText(true); //true为删除线,false为非删除线
    }
    //随机生成padding值
    private void randomPadding() {
        padding_left += base_padding_left + random.nextInt(range_padding_left);
        padding_top = base_padding_top + random.nextInt(range_padding_top);
    }
}

 

 

 

Android实现自定义带文字和图片的Button

Android实现自定义带文字和图片的Button

一.用系统自带的Button实现

  最简单的一种办法就是利用系统自带的Button来实现,这种方式代码量最小。在Button的属性中有一个是drawableLeft,这个属性可以把图片设置在文字的左边,但是这种方式必须让icon的背景色是透明的,如果icon的背景色不是透明的话,会导致点击按钮时icon部分的背景色不会发生变化。

<Button 
    android:id="@+id/bt3"
    android:layout_marginTop="4dp"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="火车"
    android:textSize="16sp"
    android:textColor="#000000"
    android:paddingLeft="5dp"
    android:paddingTop="5dp"
    android:paddingRight="5dp"
    android:paddingBottom="5dp"
    android:drawableLeft="@drawable/line_bus_icon"
    android:background="@drawable/button_bg">
  </Button>

实现效果:

  

  如果要让文字在图标下方,改成drawableTop即可。 

二.继承系统的Button然后进行重绘

package com.test;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.widget.Button;


public class ImageTextButton2 extends Button {
    
    
    private int resourceId = 0;
    private Bitmap bitmap;
    
    public ImageTextButton2(Context context) {
        super(context,null);
    }
    
    public ImageTextButton2(Context context,AttributeSet attributeSet) {
        super(context, attributeSet);
        this.setClickable(true);
        resourceId = R.drawable.icon;
        bitmap = BitmapFactory.decodeResource(getResources(), resourceId);
    }
    
    public void setIcon(int resourceId) 
    {
        this.bitmap = BitmapFactory.decodeResource(getResources(), resourceId);
        invalidate();
    }
    
    @Override
    protected void onDraw(Canvas canvas) {
        // TODO Auto-generated method stub
        
        // 图片顶部居中显示
        int x = (this.getMeasuredWidth() - bitmap.getWidth())/2;
        int y = 0;
        canvas.drawBitmap(bitmap, x, y, null);
        // 坐标需要转换,因为默认情况下Button中的文字居中显示
        // 这里需要让文字在底部显示
        canvas.translate(0,(this.getMeasuredHeight()/2) - (int) this.getTextSize());
        super.onDraw(canvas);
    }
    
    
}

然后再布局文件中调用:

<com.test.ImageTextButton2
   android:id="@+id/bt2"
   android:layout_marginTop="10dp"
   android:text="hello"
   android:textSize="15dp"
   android:textColor="#000000"
   android:layout_width="60dp"
   android:layout_height="70dp"
   android:background="@drawable/button_bg"
  />

注意,在xml文件中调用时,对于layout_width和layout_height两个属性千万不能用wrap_content,否则会导致按钮显示出来的只有文字部分。

三.继承布局文件

  分析发现一个带文字和icon的button其实可以看成一个线性布局或相对布局,因此可以继承布局来实现。

  先实现一个button的布局文件img_text_bt.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content">
  
  <ImageView
   android:id="@+id/imgview"
   android:layout_alignParentTop="true"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_centerInParent="true"
   android:src="@drawable/icon">
  </ImageView>
  
  <TextView
   android:id="@+id/textview"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:layout_centerInParent="true"
   android:layout_below="@id/imgview">
  </TextView>
  
</RelativeLayout>

然后去继承RelativeLayout布局:

package com.test;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class ImageTextButton1 extends RelativeLayout {
    
    private ImageView imgView;  
    private TextView  textView;

    public ImageTextButton1(Context context) {
        super(context,null);
    }
    
    public ImageTextButton1(Context context,AttributeSet attributeSet) {
        super(context, attributeSet);
        
        LayoutInflater.from(context).inflate(R.layout.img_text_bt, this,true);
        
        this.imgView = (ImageView)findViewById(R.id.imgview);
        this.textView = (TextView)findViewById(R.id.textview);
        
        this.setClickable(true);
        this.setFocusable(true);
    }
    
    public void setImgResource(int resourceID) {
        this.imgView.setImageResource(resourceID);
    }
    
    public void setText(String text) {
        this.textView.setText(text);
    }
    
    public void setTextColor(int color) {
        this.textView.setTextColor(color);
    }
    
    public void setTextSize(float size) {
        this.textView.setTextSize(size);
    }
    
}

然后就可以在需要的xml文件中调用:

<com.test.ImageTextButton1 
   android:id="@+id/bt1"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:background="@drawable/button_bg"
/>

再在Activity中使用:

bt1 = (ImageTextButton1)findViewById(R.id.bt1);
        bt1.setText("icon");
        bt1.setTextColor(Color.rgb(0, 0, 0));
        bt1.setOnClickListener(new OnClickListener() {
            
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                Toast.makeText(MainActivity.this, "bt1被点击了", Toast.LENGTH_SHORT).show();
            }
        });

三种不同方法最后的运行效果:


关于canvas中文字和图片的绘制canvas绘制文字在图片上的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于android TextView如何通过setCompoundDrawables调整文字和图片的位置(文字显示在图片内)?、Android 使用Canvas在图片上绘制文字的方法、android 开发 View _12_ 用Canvas 绘制一张图片(博客中演示用Canvas画验证码图片)、Android实现自定义带文字和图片的Button的相关知识,请在本站寻找。

本文标签: