Android手势.docx
- 文档编号:25124961
- 上传时间:2023-06-05
- 格式:DOCX
- 页数:28
- 大小:1.13MB
Android手势.docx
《Android手势.docx》由会员分享,可在线阅读,更多相关《Android手势.docx(28页珍藏版)》请在冰豆网上搜索。
Android手势
通过这几天的查阅资料,对手势有一定的了解,手势图片的放大与缩小,手势界面切换动画以及多触点手势问题...
一单触点手势将图片放大与缩小事例
GestureDemo2Activity.java文件
publicclassGestureDemo2ActivityextendsActivityimplementsOnGestureListener{
privateImageViewimageView;
privateGestureDetectordetector;
//初始的图片资源
privateBitmapbitmap;
//定义图片的宽、高
privateintwidth,height;
//记录当前的缩放比
privatefloatcurrentScale=1;
//控制图片缩放的Matrix对象
privateMatrixmatrix;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
imageView=(ImageView)findViewById(R.id.imageView);
detector=newGestureDetector(this);
matrix=newMatrix();
//获取被缩放的源图片
bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.abc);
//获得位图宽、高
width=bitmap.getWidth();
height=bitmap.getHeight();
//设置ImageView初始化时显示的图片
imageView.setImageBitmap(BitmapFactory.decodeResource(getResources(),R.drawable.abc));
}
//将该Activity上的触碰事件交给GestureDetector处理
@Override
publicbooleanonTouchEvent(MotionEventevent){
returndetector.onTouchEvent(event);
}
@Override
publicbooleanonDown(MotionEventarg0){
returnfalse;
}
//"拖动"时触发该方法s
@Override
publicbooleanonFling(MotionEvente1,MotionEvente2,floatvelocityX,
floatvelocityY){
velocityX=velocityX>4000?
4000:
velocityX;
velocityX=velocityX<-4000?
-4000:
velocityX;
//根据手势的速度来计算缩放比,如果velocityX>0,放大图像,否则缩小图像
currentScale+=currentScale*velocityX/4000.0f;
//保证currentScale不会等于0
currentScale=currentScale>0.01?
currentScale:
0.01f;
//重置matrix
matrix.reset();
//缩放matrix
matrix.setScale(currentScale,currentScale,160,200);
BitmapDrawabletmp=(BitmapDrawable)imageView.getDrawable();
//如果图片还未回收,先强制回收该图片
if(!
tmp.getBitmap().isRecycled()){
tmp.getBitmap().recycle();
}
//根据原始位图和Matrix创建新图片
Bitmapbitmap2=Bitmap.createBitmap(bitmap,0,0,width,height,matrix,true);
//显示新位图
imageView.setImageBitmap(bitmap2);
returntrue;
}
@Override
publicvoidonLongPress(MotionEvente){
}
@Override
publicbooleanonScroll(MotionEvente1,MotionEvente2,floatdistanceX,
floatdistanceY){
returnfalse;
}
@Override
publicvoidonShowPress(MotionEvente){
}
@Override
publicbooleanonSingleTapUp(MotionEvente){
returnfalse;
}
}
main.xml文件
xmlversion="1.0"encoding="utf-8"?
>
android=" android: orientation="vertical" android: layout_width="fill_parent" android: layout_height="fill_parent" android: gravity="center_horizontal" > android: layout_width="wrap_content" android: layout_height="wrap_content" android: text="通过手势滑动图片" android: textSize="23sp" /> android: orientation="vertical" android: layout_width="fill_parent" android: layout_height="fill_parent" > android: id="@+id/imageView" android: layout_width="fill_parent" android: layout_height="fill_parent" android: scaleType="center" /> 此例子向左缩小图片向右放大图片,例子中设计android: scaleType属性和matrix,多触点例子中也涉及此属性; 二Matrix学习 Matrix学习——基础知识 以前在线性代数中学习了矩阵,对矩阵的基本运算有一些了解,前段时间在使用GDI+的时候再次学习如何使用矩阵来变化图像,看了之后在这里总结说明。 首先大家看看下面这个3x3的矩阵,这个矩阵被分割成4部分。 为什么分割成4部分,在后面详细说明。 首先给大家举个简单的例子: 现设点P0(x0,y0)进行平移后,移到P(x,y),其中x方向的平移量为△x,y方向的平移量为△y,那么,点P(x,y)的坐标为: x=x0+△xy=y0+△y 采用矩阵表达上述如下: 上述也类似与图像的平移,通过上述矩阵我们发现,只需要修改矩阵右上角的2个元素就可以了。 我们回头看上述矩阵的划分: 为了验证上面的功能划分,我们举个具体的例子: 现设点P0(x0,y0)进行平移后,移到P(x,y),其中x放大a倍, y放大b倍, 矩阵就是: ,按照类似前面“平移”的方法就验证。 图像的旋转稍微复杂: 现设点P0(x0,y0)旋转θ角后的对有点为P(x,y)。 通过使用向量,我们得到如下: x0=rcosαy0=rsinα x=rcos(α-θ)=x0cosθ+y0sinθy=rsia(α-θ)=-x0sinθ+y0cosθ 于是我们得到矩阵: 如果图像围绕着某个点(a,b)旋转呢? 则先要将坐标平移到该点,再进行旋转,然后将旋转后的图像平移回到原来的坐标 原点,在后面的篇幅中我们将详细介绍。 Matrix学习——如何使用Matrix 上一篇幅Matrix学习——基础知识,从高等数学方面给大家介绍了Matrix,本篇幅我们就结合Android中的 android.graphics.Matrix来具体说明,还记得我们前面说的图像旋转的矩阵: 从最简单的旋转90度的是: 在android.graphics.Matrix中有对应旋转的函数: Matrixmatrix=newMatrix();matrix.setRotate(90); Test.Log(MAXTRIX_TAG,”setRotate(90): %s”,matrix.toString()); 查看运行后的矩阵的值(通过Log输出): 与上面的公式基本完全一样(android.graphics.Matrix采用的是浮点数,而我们采用的整数)。 有了上面的例子,相信大家就可以亲自尝试了。 通过上面的例子我们也发现,我们也可以直接来初始化矩阵,比如说要旋转 30度: 前面给大家介绍了这么多,下面我们开始介绍图像的镜像,分为2种: 水平镜像、垂直镜像。 先介绍如何实现垂直镜像,什么是垂直镜像就不详细说明。 图像的垂直镜像变化也可以用矩阵变化的表示,设点P0(x0,y0)进行镜像后的对应点为P(x,y),图像的高度为fHeight,宽度为fWidth,原图像中的P0(x0,y0)经过垂直镜像后的坐标变为(x0,fHeight-y0); x=x0 y=fHeight–y0 推导出相应的矩阵是: finalfloatf[]={1.0F,0.0F,0.0F,0.0F,-1.0F,120.0F,0.0F,0.0F,1.0F};Matrixmatrix=newMatrix(); matrix.setValues(f); 至于水平镜像采用类似的方法,大家可以自己去试试吧。 实际上,使用下面的方式也可以实现垂直镜像: Matrixmatrix=newMatrix(); matrix.setScale(1.0,-1.0);matrix.postTraslate(0,fHeight);这就是我们将在后面的篇幅中详细说明。 Matrix学习——图像的复合变化 Matrix学习——基础知识篇幅中,我们留下一个话题: 如果图像围绕着某个点P(a,b)旋转,则先要将坐标系平移到该点,再进行旋转,然后将旋转后的图像平移回到原来的坐标原点。 我们需要3步: 1.平移——将坐标系平移到点P(a,b); 2.旋转——以原点为中心旋转图像; 3.平移——将旋转后的图像平移回到原来的坐标原点; 相比较前面说的图像的几何变化(基本的图像几何变化),这里需要平移——旋转——平移,这种需要多种图像的几何变化就叫做图像的复合变化。 设对给定的图像依次进行了基本变化F1、F2、F3…..、Fn,它们的变化矩阵分别为T1、T2、T3…..、Tn,图像复合变化的矩阵T可以表示为: T=TnTn-1…T1。 按照上面的原则,围绕着某个点(a,b)旋转θ的变化矩阵序列是: 按照上面的公式,我们列举一个简单的例子: 围绕(100,100)旋转30度(sin30=0.5,cos30=0.866) floatf[]={0.866F,-0.5F,63.4F,0.5F,0.866F,-36.6F,0.0F,0.0F,1.0F}; matrix=newMatrix(); matrix.setValues(f); Android为我们提供了更加简单的方法,如下: Matrixmatrix=newMatrix();matrix.setRotate(30,100,100);矩阵运行后的实际结果: 与我们前面通过公式获取得到的矩阵完全一样。 在这里我们提供另外一种方法,也可以达到同样的效果: floata=100.0F,b=100.0F; matrix=newMatrix(); matrix.setTranslate(a,b);matrix.preRotate(30);matrix.preTranslate(-a,-b); 将在后面的篇幅中为大家详细解析 通过类似的方法,我们还可以得到: 相对点P(a,b)的比例[sx,sy]变化矩阵 Matrix学习——PreconcatsorPostconcats? 从最基本的高等数学开始,Matrix的基本操作包括: +、*。 Matrix的乘法不满足交换律,也就是说A*B≠B*A。 还有2种常见的矩阵: 有了上面的基础,下面我们开始进入主题。 由于矩阵不满足交换律,所以用矩阵B乘以矩阵A,需要考虑是左乘(B*A),还是右乘(A*B)。 在Android的android.graphics.Matrix中为我们提供了类似的方法,也就是我们本篇幅要说明的Preconcatsmatrix与Postconcatsmatrix。 下面我们还是通过具体的例子还说明: 通过输出的信息,我们分析其运行过程如下: 看了上面的输出信息。 我们得出结论: Preconcatsmatrix相当于右乘矩阵,Postconcatsmatrix相当于左乘矩 阵。 上一篇副中,我们说到: 其晕死过程的详细分析就不在这里多说了。 Matrix学习——错切变换 什么是图像的错切变换(Sheartransformation)? 对图像的错切变换做个总结: x=x0+b*y0; y=d*x0+y0; 这里再次给大家介绍一个需要注意的地方: 通过以上,我们发现Matrix的setXXXX()函数,在调用时调用了一次reset(),这个在复合变换时需要注意。 Matrix学习——对称变换(反射) 什么是对称变换? 具体的理论就不详细说明了,图像的镜像就是对称变换中的一种。 利用上面的总结做个具体的例子,产生与直线y=–x对称的反射图形,代码片段如下: 当前矩阵输出是: 三Android: scaleType android: scaleType是控制图片如何resized/moved来匹对ImageView的size。 ImageView.ScaleType/android: scaleType值的意义区别: CENTER/center 按图片的原来size居中显示,当图片长/宽超过View的长/宽,则截取图片的居中部分显示 CENTER_CROP/centerCrop 按比例扩大图片的size居中显示,使得图片长(宽)等于或大于View的长(宽) CENTER_INSIDE/centerInside 将图片的内容完整居中显示,通过按比例缩小或原来的size使得图片长/宽等于或小于View的长/宽 FIT_CENTER/fitCenter 把图片按比例扩大/缩小到View的宽度,居中显示 FIT_END/fitEnd 把图片按比例扩大/缩小到View的宽度,显示在View的下部分位置 FIT_START/fitStart 把图片按比例扩大/缩小到View的宽度,显示在View的上部分位置 FIT_XY/fitXY 把图片不按比例扩大/缩小到View的大小显示 MATRIX/matrix用矩阵来绘制,动态缩小放大图片来显示。 四双触点放大缩小照片事例 MultiTouchActivity.java文件 publicclassMultiTouchActivityextendsActivity{ privatestaticfinalintNONE=0; privatestaticfinalintMOVE=1; privatestaticfinalintZOOM=2; privatestaticfinalintROTATION=1; privateintmode=NONE; privateMatrixmatrix=newMatrix(); privateMatrixsavedMatrix=newMatrix(); privatePointFstart=newPointF(); privatePointFmid=newPointF(); privatefloats=0; privatefloatoldDistance; privateintrotate=NONE; privateImageViewimageView; @Override publicvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); imageView=(ImageView)findViewById(R.id.imageView); imageView.setOnTouchListener(newOnTouchListener() { DisplayMetricsdm=getResources().getDisplayMetrics(); finalintscreenWidth=dm.widthPixels; finalintscreenHeight=dm.heightPixels; intlastX1,lastY1; publicbooleanonTouch(Viewview,MotionEventevent){ switch(event.getAction()&MotionEvent.ACTION_MASK){ caseMotionEvent.ACTION_DOWN: //按下 savedMatrix.set(matrix); start.set(event.getX(),event.getY()); mode=MOVE; rotate=NONE; lastX1=(int)event.getRawX(); lastY1=(int)event.getRawY(); break; caseMotionEvent.ACTION_UP: caseMotionEvent.ACTION_POINTER_UP: mode=NONE; break; caseMotionEvent.ACTION_POINTER_DOWN: oldDistance=(float)Math.sqrt((event.getX(0)-event.getX (1))*(event.getX(0)-event.getX (1))+(event.getY(0)-event.getY (1))*(event.getY(0)-event.getY (1))); if(oldDistance>10f){ savedMatrix.set(matrix); mid.set((event.getX(0)+event.getX (1))/2,(event.getY(0)+event.getY (1))/2); mode=ZOOM; } caseMotionEvent.ACTION_MOVE: //移动位置 if(mode==MOVE) { // if(rotate==NONE){ // savedMatrix.set(matrix); // mid.set(event.getX(),event.getY()); // rotate=ROTATION; // } //
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android 手势