android编程图像移动,Android开发——为移动的Paint元素指定图片的方法

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

所在的类继承于SurfaceView,SurfaceView可以直接从内存或者DMA等硬件接口取得图像数据,速度非常快,然后implements OnTouchListener 监听触摸事件;

c18350897ae63e6c2bbbfaeed2824988.png

最初搜到很多方法,给playground添加图片、给Activity添加图片、另写一个类加载图片。。。全都长篇大论~ 但实际操作起来总是crash,无法实现想要的效果;

后来发现,只需要在redraw() 函数中添加几行代码即可~

自己写的图像绘制函数redraw()的代码是这样的,显示一个黄色的圆点:

public voidredraw(){//绘制

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 = newPaint();//开启画面抗锯齿,必须写在点生成之前

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()) {caseDot.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;caseDot.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;

接下来就是见证奇迹的时刻~

047923eac1101962b7826f7c97a41317.gif

需求已然实现,目前将近500行代码,不过我打算继续完善如下效果:

1、自定义难易度;

2、围住之后弹窗,加载一张图片;

3、把移动的元素改成动态gif。

BTW:虽然我一次就把他围住了,但那是因为代码是自己写的,了解其中算法的缘故,否则是无法一次性围住的,搭配漫画表情更增新趣味~

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值