Canvas的使用,放大缩小的自定义布局,不同的位置不同的点击事件

来源:互联网 发布:平价手表知乎 编辑:程序博客网 时间:2024/06/05 07:43

从一接触这个项目就开始找实现的各种方式,首先说一下需求:

1、一个可以缩放的背景,可以向背景中加入新的图片;

2,加入的图片可以触发事件,图片要随着背景放大缩小或移动;

具体的需求就是这些,有些像地图,或者塔防游戏的感觉,但是并没有那么复杂。

首先想到imageView,但是并不能向内添加子控件,点击时间也无从处理,所以转向自定义控件,由于本人是新手,只能到处搜罗代码,解决思路。如果你对加入的图片要求不高,对添加图片后契合度没有要求的话可以参见http://www.lai18.com/content/2201591.html这篇文章。但是本人的项目不能用这种效果,然后我开始转向做游戏地图方向,然后找到一个地图编辑器mapWin关于它的使用可以参见http://www.xuanyusong.com/archives/211,类似的编辑器有很多,只是先搜到什么就贴什么了啊(再次注明是新手,没什么选择性的,哪个能用就用哪个吧)。

通过第二课帖子了解绘制出地图之后,离成功就不远了,因为里面的地图不可以缩放所以我们需要加入Canvas,还有Matrix还有一种手势识别的ScaleGestureDetector。目前只做到缩放了,我做到项目最后回帖出代码,现在对博客不是很熟练,有想交流的可以加我QQ:1102581005

关于Canvas网上的介绍的有很多,我就不再这里浪费篇幅了,只说一下自己疑惑和用到的。

1、clipRect(floatleft, floattop, floatright, floatbottom):这个方式不是普通的剪裁图片,是定义一个可显示区域,我的理解是,就像一张照片,只开放方法定义的部分给你看,其余部分都是遮住的;你可以在里面显示别的内容,但是大小是固定的。

2、drawBitmap(Bitmap bitmap,floatleft, floattop,Paint paint):这个方法就是画图,但是里面left和top值困扰我很久,它为什么可以是负值。left和top的含义是举例屏幕左边的距离和上面的举例,用来确定图片画在屏幕的哪里,如果为负值,那么图片有一部分就画到屏幕外面去了。比如left和top都为-50,那么你的图片左边和上面距离你屏幕的左边和上面就是50,只不过你的图片边界在屏幕外;反过来,如果为+50,虽然距离也是50但是图片边界在屏幕内。可以吧屏幕左上角点看作原点,灰色为屏幕位置,蓝色为-50时图片的绘制位置,与灰色相交的部分为图片显示区域,红色部分同理。

3、设置Matrix的缩放,网上讲解也多的是,以后我会贴出代码我的代码。

4、缩放问题,设置好Canvas的缩放以后就是最关键的问题,点击事件怎么加,要怎么找到你想点击的坐标值,以及图片变换以后你想点击的坐标值。这就需要RectF(floatleft, floattop, floatright, floatbottom),把你想要获取的区域值传到里面通过Matrix中mapRectF()方法获取图片变换之后的值,然后你就能一直知道你想点击的图片的坐标值了。

感觉写出来很简单,但当时自己想的时候真的很痛苦,因为只需要这样一个简单的小功能,没有想过用游戏引擎之类的,记录一下,希望以后有遇到类似问题像我一样自学的新手可以少走弯路,如果大神发现有什么不对的地方,欢迎指正。



0 0
原创粉丝点击