博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Android自由拼图的demo
阅读量:6417 次
发布时间:2019-06-23

本文共 2037 字,大约阅读时间需要 6 分钟。

hot3.png

<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

你可能感兴趣的文章
jQuery Ajax封装通用类 (linjq)
查看>>
备忘---ruby
查看>>
windows mysql忘记密码解决方案
查看>>
Linux 下用 valgrind 查找内存泄漏小例子
查看>>
需要为你的SaaS改变走向市场策略吗?本文介绍了ISV怎样使用Windows Azure实现它...
查看>>
Search in a Big Sorted Array
查看>>
已知二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列
查看>>
swift 笔记 (十一) —— 方法(类,结构体,枚举)
查看>>
python面向对象编程
查看>>
WebService概述和CXF入门小程序
查看>>
微信出现关闭网页
查看>>
《正则表达式》知识点汇总摘录
查看>>
php静态变量问题
查看>>
vue中路由返回上一个页面,恢复到上一个页面的滚动位置
查看>>
LeetCode--067--二进制求和
查看>>
计蒜客——无脑博士的试管们
查看>>
基于corosync+pacemaker+drbd+LNMP做web服务器的高可用集群
查看>>
Robot Framework 学习(2)- 页面元素定位
查看>>
《代码敲不队》第八次团队作业:Alpha冲刺 第二天
查看>>
电子面单打印功能实现方法
查看>>