android imageview 多点触碰(MultiTouch)实现图片拖拽移动缩放
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
刚用android手机发现手机自带的图片浏览器挺酷可以用手指移动缩放还有动画效果
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(recentFile), "image/*");
startActivity(intent);
就可以调用系统的图片浏览器查看手机上的图片了
于是想仿照着写一个
到网上看了不少资料大概分为两种实现方式
/source/3318880 ->源码
一种是利用Matrix的postTranslate和postScale方法分别进行移动和缩放
这种方式实质是对ImageView中的drawable进行缩放和移动
imageview组件本身并没有移动和缩放这种方法实现起来比较简单但是不知道如何获得经过移动后的drawable的坐标和大小比较郁闷因为调用imageview的各种方法拿到的都是其本身的大小和坐标
而另一种是直接对imageview进行操作,直接移动和改变组件本身的大小从而实现移动和缩放
核心类继承->ImageView 并加入了一些动画效果
import android.content.Context;
import android.util.FloatMath;
import android.view.MotionEvent;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
/**
* 继承ImageView 实现了多点触碰的拖动和缩放
* @author Administrator
*
*/
publicclassTouchViewextendsImageView
{
staticfinalint NONE =0;
staticfinalint DRAG =1;//拖动中
staticfinalint ZOOM =2;//缩放中
staticfinalint BIGGER =3;//放大ing
staticfinalint SMALLER =4;//缩小ing
privateint mode = NONE;//当前的事件
privatefloat beforeLenght;//两触点距离
privatefloat afterLenght;//两触点距离
privatefloat scale =0.04f;//缩放的比例 X Y方向都是这个值越大缩放的越快
privateint screenW;
privateint screenH;
/*处理拖动变量 */
privateint start_x;
privateint start_y;
privateint stop_x ;
privateint stop_y ;
privateTranslateAnimation trans;//处理超出边界的动画
publicTouchView(Context context,int w,int h)
{
super(context);
this.setPadding(0,0,0,0);
screenW = w;
screenH = h;
}
/**
* 就算两点间的距离
*/
privatefloat spacing(MotionEventevent){
float x =event.getX(0)-event.getX(1);
float y =event.getY(0)-event.getY(1);
returnFloatMath.sqrt(x * x + y * y);
}
/**
* 处理触碰..
*/
@Override
publicboolean onTouchEvent(MotionEventevent)
{
switch(event.getAction()&MotionEvent.ACTION_MASK){
caseMotionEvent.ACTION_DOWN:
mode = DRAG;
stop_x =(int)event.getRawX();
stop_y =(int)event.getRawY();
start_x =(int)event.getX();
start_y = stop_y -this.getTop();
if(event.getPointerCount()==2)
beforeLenght = spacing(event);
break;
caseMotionEvent.ACTION_POINTER_DOWN:
if(spacing(event)>10f){
mode = ZOOM;
beforeLenght = spacing(event);
}
break;
caseMotionEvent.ACTION_UP:
/*判断是否超出范围并处理*/
int disX =0;
int disY =0;
if(getHeight()<=screenH ||this.getTop()<0)
{
if(this.getTop()<0)
{
int dis = getTop();
yout(this.getLeft(),0,this.getRight(),0+this.getHeight());
disY = dis - getTop();
}
elseif(this.getBottom()>screenH)
{
disY = getHeight()- screenH+getTop();
yout(this.getLeft(), screenH-getHeight(),this.getRight(), screenH); }
}
if(getWidth()<=screenW)
{
if(this.getLeft()<0)
{
disX = getLeft();
yout(0,this.getTop(),0+getWidth(),this.getBottom());
}
elseif(this.getRight()>screenW)
{
disX = getWidth()-screenW+getLeft();
yout(screenW-getWidth(),this.getTop(), screenW,this.getBottom()); }
}
if(disX!=0|| disY!=0)
{