图片的变化主要是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. C++变量内存分配及类型修饰符

    前言 了解C++程序内存分配,有助于深刻理解变量的初始化值以及其生存周期.另外,变量类型修饰符也会影响到变量的初始化值及其生存周期.掌握了不同类型变量的初始化值及其生存周期,能够让我们设计程序时定义变 ...

  2. mysql中联合查询

    联合查询union 一个翻译问题的解释: 在mysql的手册中,将连接查询(Join)翻译为联合查询: 而联合查询(union),没有明确翻译. 但: 在通常的书籍或文章中,join被翻译为“连接”查 ...

  3. 【NuGet】使用NuGet打包并发布至ProGet过程 (步骤详细,附python脚本)【上篇】

    一.基本知识 (1)NuGet : NuGet是一个为大家所熟知的Visual Studio扩展,通过这个扩展,开发人员可以非常方便地在Visual Studio中安装或更新项目中所需要的第三方组件, ...

  4. bzoj5118: Fib数列2(费马小定理+矩阵快速幂)

    题目大意:求$fib(2^n)$ 就是求fib矩阵的(2^n)次方%p,p是质数,根据费马小定理有 注意因为模数比较大会爆LL,得写快速乘法... #include<bits/stdc++.h& ...

  5. 全面支持Angular2的Web后台Bootstrap模板Sing App - Web & Angular 2.0 Dashboard

    在线预览 Sing App v3.3.0 (包含Angular 2.0版本实现) 现在,本模板完全支持Angular2.0版本啦. Sing Web App 是由专业前端工程师采用行业内流行的技术构建 ...

  6. [转]从头开始 GAN

    1 前言 GAN的火爆想必大家都很清楚了,各种GAN像雨后春笋一样冒出来,大家也都可以名正言顺的说脏话了[微笑脸].虽然目前GAN的酷炫应用还集中在图像生成上,但是GAN也已经拓展到NLP,Robot ...

  7. OpenCV---人脸检测

    一:相关依赖文件下载 https://github.com/opencv/opencv   二:实现步骤(图片检测) (一)读取图片 image= cv.imread("./d.png&qu ...

  8. z-index详细攻略

    概念 z-index 属性设置元素的堆叠顺序.拥有更高堆叠顺序的元素总是会处于堆叠顺序较低的元素的前面. 层级关系的比较 1. 对于同级元素,默认(或position:static)情况下文档流后面的 ...

  9. 新Linux系统配置yum源

    新的Linux系统安装好以后,yum的源还是需要配置一下的,我使用的是redhat6.6版本,同时为了不注册而使用更多的yum源的资源,也需要做一下的修改. 1. 删除redhat原有的yum源 # ...

  10. c++ poco 使用mysql中文乱码问题

    poco 是c++ 一个比较好的库,现在正在学习使用它,碰到一些问题记录在此. poco版本:poco-1.46-all ,带有数据库的支持模块 操作系统:ubuntu 1.使用poco的MySQL模 ...