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

相关文章

使用Python实现可恢复式多线程下载器

《使用Python实现可恢复式多线程下载器》在数字时代,大文件下载已成为日常操作,本文将手把手教你用Python打造专业级下载器,实现断点续传,多线程加速,速度限制等功能,感兴趣的小伙伴可以了解下... 目录一、智能续传:从崩溃边缘抢救进度二、多线程加速:榨干网络带宽三、速度控制:做网络的好邻居四、终端交互

Python中注释使用方法举例详解

《Python中注释使用方法举例详解》在Python编程语言中注释是必不可少的一部分,它有助于提高代码的可读性和维护性,:本文主要介绍Python中注释使用方法的相关资料,需要的朋友可以参考下... 目录一、前言二、什么是注释?示例:三、单行注释语法:以 China编程# 开头,后面的内容为注释内容示例:示例:四

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

使用Python绘制3D堆叠条形图全解析

《使用Python绘制3D堆叠条形图全解析》在数据可视化的工具箱里,3D图表总能带来眼前一亮的效果,本文就来和大家聊聊如何使用Python实现绘制3D堆叠条形图,感兴趣的小伙伴可以了解下... 目录为什么选择 3D 堆叠条形图代码实现:从数据到 3D 世界的搭建核心代码逐行解析细节优化应用场景:3D 堆叠图

java向微信服务号发送消息的完整步骤实例

《java向微信服务号发送消息的完整步骤实例》:本文主要介绍java向微信服务号发送消息的相关资料,包括申请测试号获取appID/appsecret、关注公众号获取openID、配置消息模板及代码... 目录步骤1. 申请测试系统2. 公众号账号信息3. 关注测试号二维码4. 消息模板接口5. Java测试

Springboot如何正确使用AOP问题

《Springboot如何正确使用AOP问题》:本文主要介绍Springboot如何正确使用AOP问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录​一、AOP概念二、切点表达式​execution表达式案例三、AOP通知四、springboot中使用AOP导出

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN