关于Android自由拼图的demo

<p>关于自由拼图的软件有很多,像美图秀秀之类的。前不久,遇到了实现自由拼图的比较好的方法,就写下此篇文章记录一下。</p> <p>实现拼图的方式有很多,但都离不开三样东西:画布(canvas),矩阵(Matrix),绘图资源(drawable)。</p> <p>canvas:个人觉的canvas(<a href="http://developer.android.com/reference/android/graphics/Canvas.html">http://developer.android.com/reference/android/graphics/Canvas.html</a>)与现实中的画布的功能还是不一样的,现实中的画布只是提供了绘图的平面,而canvas还定义了绘图的规则,比如图像的缩放。注意,不论是缩放,还是旋转等等,都不是对画布的操作,而是对绘图资源的操作。不会影响到画布的坐标。</p> <p>Matrix:Matrix(<a href="http://developer.android.com/reference/android/graphics/Matrix.html">http://developer.android.com/reference/android/graphics/Matrix.html</a>)主要用于对平面进行缩放,平移,旋转以及倾斜操作,为简化矩阵变换,Android封装了一系列方法来进行矩阵变换。</p> <p>drawable:绘图资源没什么好讲的,只是在使用时要注意drawable 是一个abstract类,一般使用其子类bitmapdrawable。在这一点上,出现过错误。使用了drawable.draw(canvas)方法。</p> <p>对于一般的layout来说都不会去设置布局控件的<a href="http://developer.android.com/reference/android/view/ViewGroup.html#attr_android:clipChildren">android:clipChildren</a>属性,或使用<a href="http://developer.android.com/reference/android/view/ViewGroup.html#setClipChildren(boolean)">setClipChildren(boolean)</a>方法,这样默认的情况是父控件传递给子控件的canvas是被剪裁过的(<a href="http://blog.csdn.net/z550946941/article/details/7414362">http://blog.csdn.net/z550946941/article/details/7414362</a>)。这样子控件就只能在子控件的范围内进行绘图了,而不能满屏幕跑了。若设置了该属性的话,就可以全屏幕的画了,但是控件的位置是不会动的(在这里我们要区分控件和显示的图片了。控件是相当于图片的控制器,你在屏幕上点击一张图片的话,这个事件是传递给绘制这张图片的控件进行处理的。对于程序而言,只认识控件。)。这样的话,就会出现和动画一样的情况,图片放大了,但用户点击图片四周的位置时,控件是不能收到用户点击事件的。</p> <p>那么能不能让控件随着图片的位置的改变而改变。当然是可以的,但是对于旋转的情况就难以解决了,应为控件是不能旋转的。</p> <p>最后的解决办法是:</p> <p>假设图片刚开始显示的位置都在屏幕的左上角,然后经过一系列变化后图片显示屏幕的不同位置,并且记录下包含各个图片变换信息的Matrix。</p> <p>让子控件的父控件进行用户输入事件的监听,得到的触摸位置,结合Mtrix来判断是哪一张图片被点击的,再通过相应的子控件来响应用户的操作。</p> <p>当然还有一个问题要注意的是各个图片显示的先后顺序,当图片间有遮挡时,需要判断谁是“浮在表面”的。</p> <p>下面是我简单的实现一下这个功能:<a title="http://ishare.iask.sina.com.cn/f/61315079.html" href="http://ishare.iask.sina.com.cn/f/61315079.html">http://ishare.iask.sina.com.cn/f/61315079.html</a></p>

<p>上面链接已经失效,可以使用下面链接来下载demo:<a title="自由拼图demo" href="http://pan.baidu.com/s/1i35lsrF">demo</a></p>

转载于:https://my.oschina.net/speedinghzl/blog/158562

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值