实现如下图所示效果:
实现步骤:
1、为图片控件ImageView设置setOnTouchListener()
iv = (ImageView) findViewById(R.id.picture); iv.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: break; default: break; } return false; } });
ACTION_DOWN、ACTION_MOVE、ACTION_UP是事件中最常用的动作,分别代表手指落下、手指移动、手指抬起(离开)
2、我们只需处理ACTION_MOVE 就可以实现该功能,在实现功能之前我们先了解一下OnTouch方法的第二个参数MotionEvent, 从这个参数中我们不仅可以通过getAction()得到事件的类型,还有getX(),getY()可以获取手指在屏幕中的坐标。如果是多点触控可以通过getPointerCount()来获取当前触控点的个数,getX(int pointIndex)、getY(int pointIndex)来得到指定点的坐标。
3、代码不多,也不墨迹了直接上代码
package com.example.multipointtest; import android.app.Activity; import android.os.Bundle; import android.view.MotionEvent; import android.view.View; import android.view.View.OnTouchListener; import android.view.ViewGroup.LayoutParams; import android.widget.ImageView; public class MainActivity extends Activity { ImageView iv; int currentDistance; int lastDistance = -1; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); iv.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View view, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: if(event.getPointerCount()>=2){ float xLength = event.getX(1) - event.getX(0); float yLength = event.getY(1) - event.getY(0); //利用勾股定理来得到两指之间的距离 currentDistance = (int) Math.sqrt(xLength*xLength + yLength*yLength); if(lastDistance < 0){ lastDistance = currentDistance; break; }else if(currentDistance-lastDistance>5){ //放大 LayoutParams lp = (LayoutParams) iv.getLayoutParams(); lp.height = (int)((float)iv.getMeasuredHeight()*1.05f); lp.width = (int)((float)iv.getMeasuredWidth()*1.05f); iv.setLayoutParams(lp); }else if(currentDistance-lastDistance<-5){ //缩小 LayoutParams lp = (LayoutParams) iv.getLayoutParams(); lp.height = (int)((float)iv.getMeasuredHeight()*0.95f); lp.width = (int)((float)iv.getMeasuredWidth()*0.95f); iv.setLayoutParams(lp); } lastDistance = currentDistance; } break; case MotionEvent.ACTION_UP: break; default: break; } return true; } }); } }