Android绘图实例(Bitmmap,Canvas,Pain的使用)动态的在图片上添加文字(canvas.drawText)

本文主要是介绍Android绘图实例(Bitmmap,Canvas,Pain的使用)动态的在图片上添加文字(canvas.drawText),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

近些天学习图像处理,今天看见了一段代码中有Bitmap时,找了些Bitmap的资料,有查看了与之有关的绘图类。

BitMap代表一张位图,BitmapDrawable里封装的图片就是一个Bitmap对象,开发者被一个Bitmap对象包装成BitmapDrawable对象,可以调用BitmapDrawable的构造器。

//把一个Bitmap对象包装成BitmapDrawable对象
BitmapDrawable drawable = newBitmapDrawable(bitmap);

如果需要获取BitmapDrawable所包装的Bitmap对象,则可调用BitmapDrawable的getBitmap()方法

//获取一个BitmapDrawable所包装的Bitmap对象
Bitmap bitmap = drawabel.getBitmap();

除此之外,Bitmap还提供一些静态方法来创建新的Bitmap对象,列如如下常用方法。
createBitmap(Bitmap source, int x, int y, int width, int height);从源位图source的指定坐标(给定,x,y)开始,从中“挖取”宽width,高height的一块出来,创新的Bitmap对象。


createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter);对源位图src进行缩放,缩放成宽dstWidth,高dstHeight的位图。

createBitmap(int width, int height, Bitmap.Config config):创建一个宽width,高height的新位图


createBitmap(Bitmap source, int x, int y, int width, int height, Matrizm m, boolean filter):从源位图source的指定坐标点(给定,x,y)开始,从中“挖取”宽width,高height的一块出来,创建新的Bitmap对象。并按Matrix指定的规则进行转化。

自己做了一个宇宙飞船的Demo:通过每次重新绘制图片改变飞行背景,根据飞行高度判读飞行区域,动态添加文字。

效果如:


代码:(没有使用xml布局)

import java.util.Timer;
import java.util.TimerTask;import android.R.bool;
import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Paint.FontMetrics;
import android.graphics.Typeface;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.DisplayMetrics;
import android.view.View;
import android.widget.Toast;
/*** Matrix ,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放、平移、旋转等操作。 * Matrix的操作,总共分为四种:translate(X,Y)(平移到坐标X,Y),* rotate(X)(旋转X度),* scale(缩放)* skew(倾斜)* 每一种变换在Android的API里都提供了set, post和pre三种操作方式,除了translate,其他三种操作都可以指定中心点。 * set是直接设置Matrix的值,每次set一次,整个Matrix的数组都会变掉。 * post是后乘,当前的矩阵乘以参数给出的矩阵。可以连续多次使用post,来完成所需的整个变换。* pre是前乘,参数给出的矩阵乘以当前的矩阵。所以操作是在当前矩阵的最前面发生的。* 坐标中心一半是左上角* */
public class MoveBack extends Activity {/*** DisplayMetrics metrics=getWindowManager().getDefaultDisplay().getMetrics(metrics);* metrics.widthPixels           屏幕宽* metrics.heightPixels          屏幕高* metrics.density               屏幕密度* */DisplayMetrics dm;private int screenWidth;private int screenHight;private String text = "宇宙旅行";@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);dm = new DisplayMetrics();getWindowManager().getDefaultDisplay().getMetrics(dm);screenHight = dm.heightPixels;screenWidth = dm.widthPixels;setContentView(new MyView(this));}//自定义视图class MyView extends View {// 记录背景位图的实际高度int BACK_HEIGHT = 1186;// 背景图片private Bitmap back;private Bitmap plane;// 背景图片的开始位置int WIDTH;int HEIGHT;//飞机的位置int fWIDTH;int fHEIGHT;private int startY;public MyView(Context context) {super(context);back = BitmapFactory.decodeResource(context.getResources(),R.drawable.back2);plane = BitmapFactory.decodeResource(context.getResources(),R.drawable.plane);System.out.println(String.valueOf(back.getHeight()) + "TO"+ String.valueOf(back.getWidth()));System.out.println(screenHight + "TO" + screenWidth);BACK_HEIGHT = back.getHeight();//将图片的大小设置成和屏幕大小一样的WIDTH = dm.widthPixels;HEIGHT = dm.heightPixels;fHEIGHT = plane.getHeight();fWIDTH = plane.getWidth();startY = BACK_HEIGHT - HEIGHT;System.out.println(startY);final Handler handler = new Handler() {public void handleMessage(Message msg) {if (msg.what == 0x123) {// 重新开始移动fly(startY, BACK_HEIGHT);//判断StartY是否在onDraw时大于0if (startY <= 2) {startY = BACK_HEIGHT - HEIGHT;} else {//用户控制飞行速度startY -= 3;}}invalidate();}};new Timer().schedule(new TimerTask() {@Overridepublic void run() {handler.sendEmptyMessage(0x123);}}, 0, 100);invalidate();}@Overridepublic void onDraw(Canvas canvas) {//根据原始位图和Matrix创建新图片Bitmap bitmap2 = Bitmap.createBitmap(back, 0, startY, WIDTH, HEIGHT);Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);paint.setTextSize(30);paint.setStrokeWidth(2);paint.setColor(Color.CYAN);//绘制宇宙背景canvas.drawBitmap(bitmap2, 0, 0, null);//绘制飞船canvas.drawBitmap(plane, (float) (WIDTH - fWIDTH) / 2f,(float) (HEIGHT - fHEIGHT - 50), null);//在图片上动态的添加文字canvas.drawText(text, dm.widthPixels/2-text.length()*30/2, dm.heightPixels/2, paint);}}/*** @param n当前位置* @param l宇宙长短* @return 判断出飞船进入那个星系* */public void fly(int n, int l){switch (n/(l/5)) {case 0:text = "进入仙女座";break;case 1:text = "进入射手座";break;case 2:text = "进入天蝎座";break;case 3:text = "进入人马座";break;case 4:text = "进入银河系";break;default:break;}}
}


这篇关于Android绘图实例(Bitmmap,Canvas,Pain的使用)动态的在图片上添加文字(canvas.drawText)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/693623

相关文章

AI绘图怎么变现?想做点副业的小白必看!

在科技飞速发展的今天,AI绘图作为一种新兴技术,不仅改变了艺术创作的方式,也为创作者提供了多种变现途径。本文将详细探讨几种常见的AI绘图变现方式,帮助创作者更好地利用这一技术实现经济收益。 更多实操教程和AI绘画工具,可以扫描下方,免费获取 定制服务:个性化的创意商机 个性化定制 AI绘图技术能够根据用户需求生成个性化的头像、壁纸、插画等作品。例如,姓氏头像在电商平台上非常受欢迎,

中文分词jieba库的使用与实景应用(一)

知识星球:https://articles.zsxq.com/id_fxvgc803qmr2.html 目录 一.定义: 精确模式(默认模式): 全模式: 搜索引擎模式: paddle 模式(基于深度学习的分词模式): 二 自定义词典 三.文本解析   调整词出现的频率 四. 关键词提取 A. 基于TF-IDF算法的关键词提取 B. 基于TextRank算法的关键词提取

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

Hadoop数据压缩使用介绍

一、压缩原则 (1)运算密集型的Job,少用压缩 (2)IO密集型的Job,多用压缩 二、压缩算法比较 三、压缩位置选择 四、压缩参数配置 1)为了支持多种压缩/解压缩算法,Hadoop引入了编码/解码器 2)要在Hadoop中启用压缩,可以配置如下参数

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

第10章 中断和动态时钟显示

第10章 中断和动态时钟显示 从本章开始,按照书籍的划分,第10章开始就进入保护模式(Protected Mode)部分了,感觉从这里开始难度突然就增加了。 书中介绍了为什么有中断(Interrupt)的设计,中断的几种方式:外部硬件中断、内部中断和软中断。通过中断做了一个会走的时钟和屏幕上输入字符的程序。 我自己理解中断的一些作用: 为了更好的利用处理器的性能。协同快速和慢速设备一起工作

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

动态规划---打家劫舍

题目: 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。 思路: 动态规划五部曲: 1.确定dp数组及含义 dp数组是一维数组,dp[i]代表

高效录音转文字:2024年四大工具精选!

在快节奏的工作生活中,能够快速将录音转换成文字是一项非常实用的能力。特别是在需要记录会议纪要、讲座内容或者是采访素材的时候,一款优秀的在线录音转文字工具能派上大用场。以下推荐几个好用的录音转文字工具! 365在线转文字 直达链接:https://www.pdf365.cn/ 365在线转文字是一款提供在线录音转文字服务的工具,它以其高效、便捷的特点受到用户的青睐。用户无需下载安装任何软件,只

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo