package com.eighteengray.procamera.widget; import android.view.MotionEvent; import android.view.View; import android.view.ViewConfiguration; import com.eighteengray.commonutillibrary.ViewUtils; import com.eighteengray.procameralibrary.camera.TextureViewTouchEvent; import org.greenrobot.eventbus.EventBus; //TextureView的触摸事件。轻按拍摄区域,显示焦点,完成聚焦和测光。 //长按进行af/ae锁定。 // 单指滑动,如果是向右下则进度环增加,否则减小,用于调节焦点白平衡。 // 两手指拖动则完成焦距调节。 public class TextureViewTouchListener implements View.OnTouchListener { int mode; public static final int CLICK = 1; public static final int LongClick = 2; //前两者,都没有move,按下时间长短决定哪个 public static final int OnePointDrag = 3; public static final int TwoPointDrag = 4;//都有移动move,点数量不同 float downX, downY; float moveX, moveY; float upX, upY; float focusX, focusY; long downTime; long upTime; int touchSlop; //单指滑动,取横向纵向滑动最大距离,方向即为正负 float maxChangeDistance; float downDistance; float moveDistance; //两指滑动,取缩放比 float scale; @Override public boolean onTouch(View v, MotionEvent event) { touchSlop = ViewConfiguration.getTouchSlop(); switch (event.getAction() & MotionEvent.ACTION_MASK) { //单指触摸 case MotionEvent.ACTION_DOWN: downX = event.getX(); downY = event.getY(); downTime = event.getDownTime(); break; //两指触摸 case MotionEvent.ACTION_POINTER_DOWN: mode = TwoPointDrag; downDistance = ViewUtils.getDistance(event); break; //手指移动 case MotionEvent.ACTION_MOVE: moveX = event.getX(); moveY = event.getY(); //说明手指移动了 if(moveX != downX || moveY != downY) { //OnePointDrag模式 if(mode != TwoPointDrag) { mode = OnePointDrag; float absX = Math.abs(moveX - downX); float abxY = Math.abs(moveY - downY); if((absX - abxY > 0) && absX > touchSlop) { maxChangeDistance = moveX - downX; } else if((absX - abxY < 0) && abxY > touchSlop) { maxChangeDistance = moveY - downY; } TextureViewTouchEvent.TextureOneDrag textureOneDrag = new TextureViewTouchEvent.TextureOneDrag(); textureOneDrag.setDistance(maxChangeDistance); EventBus.getDefault().post(textureOneDrag); } //TwoPointDrag模式 else { moveDistance = ViewUtils.getDistance(event); scale = moveDistance / downDistance; } } break; //单指抬起 case MotionEvent.ACTION_UP: upX = event.getX(); upY = event.getY(); upTime = event.getEventTime(); //点没有挪动过 if(downX == upX && downY == upY) { //CLICK模式 if((upTime - downTime) < 1000) { mode = CLICK; TextureViewTouchEvent.TextureClick textureClick = new TextureViewTouchEvent.TextureClick(); textureClick.setX(downX); textureClick.setY(downY); textureClick.setRawX(event.getRawX()); textureClick.setRawY(event.getRawY()); EventBus.getDefault().post(textureClick); } //LongClick模式 else { mode = LongClick; TextureViewTouchEvent.TextureLongClick textureLongClick = new TextureViewTouchEvent.TextureLongClick(); textureLongClick.setX(downX); textureLongClick.setY(downY); EventBus.getDefault().post(textureLongClick); } } break; //两指抬起 case MotionEvent.ACTION_POINTER_UP: break; } return true; } }