android 实现图片旋转,移动,缩放,并且记录变化值,用另外一张图片显示出来

最近公司要做一个戒指试戴的功能,就是把戒指通过手势移动到你指定的手指处,并且保存状态,方便下次进入时显示,可以参考APP“钻石快线”的试戴功能,

图片网上有很多的教程教你怎么把图片旋转,移动,缩放,等等,却没有教你保存状态,而且网上的教程都乱七八糟,都是复制粘贴,都不是自己想要的,所以有时间自己写一个,现在把实现步骤,代码,源码贴出来,共同学习!

 * 图片的变化主要是matrix的变化,对matrix不懂的可以先了解下matrxi.
 * 
 * 产品试戴的地方,需要保存戒指的位置,之前用TouchImageView(可以去网上找找,我项目里面也自带了)来处理,因为是别人写好的,要理解里面意思很难,想了很多种方法,比如保存当前的戒指图片位置,获取图片的四个点坐标, 画出正方形,在用图片来填充正方形,后来只能去记录移动,旋转,缩放的每一次事件,还是没 有解决,到了第四天用google在搜了一下类似的,总于找到一个,而且是我想要的已对角线的中 点为坐标,就很方便,也不会卡,现在说下思路
 * 
 * 1.不要在ondraw()里面创建对象,做任何复杂的计算和操作。因为ondraw()被调用执行的次数 量大的惊人。所以在外面创建对象 new Matrix();new Paint (); 
 * 2.ontouchEvent的状态判断,event有很多种类型,要熟知。 
 * 3.已bitmap中心点坐标为中心
 * 4.postTranslate///偏移量,只要相加就好了,postRotate//需要计算角度,,mScale大于1就是放大,少于1就是缩小
 * 5.我这里把偏移量等数据放在本地,ShareFileUtils
 * 6.在重新给戒指确定位置的时候,排序有要求按postTranslate,postRotate,postScale去做, 不然后果就很清楚了
 * 7.// 旋轉,不能以当时旋转的对角线中心点,要以最后的对角线中心位置(通过偏移量计算),因为移动过程中可能没有去旋转,
 * //以对角线为中心,在哪里都是可以的,所以:::: 当前的坐标=偏移量+最开始的对角线的坐标


布局文件和实例化控件的activity就不写了,主要就是2个自定义的view,一个做手势,一个显示。

FunnyView

public class FunnyView extends View {
	private static final String TAG = "FUNNYVIEW";

	/*
	 * 手指按下时可能是移动 也可能是拖动
	 */
	private static final int ZOOM = -1;
	private static final int DRAG = 1;
	private int mode = 0;
	// 第一个触控点
	private PointF startPointF = new PointF();
	// 第二个触控点
	private PointF mCurMovePointF = new PointF();

	private float mDegree;
	private float mScale;

	private Bitmap mBitmap = null;
	private Matrix mMatrix = null;
	private Paint mPaint = null;
	// bitmap的中心点
	private PointF mCenterPoint = new PointF();

	float scale_sx = 1;
	float scale_sy = 1;


	float rotate_degrees = 0;
	

	float translate_dx = 0;
	float translate_dy = 0;

	boolean isload=false;//只让他在第二遍执行 ondraw()
	
	public FunnyView(Context context) {
		this(context, null, 0);
	}

	public FunnyVi
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值