图片的变化主要是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. 理解promise 02

    1:promise是什么? 就是(链式)包装的回调函数. 2:语法 new Promise( function(resolve, reject) {...} /* executor */ ); exe ...

  2. 从装饰者模式的理解说JAVA的IO包

    1. 装饰者模式的详解 装饰者模式动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更有弹性 的替代方案. 装饰者模式设计类之间的关系: 其 中Component是一个超类,ConcreteC ...

  3. ping不通的常见原因和解决办法

    Ping是Windows.Unix和Linux系统下的一个命令.ping也属于一个通信协议,是TCP/IP协议的一部分.利用“ping”命令可以检查网络是否连通.如果ping不通则可以通过以下方式寻找 ...

  4. 【数据库_Mysql】<foreach>标签在Mysql中的使用

    foreach属性 属性 描述 item 循环体中的具体对象.支持属性的点路径访问,如item.age,item.info.details.具体说明:在list和数组中是其中的对象,在map中是val ...

  5. 解数独(Python)

    0.目录 1.介绍 2.一些通用函数 3.全局变量(宏变量) 4.数独预处理(约束传播) 5.解数独(深度优先搜索+最小代价优先) 6.主函数 7.总代码 1.介绍 数独是一个非常有趣味性的智力游戏, ...

  6. debug - vue中通过ajax获取数据时,如何避免绑定的数据中出现property of undefined错误

    因为获取服务器是异步的,所以 vue 先绑定数据. 如果 ??? 是通过 ajax 异步获取的,在获取之前,???是未定义的.此时在外面的标签上添加一个 v-if="???" 可以 ...

  7. 【BZOJ3105】新Nim游戏(线性基)

    [BZOJ3105]新Nim游戏(线性基) 题面 BZOJ Description 传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同).两个游戏者轮流操作,每次可以 ...

  8. 康托展开&康托逆展开 的写法

    康托展开 康托展开解决的是当前序列在全排序的名次的问题. 例如有五个数字组成的数列:1,2,3,4,5 那么1,2,3,4,5就是全排列的第0个[注意从0开始计数] 1,2,3,5,4就是第1个 1, ...

  9. 洛谷 P4585 [FJOI2015]火星商店问题 解题报告

    P4585 [FJOI2015]火星商店问题 题目描述 火星上的一条商业街里按照商店的编号\(1,2,\dots,n\) ,依次排列着\(n\)个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非 ...

  10. python基础(3)

    使用list和tuple list Python内置的一种数据类型是列表:list.list是一种有序的集合,可以随时添加和删除其中的元素. 比如,列出班里所有同学的名字,就可以用一个list表示: ...