Android开发——为移动的Paint元素指定图片的方法
源 起
最近在写一个类似“围住神经猫”的应用,现在需要给一个可以移动的Paint元素指定一张图片,如下图,要把黄点改成其他图片;
Paint所在的类继承于SurfaceView,SurfaceView可以直接从内存等硬件接口获取图像数据,速度很快;然后再implements 一个OnTouchListener接口来监听触摸事件;

过 程
最初找到很多方法,给playground添加图片、给Activity添加图片、另写一个工具类加载图片。。。都很繁琐,而且代码加进去运行的时候总是Crash,可能是自己操作存在问题,这些方法都没有实现想要的效果;
后来发现,只需要在redraw() 函数中添加几行代码~
图像绘制函数redraw() 的代码是这样写的,功能是设置路障圆点、路径圆点和一个移动圆点的颜色:
public void redraw(){
// 绘制
Canvas c = getHolder().lockCanvas();
//c.drawColor(Color.LTGRAY); // 绘制浅灰色背景界面
c.drawColor(Color.DKGRAY); // 绘制浅灰色背景界面
//c.drawBitmap(resizeBitmap(xrd, getWidth(), getHeight()), 0, 0, null);// 设置背景图片s
size = (ROW / 3) * (getWidth() / 9 - WIDTH);// 将格子向下平移
// 绘制所有的点到Activity
Paint paint = new Paint();
// 开启画面抗锯齿,必须写在点生成之前
paint.setFlags(Paint.ANTI_ALIAS_FLAG);
for (int i = 0; i < ROW-1; i++) {
// 进行奇数行\偶数行的判断
int offset = 0;
if (i % 2 != 0) {
offset = WIDTH /2; // 偶数行宽度缩进半个点
}
for (int j = 0; j < COL-1; j++) {
Dot one = getDot(j, i);
switch (one.getStatus()) {
case Dot.STATUS_OFF:
//paint.setColor(0xFFEEEEEE);// 完全不透明,颜色浅灰色
//paint.setColor(Color.GRAY);// 浅灰色
paint.setColor(Color.rgb(165, 165, 165));
// 设定好颜色之后,开始在 canvas上面绘制, RectF是绘制 椭圆,循环绘制100个
c.drawOval(new RectF(one.getX()*WIDTH+offset, one.getY()*WIDTH,
//右侧边界
(one.getX()+1)*WIDTH+offset, (one.getY()+1)*WIDTH), paint);
break;
case Dot.STATUS_ON: // 路障颜色
//paint.setColor(0xFFFFAA00); // 0xFF透明度 FFAA00黄色
paint.setColor(Color.rgb(147, 117, 27));
c.drawOval(new RectF(one.getX()*WIDTH+offset, one.getY()*WIDTH,
//右侧边界
(one.getX()+1)*WIDTH+offset, (one.getY()+1)*WIDTH), paint);
break;
case Dot.STATUS_IN:
paint.setColor(Color.YELLOW);
c.drawOval(new RectF(one.getX()*WIDTH+offset, one.getY()*WIDTH,
//右侧边界
(one.getX()+1)*WIDTH+offset, (one.getY()+1)*WIDTH), paint);
// paint.setColor(getResources().getColor(android.R.color.black));
break;
default:
break;
}
}
}
现在只需在redraw()函数的 case Dot.STATUS_IN: 之下写入如下几行代码即可:
Resources res = getResources();
Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.happy_huge);
Rect rect = new Rect(0, bmp.getHeight(), bmp.getWidth(), 0);
c.drawBitmap(bmp,null, new RectF(one.getX()*WIDTH+offset, one.getY()*WIDTH,
(one.getX()+1)*WIDTH+offset, (one.getY()+1)*WIDTH), paint);
记得图片要先加载到drawable中,这里已把图片处理为透明的png格式;
这段代码的原理是:实例化一个Resources,通过Bitmap读取Resources和R.drawable,然后使用Rect类设定范围,再通过Canvas的drawBitmap()函数绘制出来就可以了~
按下Ctrl+F11;
接下来就是见证奇迹的时刻~

有 待 完 善
需求已然实现,目前将近500行代码,不过我打算继续实现如下效果:
1、自定义难易度;
2、围住之后弹窗加载一张图片;
3、把移动的元素改成动态gif。
BTW:
虽然我一次就把他围住了,但那是因为自己了解代码算法的缘故,否则是无法一次性围住的,不过可以增加随机性,这样就算了解算法也无法百分百围住,搭配漫画表情更增新趣味~
Android开发——为移动的Paint元素指定图片的方法的更多相关文章
- Android开发中,那些让您觉得相见恨晚的方法、类或接口
Android开发中,那些让你觉得相见恨晚的方法.类或接口本篇文章内容提取自知乎Android开发中,有哪些让你觉得相见恨晚的方法.类或接口?,其实有一部是JAVA的,但是在android开发中也算常 ...
- Android开发中如何解决加载大图片时内存溢出的问题
Android开发中如何解决加载大图片时内存溢出的问题 在Android开发过程中,我们经常会遇到加载的图片过大导致内存溢出的问题,其实类似这样的问题已经屡见不鲜了,下面将一些好的解决方案分享给 ...
- Android开发调试无法连接到夜神模拟器的解决方法
Android开发调试无法连接到夜神模拟器的解决方法: 一般原因是adb的版本不一致造成的!!!!!换成一样的就可以了. 在网上看到的方法,特记录下来: 1.任务管理器里看下,adb.exe以及nox ...
- Android零基础入门第17节:Android开发第一个控件,TextView属性和方法大全
原文:Android零基础入门第17节:Android开发第一个控件,TextView属性和方法大全 前面简单学习了一些Android UI的一些基础知识,那么接下来我们一起来详细学习Android的 ...
- Android开发中使用七牛云存储进行图片上传下载
Android开发中的图片存储本来就是比较耗时耗地的事情,而使用第三方的七牛云,便可以很好的解决这些后顾之忧,最近我也是在学习七牛的SDK,将使用过程在这记录下来,方便以后使用. 先说一下七牛云的存储 ...
- Android开发中常见的内存泄露案例以及解决方法总结
1.单例模式引起的内存泄露 由于单例模式的静态特性,使得它的生命周期和我们的应用一样长,如果让单例无限制的持有Activity的强引用就会导致内存泄漏如错误代码示例: public class Use ...
- Android开发中,那些让你觉得相见恨晚的方法、类或接口
Throwable类中的getStackTrace()方法,根据这个方法可以得到函数的逐层调用地址,其返回值为StackTraceElement[],而在StackTraceElement类中有四个方 ...
- Android开发技巧——TextView加载HTML的图片及代码显示问题
前几天在做一个Gradle用户指南的应用程序,使用的是TextView来加载HTML内容(至于为什么不用WebView,我也没有认真使用并比较过,也许以后会换吧),其中遇见了一些纠结的问题,所幸主要的 ...
- Android 10不能使用uiautomatorviewer定位元素的终极解决方法
Android app 元素定位除了使用Appium Inspector 外,还可以使用Android SDK 里tools中的uiautomatorviewer 工具.但今天打算使用 uiautom ...
随机推荐
- 《Linux/UNIX系统编程手册》读书笔记
2018-1-30 一.UNIX.C语言以及Linux的历史回顾 1. UNIX简史.C语言的诞生 1969年,贝尔实验室的Ken Thompson首次实现了UNIX系统. 1973年,C语言步入成熟 ...
- 最多水容器(M)
题目 给定n个非负整数a 1,a 2,...,a n,其中每个代表坐标(i,a i)处的一个点.绘制n条垂直线,使得线i的两个端点处于(i,a i)和(i,0)处.找到两条线,它们与x轴一起形成一个容 ...
- 这些JavaScript编程黑科技,装逼指南,高逼格代码,让你惊叹不已
Javascript是一门很吊的语言,我可能学了假的JavaScript,哈哈,大家还有什么推荐的,补充送那啥邀请码. 本文秉承着:你看不懂是你SB,我写的代码就要牛逼. 1.单行写一个评级组件 &q ...
- bpf程序
bpf都是怎么起作用的? 记得bpf之前是绑定在bpf bpf作用在哪里呀?
- EasyUI 学习笔记
EasyUI常见错误 1 . 无论是用HMTL形式实现组件还是使用代码 + HTML 形式实现组件 , 在为组件设置属性时 , 要注意属性值的类型问题 string:必须加引号 number:不加任何 ...
- linux路由表的配置
linux路由表的配置 一.原理说明 1.路由表(table)从0到255进行编号,每个编号可以对应一个别名,编号和别名的对应关系在linux下放在/etc/iproute2/rt_tables这个文 ...
- DBGrid相关技术整理
DBGrid相关技术整理: 注:对于DBGrid相关属性.方法的学习融入到技术整理过程中 一,多选 设置属性: Options->dgMultiSelect = True; ->dgRow ...
- 第20天:京东nav、footer部分制作
一.鼠标的4种状态 cursor:pointer; 鼠标变成小手cursor:default;小白cursor:move;移动cursor:text;文本输入 二.网页布局:1.input.butto ...
- NOIP2002 提高组
[NOIP2002] 提高组 T1.均分纸牌 算法:贪心(模拟) [分析]: 1.简化 2.过滤 3.辩证法 详见课件的例7 还有一种类似的思路是:求出平均值后,i←1 to n-1扫描,若a[i] ...
- (二)Redis字符串String操作
String全部命令如下: set key value # 设置一个key的value值 get key # 获取key的value值 mset key1 value1 key2 value2 ... ...