MVC模型只要是做开发的应该都不会陌生----Mode-View-Control。说起来非常简单,但是实际用来了总觉得碍手碍脚,放不开(主要是对新手来说),个人之前也有这种感觉。而且用起来也比较容易混乱,对于这三层的限定比较模糊。
Mode模块,主要用于对数据的封装。ImageView就是个最好的例子,ImageView用于显示图画得控件,那么位图就是MVC模型中的mode。
View视图,主要以图形的方式展示Mode中的数据。ImageView中,canvas画布就是用于显示图画的,位图在画布中画出来就会被显示在屏幕上。
Control控制,顾名思义就是用于交互作用的。ImageView中,onTouch方法就是对Control的封装。在重写ImageView时,可以重写该onTouch方法改变mode中数据,以达到交互的目的。
说了这么多,我就拿最近写的一个项目来说吧。(说白了就是一个支持多点触控,可伸缩,平移,旋转的View)
项目地址:https://github.com/rj11304/SuperImageView
如何定义Mode呢,我是这样定义的:
public class PictureStat {
private float mScale; //显示图片倍数
private float angle; //图片旋转角度
private int rotateCenterX; //图片旋转中心坐标
private int rotateCenterY;
private float baseY; //图片位移坐标
private float baseX;
......
}
由于我们的需求是图片状态的全部信息,所以Mode中我们就定义一图片状态的相关属性,比如图片的伸缩倍数,旋转角度,旋转中心,位移等等。只要我们获取到相关数据,就能在View层中展示一摸一样的效果。
然后我是这样定义View层的:
public void draw(Canvas canvas)
{
paint.setColor(background); //初始化画笔颜色
canvas.drawRect(0, 0, getWidth(), getHeight(), paint); //初始化画框
float picWidthTemp=PicWidth*currScale; //显示图片的宽度
float picHeightTemp=PicHeight*currScale; //显示图片的高度
float left = (getWidth() - picWidthTemp)/2; //图片原始坐标X
float top = (getHeight() - picHeightTemp)/2;//图片原始坐标Y
Matrix m1=new Matrix(); //更新原始坐标
m1.setTranslate(left,top); //
Matrix m2=new Matrix(); //更新图片倍率
m2.setScale(currScale, currScale);
Matrix m3=new Matrix(); //旋转图片
m3.setRotate(angle, rotateCenterX, rotateCenterY);
Matrix m4 = new Matrix(); //更新图片基础坐标,平移图片
m4.setTranslate(baseX, baseY);
Matrix mz=new Matrix();
mz.setConcat(m1, m2);
Matrix mzz=new Matrix();
mzz.setConcat(m3, mz);
Matrix mzzz = new Matrix();
mzzz.setConcat(m4, mzz);
canvas.drawBitmap(bitmapTmp, mzzz, paint);
}
View是图层主要是用于Mode层的数据显示出来,在这里主要是在画布上把图片画出来。在这方法中全部数据都是mode中的数据,主要数据相同,示图显示的效果自然也是一样。
然后就是Control:
public boolean onTouchEvent(MotionEvent e)
{
......
switch(action)
{
case MotionEvent.ACTION_DOWN: //按下事件
case MotionEvent.ACTION_POINTER_DOWN: //多点按下事件
......
break;
case MotionEvent.ACTION_MOVE: //移动事件
......
break;
case MotionEvent.ACTION_UP: //放松手指事件
//清空松手事件集
......
break;
case MotionEvent.ACTION_POINTER_UP: //放松一个手指事件
//移除该id的指针事件
.......
break;
}
return true;
}
说到交互自然跟事件脱不了干系,由于需求是通过多点触控编辑图片,所以我重写了onTouch方法。肯以通过onTouch方法捕获事件Event,就可以对mode层数据进行修改,进而影响View视图。
说来说去其实就是,用户所能有的感官就是视觉和触觉。对用户来说,View视图和Control控制层至关重要,Mode层主要不面向用户。但是,Mode层却是View视图和Control控制层的中枢,或者说是桥梁,也是整个程序的数据来源。mode的好坏直接影响到整个应用程序。
总结:MVC模型结构简单,各部分的分工明确,有利于代码的维护和程序结构的稳定。
以上是个人的一些看法,如有错漏,请大方指出,我也可以从中学习学习