Android开发——为移动的Paint元素指定图片的方法

  最近在写一个类似“围住神经猫”的应用,需要给一个可以移动的Paint元素指定一张图片,如下图,要把黄点改成其他图片;

  所在的类继承于SurfaceView,SurfaceView可以直接从内存或者DMA等硬件接口取得图像数据,速度非常快,然后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:虽然我一次就把他围住了,但那是因为代码是自己写的,了解其中算法的缘故,否则是无法一次性围住的,搭配漫画表情更增新趣味~

时间: 2024-10-13 11:31:35

Android开发——为移动的Paint元素指定图片的方法的相关文章

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

Android开发调试无法连接到夜神模拟器的解决方法: 一般原因是adb的版本不一致造成的!!!!!换成一样的就可以了. 在网上看到的方法,特记录下来: 1.任务管理器里看下,adb.exe以及nox_adb.exe这2个进程有没有在运行?有的话就结束掉. 2.找到开发环境的SDK的目录和夜神模拟器的目录,将SDK目录下的adb.exe文件,复制到夜神模拟器的目录下,因为夜神模拟器目录下原本的adb文件名字叫做nox_adb.exe,因此复制过去之后也得改名为nox_adb.exe. 3.这样开

Android中WebView获取网页中标题 ,内容, 图片的方法

如题,在Android中WebView获取网页中标题 ,内容, 图片的方法 首先是获取标题,在new WebChromeClient(){}中重写onReceivedTitle()方法 @Override public void onReceivedTitle(WebView view, String title) { super.onReceivedTitle(view, title); // loge.e("__页面标题__"+title); } 获取内容,是参考的这边的 http

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

本篇文章内容提取自知乎android开发中,有哪些让你觉得相见恨晚的方法.类或接口?,其实有一部是JAVA的,但是在android开发中也算常见.大多数的函数自己还是见过的,这里记录一下备忘.同时呢,也推荐一个github项目,里面记录了自己日常开发中见过的比较有用的东西开发中常用的工具.链接 Throwable类中的getStackTrace()方法,根据这个方法可以得到函数的逐层调用地址,其返回值为StackTraceElement[],而在StackTraceElement类中有四个方法g

Android开发笔记(九十八)往图片添加部件

添加圆角 添加圆角的功能,要用到Canvas类的drawRoundRect方法,即把画布裁剪成指定的圆角矩形. 下面是给图片添加圆角的效果截图: 下面是给图片添加圆角的代码片段: public static Bitmap getRoundImage(Bitmap bitmap, int roundPixels) { //创建一个和原始图片一样大小位图 Bitmap roundConcerImage = Bitmap.createBitmap(bitmap.getWidth(), bitmap.g

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

Android开发中的图片存储本来就是比较耗时耗地的事情,而使用第三方的七牛云,便可以很好的解决这些后顾之忧,最近我也是在学习七牛的SDK,将使用过程在这记录下来,方便以后使用. 先说一下七牛云的存储原理,上面这幅图片是官方给出的原理图,表述当然比较清晰了.可以看出,要进行图片上传的话可以分为五大步: 1. 客户端用户登录到APP的账号系统里面: 2. 客户端上传文件之前,需要向业务服务器申请七牛的上传凭证,这个凭证由业务服务器使用七牛提供的服务端SDK生成: 3. 客户端使用七牛提供的客户端S

android开发隐藏了actionbar仍然短暂闪现的解决方法

有时候我们在代码里隐藏了actionbar,在打开应用时,仍然短暂闪现下actionbar,用户体验很不好. 最简单的方法是 在AndroidManifest.xml中设置主题中配置不显示title或者action,即为: <style name="NoTitle" parent="android:Theme.Holo.Light"> <item name="android:windowActionBar">true<

Android开发 - ImageView加载Base64编码的图片

在我们开发应用的过程中,并不是所有情况下都请求图片的URL或者加载本地图片,有时我们需要加载Base64编码的图片.这种情况出现在服务端需要动态生成的图片,比如: 二维码 图形验证码 ... 这些应用场景有个共同点就是,这些图片都是由服务器动态生成,并不需要生成后保存成文件再返回给客户端. Android中ImageView加载Base64图片其实非常简单,并不需要引入第三方库,方法如下: import android.util.Base64; # 代码片段 String base64 = "d

夺命雷公狗---微信开发05----根据用户输入返回指定图片,且图片入库

废话不多说,先来创建数据库: --keep_image_uploads表 [在数据库wxdb中,如果没有该数据库,请先创建该数据库] CREATE TABLE IF NOT EXISTS keep_image_uploads ( id int UNSIGNED PRIMARY KEY auto_increment, openid varchar(255) NOT NULL DEFAULT '', media_id varchar(128) NOT NULL DEFAULT '', media_p

Android开发检测App从后台进入前台的解决方法

public class ActLifecycle implements ActivityLifecycleCallbacks { private int mPreActivityStartedCount = 0; private int mActivityStartedCount = 0; private int mActivityOrientation = Configuration.ORIENTATION_UNDEFINED; @Override public void onActivit