杂说Android开发--MVC模型

本文探讨了Android开发中的MVC模式,解析了Model、View和Controller的职责。通过实例分析了一个支持多点触控、可伸缩、平移、旋转的SuperImageView项目,强调了Mode作为数据中枢在View和Control之间的桥梁作用,以及MVC模式对代码维护和程序稳定性的重要性。
摘要由CSDN通过智能技术生成

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模型结构简单,各部分的分工明确,有利于代码的维护和程序结构的稳定。

以上是个人的一些看法,如有错漏,请大方指出,我也可以从中学习学习

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值