android 图片旋转 移动 放大缩小
图片的变化主要是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 图片旋转 移动 放大缩小的更多相关文章
- 制作一个顶部图片可以拉伸放大缩小效果的tableViewHeader
最近负责公司项目个人中心的项目模块研发,首页是一个头部图片可以拉伸放大缩小效果的tableViewHeader,今天这个demo和教程我增加了模糊效果和头像缩小效果.具体效果如图: 如果这个效果是想要 ...
- div内部实现图片旋转、放大、缩小、拖拽
药药,切克闹,一人我编码累,累把那bug写成堆.秋高气爽空气干燥你一定dei多喝水,过完了这周我就要回去.趁还有几天.你尽情的来跟我怼~~~ 新的一年,很久没更博客了,眼看十一要来了,听说过了十一就等 ...
- Android图片旋转,缩放,位移,倾斜,对称完整示例(一)——imageView.setImageMatrix(matrix)和Matrix
MainActivity如下: import android.os.Bundle; import android.view.MotionEvent; import android.view.View; ...
- 手动实现图片预览-放大缩小全屏支持IE9以上
#{extends '/Index/index.html' /} #{set title:'意见反馈' /} <script src="/public/mgr/javascripts/ ...
- Android图片旋转,缩放,位移,倾斜,对称完整演示样例(一)——imageView.setImageMatrix(matrix)和Matrix
MainActivity例如以下: import android.os.Bundle; import android.view.MotionEvent; import android.view.Vie ...
- 【VUE】图片预览放大缩小插件
From: https://www.jianshu.com/p/e3350aa1b0d0 在看项目时,突然看到预览图片的弹窗,感觉好僵硬,不能放大,不能切换,于是便在网上找下关于图片预览的插件,有找到 ...
- 动画--android图片点击放大动画,并遮挡旁边的控件
http://blog.csdn.net/s13488941815/article/details/40649823: 首先是点击放大可以使用android自带的缩放动画,因为要遮盖其他控件,就需要控 ...
- Android 图片旋转(使用Matrix.setRotate方法)
imageView2 = (ImageView) findViewById(R.id.img2); Bitmap bitmap = BitmapFactory.decodeResource(getRe ...
- Android 图片旋转
拍照后的照片有时被系统旋转,纠正步骤如下: 1.先读取图片文件被旋转的角度: /** * 通过ExifInterface类读取图片文件的被旋转角度 * @param path : 图片文件的路径 * ...
随机推荐
- CF816E-Karen and Supermarket
题目 Description 今天Karen要去买东西. 一共有 \(n\) 件物品,每件物品的价格为\(c_i\),同时每件物品都有一张优惠券,可以对这件物品减价 \(d_i\) . 使用第 \(i ...
- 洛谷 P1678 烦恼的高考志愿
题目背景 计算机竞赛小组的神牛V神终于结束了万恶的高考,然而作为班长的他还不能闲下来,班主任老t给了他一个艰巨的任务:帮同学找出最合理的大学填报方案.可是v神太忙了,身后还有一群小姑娘等着和他约会,于 ...
- 洛谷 P2055 [ZJOI2009]假期的宿舍
洛谷 P2055 题目描述 学校放假了 · · · · · · 有些同学回家了,而有些同学则有以前的好朋友来探访,那么住宿就是一个问题.比如 A 和 B 都是学校的学生,A 要回家,而 C 来看B,C ...
- Cells UVALive - 3486(dfs序+手动开栈)
给一棵树,每次每次询问一个点是否是另一个点的祖先? 输入时是每个下标对应节点的儿子的数量 用dfs序 时间戳.. 如果一个点是另一个点的祖先,那么它的两个标记一定在祖先的范围之内 #include & ...
- 【转】c# thread.join 理解
转自:http://blog.csdn.net/lulu_jiang/article/details/6584251 线程Join()方法:让一个线程等待另一线程终结后再继续运行. private s ...
- Oracle 高性能SQL引擎剖析----执行计划
执行计划是指示Oracle如何获取和过滤数据.产生最终结果集,是影响SQL语句执行性能的关键因素.我们在深入了解执行计划之前,首先需要知道执行计划是在什么时候产生的,以及如何让SQL引擎为语句生成执行 ...
- 【linux】/dev/null与/dev/zero详解
引用别人的资源,收藏: http://www.cnblogs.com/xianghang123/archive/2012/03/23/2413381.html
- scala(二)
一.映射 1.Scala映射就是键值对的集合Map.默认情况下,Scala中使用不可变的映射. 如果想使用可变集合Map,必须导入scala.collection.mutable.Map (导包 ...
- [JSOI2009]瓶子和燃料
Description jyy就一直想着尽快回地球,可惜他飞船的燃料不够了. 有一天他又去向火星人要燃料,这次火星人答应了,要jyy用飞船上的瓶子来换.jyy 的飞船上共有 N个瓶子(1<=N& ...
- 【bzoj4372】烁烁的游戏
Portal -->bzoj4372 Solution 感觉自己动态点分治好像没有学好qwq今天借这题来补个档qwq 其实所谓的动态点分治大概就是..和点分一样的套路,但是不同的是我们要更进一步 ...