源  起

  最近在写一个类似“围住神经猫”的应用,现在需要给一个可以移动的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元素指定图片的方法的更多相关文章

  1. Android开发中,那些让您觉得相见恨晚的方法、类或接口

    Android开发中,那些让你觉得相见恨晚的方法.类或接口本篇文章内容提取自知乎Android开发中,有哪些让你觉得相见恨晚的方法.类或接口?,其实有一部是JAVA的,但是在android开发中也算常 ...

  2. Android开发中如何解决加载大图片时内存溢出的问题

    Android开发中如何解决加载大图片时内存溢出的问题    在Android开发过程中,我们经常会遇到加载的图片过大导致内存溢出的问题,其实类似这样的问题已经屡见不鲜了,下面将一些好的解决方案分享给 ...

  3. Android开发调试无法连接到夜神模拟器的解决方法

    Android开发调试无法连接到夜神模拟器的解决方法: 一般原因是adb的版本不一致造成的!!!!!换成一样的就可以了. 在网上看到的方法,特记录下来: 1.任务管理器里看下,adb.exe以及nox ...

  4. Android零基础入门第17节:Android开发第一个控件,TextView属性和方法大全

    原文:Android零基础入门第17节:Android开发第一个控件,TextView属性和方法大全 前面简单学习了一些Android UI的一些基础知识,那么接下来我们一起来详细学习Android的 ...

  5. Android开发中使用七牛云存储进行图片上传下载

    Android开发中的图片存储本来就是比较耗时耗地的事情,而使用第三方的七牛云,便可以很好的解决这些后顾之忧,最近我也是在学习七牛的SDK,将使用过程在这记录下来,方便以后使用. 先说一下七牛云的存储 ...

  6. Android开发中常见的内存泄露案例以及解决方法总结

    1.单例模式引起的内存泄露 由于单例模式的静态特性,使得它的生命周期和我们的应用一样长,如果让单例无限制的持有Activity的强引用就会导致内存泄漏如错误代码示例: public class Use ...

  7. Android开发中,那些让你觉得相见恨晚的方法、类或接口

    Throwable类中的getStackTrace()方法,根据这个方法可以得到函数的逐层调用地址,其返回值为StackTraceElement[],而在StackTraceElement类中有四个方 ...

  8. Android开发技巧——TextView加载HTML的图片及代码显示问题

    前几天在做一个Gradle用户指南的应用程序,使用的是TextView来加载HTML内容(至于为什么不用WebView,我也没有认真使用并比较过,也许以后会换吧),其中遇见了一些纠结的问题,所幸主要的 ...

  9. Android 10不能使用uiautomatorviewer定位元素的终极解决方法

    Android app 元素定位除了使用Appium Inspector 外,还可以使用Android SDK 里tools中的uiautomatorviewer 工具.但今天打算使用 uiautom ...

随机推荐

  1. C++基础和STL,Effective C++笔记

    这个作者总结的c++基础,特别好. 可以看看. http://blog.csdn.net/tham_/article/details/51169792

  2. 20172330 2017-2018-1 《Java程序设计》第四周学习总结

    20172330 2017-2018-1 <Java程序设计>第四周学习总结 教材学习内容总结 这一周的内容还是比较多的,而且很复杂,包含第四和第七章. 第四章向我们介绍了类结构的定义与概 ...

  3. BluetoothClass详解

    一. BluetoothClass简介 1. 继承关系 public final class BluetoothClass extends Object implements Parcelable 该 ...

  4. Swift as as!和as?的区别

    1.as的使用场合 1.从派生类转换为基类,向上转类型(upcasting) class Animal{} class Dog:Animal{} let cat = ANimal() let dog ...

  5. asp.net 后台注册(调用)JS

    1.使用Page.ClientScript.RegisterClientScriptBlock 使用 Page.ClientScript.RegisterClientScriptBlock可以防止ja ...

  6. Delphi 制作自定义数据感知控件并装入包(dpk文件)中(与DBText类似的数据感知控件)

    一.基础知识简介: 1.包的命名介绍: 包的命名没有规则,但是建议遵守包的命名约定:包的命名与包的版本相关,包的名称前面几个字符通常表示作者或公司名,也可以是控件的一个描述词,后面紧跟的Std表示运行 ...

  7. 深入理解java内置锁(synchronized)和显式锁(ReentrantLock)

    多线程编程中,当代码需要同步时我们会用到锁.Java为我们提供了内置锁(synchronized)和显式锁(ReentrantLock)两种同步方式.显式锁是JDK1.5引入的,这两种锁有什么异同呢? ...

  8. poj1474 Video Surveillance

    题意:求多边形的内核,即:在多边形内部找到某个点,使得从这个点能不受阻碍地看到多边形的所有位置. 只要能看到所有的边,就能看到所有的位置.那么如果我们能够在多边形的内部的点x看到某条边AB,这个点x一 ...

  9. hdu 1142 A Walk Through the Forest (最短路径)

    A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

  10. [洛谷P3550][POI2013]TAK-Taxis

    题目大意:一条路上有三个点,$0$为起始位置,$d$为总部,$m$为家.有$n$辆车,每辆车最多行驶$x_i$,都从$d$出发,可以在任意位置结束,问最少几辆车可以到家. 题解:贪心,发现当人在$[0 ...