码迷,mamicode.com
首页 > 移动开发 > 详细

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

时间:2015-07-05 18:31:48      阅读:337      评论:0      收藏:0      [点我收藏+]

标签:

 

  最近在写一个类似“围住神经猫”的应用,需要给一个可以移动的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:虽然我一次就把他围住了,但那是因为代码是自己写的,了解其中算法的缘故,否则是无法一次性围住的,搭配漫画表情更增新趣味~ 

 

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

标签:

原文地址:http://www.cnblogs.com/jackchiang/p/4622647.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!