图片的变化主要是matrix的变化,对matrix不懂的可以先了解下matrxi.

public class FunnyView extends View {
/*
* 手指按下时可能是移动 也可能是拖动
*/
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 (); public FunnyView (Context context ) {
this (context , null, 0 );
} public FunnyView (Context context , AttributeSet attrs , int defStyle ) {
super (context , attrs , defStyle );
init() ;
} private void init() {
mBitmap = BitmapFactory .decodeResource (getResources (), R .drawable .pic1 );
mMatrix = new Matrix ();
mPaint = new Paint ();
mPaint .setColor (Color .BLUE );
mPaint .setStrokeWidth (10 );
mPaint .setAntiAlias ( true) ;
// 计算bitmap中心点坐标
mCenterPoint .set (mBitmap .getWidth () / 2, mBitmap. getHeight() / 2 );
} @Override
protected void onDraw( Canvas canvas ) {
canvas .drawBitmap (mBitmap , mMatrix , mPaint );
super. onDraw (canvas );
} /*
* 计算角度和缩放
*
* 这里使用余弦定理计算 容易理解
* 如果对android矩阵matrix底层原理清楚的同学
* 可以使用matrix计算出旋转角度和缩放量
*/
private void getRotationScale() {
// 角度
double a = distance4PointF (mCenterPoint , startPointF) ;
double b = distance4PointF (startPointF , mCurMovePointF) ;
double c = distance4PointF (mCenterPoint , mCurMovePointF) ; double cosb = ( a * a + c * c - b * b) / ( 2 * a * c) ; if ( cosb >= 1) {
cosb = 1f;
}
double radian = Math . acos( cosb) ;
float newDegree = ( float ) radianToDegree (radian ); PointF centerToStartMove = new PointF ((startPointF .x - mCenterPoint .x ),
(startPointF .y - mCenterPoint .y )); PointF centerToCurMove = new PointF(
(mCurMovePointF .x - mCenterPoint .x ),
(mCurMovePointF .y - mCenterPoint .y )); // 向量叉乘结果, 如果结果为负数, 表示为逆时针, 结果为正数表示顺时针
float result = centerToStartMove .x * centerToCurMove. y
- centerToStartMove .y * centerToCurMove. x; if ( result < 0) {
newDegree = -newDegree ;
} mDegree = newDegree ;
mScale = ( float) ( c / a) ;
} /**
* 弧度换算成角度
*
* @return
*/
public static double radianToDegree( double radian ) {
return radian * 180 / Math .PI ;
} /**
* 两个点之间的距离
*/
private float distance4PointF( PointF pf1, PointF pf2 ) {
float disX = pf2 .x - pf1. x;
float disY = pf2 .y - pf1. y;
return FloatMath . sqrt( disX * disX + disY * disY) ;
} @Override
public boolean onTouchEvent( MotionEvent event ) {
switch ( event .getAction () & MotionEvent .ACTION_MASK ) {
case MotionEvent .ACTION_DOWN :
// 注意getX()和getRawX()的区别
startPointF .set (event .getX (), event .getY ());
mode = DRAG ;
break;
case MotionEvent .ACTION_MOVE :
if ( mode == DRAG ) {
float x = event .getX () - startPointF. x;
float y = event .getY () - startPointF. y;
mCenterPoint .x = mCenterPoint .x + x ;
mCenterPoint .y = mCenterPoint .y + y ;
startPointF .set (event .getX (), event .getY ());
mMatrix .postTranslate (x , y ); } else if ( mode == ZOOM ) {
mCurMovePointF .set (event .getX (), event .getY ());
getRotationScale ();
/*
* 旋转和缩放的中心点都是bitmap的中心点,根据需求可以更改。
*/
// 旋转
mMatrix .postRotate (mDegree , mCenterPoint. x, mCenterPoint .y );
// 缩放
mMatrix .postScale (mScale , mScale , mCenterPoint. x,
mCenterPoint .y );
// 重新赋值起始点
startPointF .set (mCurMovePointF );
}
break;
case MotionEvent .ACTION_POINTER_DOWN :
mode = ZOOM ;
break;
case MotionEvent .ACTION_POINTER_UP :
mode = 0;
break;
case MotionEvent .ACTION_CANCEL :
mode = 0;
break;
}
invalidate ();
// 返回true 事件不再往下分发
return true ;
}
}

  

android 图片旋转 移动 放大缩小的更多相关文章

  1. 制作一个顶部图片可以拉伸放大缩小效果的tableViewHeader

    最近负责公司项目个人中心的项目模块研发,首页是一个头部图片可以拉伸放大缩小效果的tableViewHeader,今天这个demo和教程我增加了模糊效果和头像缩小效果.具体效果如图: 如果这个效果是想要 ...

  2. div内部实现图片旋转、放大、缩小、拖拽

    药药,切克闹,一人我编码累,累把那bug写成堆.秋高气爽空气干燥你一定dei多喝水,过完了这周我就要回去.趁还有几天.你尽情的来跟我怼~~~ 新的一年,很久没更博客了,眼看十一要来了,听说过了十一就等 ...

  3. Android图片旋转,缩放,位移,倾斜,对称完整示例(一)——imageView.setImageMatrix(matrix)和Matrix

    MainActivity如下: import android.os.Bundle; import android.view.MotionEvent; import android.view.View; ...

  4. 手动实现图片预览-放大缩小全屏支持IE9以上

    #{extends '/Index/index.html' /} #{set title:'意见反馈' /} <script src="/public/mgr/javascripts/ ...

  5. Android图片旋转,缩放,位移,倾斜,对称完整演示样例(一)——imageView.setImageMatrix(matrix)和Matrix

    MainActivity例如以下: import android.os.Bundle; import android.view.MotionEvent; import android.view.Vie ...

  6. 【VUE】图片预览放大缩小插件

    From: https://www.jianshu.com/p/e3350aa1b0d0 在看项目时,突然看到预览图片的弹窗,感觉好僵硬,不能放大,不能切换,于是便在网上找下关于图片预览的插件,有找到 ...

  7. 动画--android图片点击放大动画,并遮挡旁边的控件

    http://blog.csdn.net/s13488941815/article/details/40649823: 首先是点击放大可以使用android自带的缩放动画,因为要遮盖其他控件,就需要控 ...

  8. Android 图片旋转(使用Matrix.setRotate方法)

    imageView2 = (ImageView) findViewById(R.id.img2); Bitmap bitmap = BitmapFactory.decodeResource(getRe ...

  9. Android 图片旋转

    拍照后的照片有时被系统旋转,纠正步骤如下: 1.先读取图片文件被旋转的角度: /** * 通过ExifInterface类读取图片文件的被旋转角度 * @param path : 图片文件的路径 * ...

随机推荐

  1. TTPPRC —— 商业分析模型

    欢迎讨论 : ) 前言1 TTPPRC,是一个为了更容易.透切地进行商业分析而整理出的分析模型.通过这个模型,可以让不具备专业商业知识的大众都能容易得出商业分析结果. 此文是读者阅读原文后,而整理的一 ...

  2. dom对象转成jquery对象时候 变成数组 jquery转成dom时候 取数组第一个

  3. Codeforces Round #525 Div. 2 自闭记

    A:签到. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> ...

  4. C++解析(16):友元与类中的函数重载

    0.目录 1.友元的尴尬能力 2.类中的函数重载 3.小结 1.友元的尴尬能力 什么是友元? 友元是C++中的一种关系 友元关系发生在函数与类之间或者类与类之间 友元关系是单项的,不能传递 友元的用法 ...

  5. C++解析(13):临时对象与const对象

    0.目录 1.临时对象 2.const对象 3.类成员 4.小结 1.临时对象 一个有趣的问题--下面的程序输出什么?为什么? #include <stdio.h> class Test ...

  6. P2169 正则表达式

    题目背景 小Z童鞋一日意外的看到小X写了一个正则表达式的高级程序,这个正则表达式程序仅仅由字符“0”,“1”,“.”和“*”构成,但是他能够匹配出所有在OJ上都AC的程序的核心代码!小Z大为颇感好奇, ...

  7. Qt浅谈之总结(整理)

    Qt浅谈之总结(整理) 来源 http://blog.csdn.net/taiyang1987912/article/details/32713781 一.简介 QT的一些知识点总结,方便以后查阅. ...

  8. Mac下安装MacProt,并GNU autotools的安装和使用 autoconf,automake

    1 MacPort的下载:http://www.macports.org/install.php, 需要安装xCode支持macport 2 安装MacPorts 与其他Mac的软件的安装方式相同,挂 ...

  9. mysql数据库----视图、触发器、存储过程、函数、事务、索引、其他语句

    一.视图 视图是一个虚拟表(非真实存在),其本质是[根据SQL语句获取动态的数据集,并为其命名],用户使用时只需使用[名称]即可获取结果集,并可以将其当作表来使用. SELECT * FROM ( S ...

  10. Caffe框架详细梳理

    protobuf是google公司开发的,并在Google内部久经考验的一个东西,在08年google把它贡献给了开源社区,随后便有越来越多的人使用它.protobuf是一个结构化信息传递的工具,主要 ...