android 手势放缩_手把手教你打造支持手势放大缩小的ImageView

写在前面

最近有了新的任务,学习的时间比以前少了不少,Java回炉的文估计是得缓缓了,不过每周一篇尽量保质保量。最近感觉我文写的有点不好,因为我写东西除非必要,不然概念性的东西我基本上都是一笔带过……最近感觉这对看我文的人好像不是很友好,恩,我决定改一改,尽量写的详细而有趣一些。

7ce081a1bbf9

1.jpg

好了废话时间过了,前面也说了最近有了新任务,我现在是搞定用户信息这一块。一般来说现在用户都会有个头像什么的,光有个头像还不够,你还得能点击看个大图吧?光看个大图也不够啊,不说多的,你最起码得支持用户手势放大缩小什么的吧?当时脑海里第一个想到的是PhotoView,不过整个项目好像也只有这一块涉及到用户手势放大缩小,算了,自己实现一个吧。当然了,经常刷hongyang大神博客的我自然知道hongyang大神博客里有写过这东西。所以趁周末有空果断刷之~

实现思路

做一个东西之前我们肯定要分析需求,分析完之后我们就可以利用我们会的,或者知道可以实现但是现在不会的去尝试解决这个需求。放大缩小图片,脑子里第一个反应就是矩阵,Android里貌似有个可以通过矩阵处理图像的东西,不过说真的,以前也没有用过几次,不过好歹有个想法了。至于让图片跟随用户手势放大缩小,肯定是需要支持手势检测了。恩,我的思路暂时就是这样了,接下来先去了解一下手势检测。

手势检测

当用户触摸屏幕时,会产生许多手势,down、up、scroll、fling等。一般情况下我们通过实现OnTouchListener是可以满足我们处理一般手势的需求的,说实话,实现手势放大缩小的ImageView是可以通过自己在OnTouch方法里面处理距离,滑动什么的去算缩放的。但是人总是要对自己好一点,如果有更简单的实现方式为什么不用呢?Android中提供了GestureDetector给程序员去判断不同的手势。另外也提供了** ScaleGestureDetector **来检测缩放手势。虽然后者很像前者的子类,但事实上并不是,后者也是一个独立的类。下面用一个简单的demo来演示一下这两者的触发。

package com.example.luo_pc.view;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.view.GestureDetector;

import android.view.MotionEvent;

import android.view.ScaleGestureDetector;

import android.view.View;

import android.widget.Button;

import android.widget.Toast;

public class MainActivity extends AppCompatActivity implements GestureDetector.OnGestureListener,

View.OnClickListener, ScaleGestureDetector.OnScaleGestureListener {

//定义手势检测

GestureDetector detector = null;

//缩放检测

ScaleGestureDetector scDetector = null;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Button testGet = (Button) findViewById(R.id.bt_test_ges);

Button testScges = (Button) findViewById(R.id.bt_test_scges);

testGet.setOnClickListener(this);

testScges.setOnClickListener(this);

detector = new GestureDetector(this, this);

}

@Override

public void onClick(View v) {

switch (v.getId()) {

case R.id.bt_test_ges:

detector = new GestureDetector(this, this);

scDetector = null;

break;

case R.id.bt_test_scges:

scDetector = new ScaleGestureDetector(this, this);

detector = null;

break;

}

}

//-------------------------implement OnGestureListener's method-----------------------//

@Override

public boolean onTouchEvent(MotionEvent me) {

if (detector != null)

return detector.onTouchEvent(me);

else

return scDetector.onTouchEvent(me);

}

//用户按下屏幕就会触发

@Override

public boolean onDown(MotionEvent arg0) {

Toast.makeText(this, "onDown", Toast.LENGTH_SHORT).show();

return false;

}

//用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN,

//多个ACTION_MOVE, 1个ACTION_UP触发

//e1:第1个ACTION_DOWN MotionEvent

//e2:最后一个ACTION_MOVE MotionEvent

//velocityX:X轴上的移动速度,像素/秒

//velocityY:Y轴上的移动速度,像素/秒

@Override

public boolean onFling(MotionEvent arg0, MotionEvent arg1, float arg2,float arg3) {

Toast.makeText(this, "onFling", Toast.LENGTH_SHORT).show();

return false;

}

//用户长按触摸屏,由多个MotionEvent ACTION_DOWN触发

@Override

public void onLongPress(MotionEvent arg0) {

Toast.makeText(this, "onLongPress", Toast.LENGTH_SHORT).show();

}

//用户按下触摸屏,并拖动,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE触发

@Override

public boolean onScroll(MotionEvent arg0, MotionEvent arg1, float arg2,

float arg3) {

Toast.makeText(this, "onScroll", Toast.LENGTH_SHORT).show();

return false;

}

//如果是按下的时间超过瞬间,而且在按下的时候没有松开或者是拖动的,

// 那么onShowPress就会执行

@Override

public void onShowPress(MotionEvent arg0) {

Toast.makeText(this, "onShowPress", Toast.LENGTH_SHORT).show();

}

//用户(轻触触摸屏后)松开,由一个1个MotionEvent ACTION_UP触发

@Override

public boolean onSingleTapUp(MotionEvent arg0) {

Toast.makeText(this, "onSingleTapUp", Toast.LENGTH_SHORT).show();

return true;

}

//-----------------------implement OnScaleGestureListener's method----------------------//

@Override

public boolean onScale(ScaleGestureDetector detector) {

Toast.makeText(MainActivity.this, "onScale", Toast.LENGTH_SHORT).show();

return true;

}

@Override

public boolean onScaleBegin(ScaleGestureDetector detector) {

Toast.makeText(MainActivity.this, "onScaleBegin", Toast.LENGTH_SHORT).show();

return true;

}

@Override

public void onScaleEnd(ScaleGestureDetector detector) {

Toast.makeText(MainActivity.this, "onScaleEnd", Toast.LENGTH_SHORT).show();

}

}

图方便,我将整个MainActivity搬上来了,你可以直接复制,然后加上对应的布局和导包就行了,接下来看一下运行现象。

7ce081a1bbf9

GestureDetector

上面测试的是GestureDetec

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值