转载请注明出处:http://blog.csdn.net/coderyue/article/details/51397409
之前写过一篇文章Android TextView 横竖排切换(字方向不变) 是自定义了一个LinearLayout, 实现了当然还不够, 还要对它进行操作, 平移,旋转 and 缩放, 相信很多小伙伴都知道对图片的平移等等操作最好用的就是矩阵了,因为有个方法叫做imageview.setImageMatrix(matrix), 直接构造一个矩阵对象然后设置到图片上就进行相关操作了, 那我就会想了,其他的View没有这个方法么, 有兴趣的伙伴可以试试,结果是只有getMatrix(), 那对于不是图片的情况呢?下面我们一起一步步的研究吧。
先列一下矩阵的基本方法, 后面也要用到的:
平移操作:matrix.postTranslate(translateX, translateY); 参数为平移的距离,而不是平移到哪!
旋转操作:matrix.postRotate(newRotation, midP.x, midP.y); 参数为旋转的角度以及以midP.x, midP.y 为原点进行旋转
缩放操作:matrix.postScale(scale, scale, midP.x, midP.y); 参数为缩放的倍数以及缩放原点。
先说一下对图片操作的思路:
首先一定要对一个imageview添加一个OnTouchListener监听, 在MotionEvent.ACTION_DOWN(按下), MotionEvent.ACTION_MOVE(移动),MotionEvent.ACTION_UP(抬起) 主要是这三个事件, 当然还有其他的事件要监听, 比如双指按下然后抬起一个的时候, 如果不监听这个事件的话那一个手指在屏幕的时候就会执行单击事件, 后面代码注释我会写到。
那根据矩阵的方法我会想到 在 手指按下 的时候我记录当前点击的坐标, 在手指移动的时候我计算出移动了多少, 然后matrix.postTranslate(translateX, translateY);执行平移,同理 缩放和旋转也要计算, 然后在不断移动的过程当中 不断的把生成的矩阵对象设置到图片上。我觉得描述出来就是这样了, 接下来看下我的效果图:
下面分析一下主要代码, 我写了详细的注释 方便查看
首先要添加一个view
private void addMyFrame() {
//新添加一个view的话要把其他的都设置成未选中, 只有新添加的是选中
for (int i = (addFrameHolders.size() - 1); i >= 0; i--) {
AddWordFrame addWordFrame = addFrameHolders.get(i).getAddWordFrame();
if (addWordFrame.isSelect()) {
addWordFrame.setSelect(false);
break;
}
}
addWordFrame = new AddWordFrame(this);
addWordFrame.setSelect(true);
//添加到屏幕上
frame.addView(addWordFrame);
layout = addWordFrame.getLayout();
addWordBitmap = BitmapUtils.convertViewToBitmap(layout);
addWordWidth = addWordBitmap.getWidth();
addWordHeight = addWordBitmap.getHeight();
//这里是想平移到屏幕比较好看的位置
addWordx1 = width/2 - addWordWidth /2;
addWordy1 = height/3;
//这里设置四个角的坐标是为了后续判断是不是点击到了删除或者旋转
//原图左上角
addWordFrame.leftTop.set(addWordx1, addWordy1);
// 原图右上角
addWordFrame.rightTop.set(addWordx1 + addWordWidth, addWordy1);
// 原图左下角
addWordFrame.leftBottom.set(addWordx1, addWordy1 + addWordHeight);
// 原图右下角
addWordFrame.rightBottom.set(addWordx1 + addWordWidth, addWordy1 + addWor