# mosaicDemo **Repository Path**: acoderc/mosaicDemo ## Basic Information - **Project Name**: mosaicDemo - **Description**: 拼图demo - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2015-08-21 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 实现思路 ![三块图片拼接](http://i3.tietuku.com/095210761dd0c181.png) 上图中,图片根据黑色的线分割,由三张图片拼接起来。 ### 思路1 根据路径获取三个bitmap,计算出待拼接的bitmap后,在View上绘制 ### 思路2 获取三个bitmap后,在三个View上分别计算待拼接的bitmap后绘制,最后在一个ViewGroup上把三个View按照坐标放置 ###具体实现 在demo中,我采用了第二种方案,理由是,我们需要对每一块图片实现,移动,旋转,缩放,在单独的View上进行这些操作比较方便。 **类的关系** ![UML](http://i3.tietuku.com/ff696d435323c3a7.png) **MosaicBlockView** 绘制每一个待拼接的块 ![block](http://i3.tietuku.com/31c03d885d78fa67.png) ``` 原始图片显示在1 2和3是被切割的区域 ``` ``` /** * 从原图计算出不规则图片 **/ private Bitmap createBitMap(Bitmap source){ if(source == null){ return null; } int w = mWidth; int h = mHeight; float wf = (float)mWidth/(float)source.getWidth(); float hf = (float)mHeight/(float)source.getHeight(); Matrix matrix = new Matrix(); matrix.postScale(wf,hf); //简单处理,把图片拉伸到和控件一样大之后,再计算 Bitmap resizeBmp = Bitmap.createBitmap(source,0,0,source.getWidth(),source.getHeight(),matrix,true); Paint paint = new Paint(); paint.setAntiAlias(true); Bitmap target = Bitmap.createBitmap(w,h, Bitmap.Config.ARGB_8888);//创建一个新的bitmap,和View一样的大小 Canvas canvas = new Canvas(target); canvas.drawPath(mDPath, paint);//绘制切割的区域 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_OUT));//设置两张图片相交时的模式,可以百度一下这个类‘PorterDuffXfermode’,定义了16种计算模式 canvas.drawBitmap(resizeBmp, 0, 0, paint);//绘制图片 return target; } ``` **MosaicView** 放置Block 根据定义好的拼接方式,计算坐标,放置三个MosaicBlockView ###后续 demo中只是定义了一种拼接方式,主要是为了验证图片拼接的具体方式,但是要实现自由拼接,还需要从具体的坐标计算中,归纳出通用的计算方式。我觉得,要实现完全的自由拼接,比较困难,我们可以定义一些模板,然后,根据模板来拼接会简单点。