图片的变化主要是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. Spring Cloud 之 Eureka

    Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 做了二次封装,主要负责完成微服务架构中的服务治理功能,服务 ...

  2. [LeetCode] Search in Rotated Array

    Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...

  3. BZOJ 1222 产品加工(DP)

    某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同的机器加工同一产品所需的时间会不同,若同时由两台机器共同进行加工,所完成任 ...

  4. LeetCode 671. Second Minimum Node In a Binary Tree

    Given a non-empty special binary tree consisting of nodes with the non-negative value, where each no ...

  5. week1day01 认识python 变量 数据类型 条件if语句

    1.什么是python? Python是一种解释型.面向对象.动态数据类型的高级程序设计语言.Python由Guido van Rossum于1989年底发明,第一个公开发行版发行于1991年.像Pe ...

  6. 访问控制列表-细说ACL那些事儿(ACL应用篇)

    1.ACL应用范围 通过前两期的ACL理论学习,大家知道ACL并不能单独完成控制网络访问行为或者限制网络流量的效果,而是需要应用到具体的业务模块才能实现上述功能. 那么ACL到底可以应用在哪些业务中呢 ...

  7. A Magic Lamp HDU - 3183(RMQ返回下标)

    原文地址:https://blog.csdn.net/acdreamers/article/details/8692384 题意: 对于一个序列A[1...N],一共N个数,除去M个数使剩下的数组成的 ...

  8. [洛谷P5137]polynomial

    题目大意:求:$$\sum\limits_{i=0}^na^{n-i}b^i\pmod{p}$$$T(T\leqslant10^5)$组数据,$a,b,n,p\leqslant10^{18}​$ 题解 ...

  9. 【BZOJ4311】向量(线段树分治,斜率优化)

    [BZOJ4311]向量(线段树分治,斜率优化) 题面 BZOJ 题解 先考虑对于给定的向量集,如何求解和当前向量的最大内积. 设当前向量\((x,y)\),有两个不同的向量\((u1,v1),(u2 ...

  10. 光荣之路测试开发面试linux考题之四:性能命令

    Hi,大家好我是tom,I am back.今天要给大家讲讲linux系统一些性能相关命令. 1.fdisk 磁盘管理 是一个强大的危险命令,所有涉及磁盘的操作都由该命令完成,包括:新增磁盘.增删改磁 ...