写一个TextureView 可以放大缩小和旋转使用setTransform避免闪屏
时间: 2023-12-03 11:47:18 浏览: 32
好的,可以参考以下代码实现:
```
public class ZoomRotateTextureView extends TextureView implements ScaleGestureDetector.OnScaleGestureListener {
private static final int INVALID_POINTER_ID = -1;
private ScaleGestureDetector mScaleGestureDetector;
private int mActivePointerId = INVALID_POINTER_ID;
private float mLastTouchX;
private float mLastTouchY;
private float mPosX;
private float mPosY;
public ZoomRotateTextureView(Context context) {
super(context);
mScaleGestureDetector = new ScaleGestureDetector(context, this);
}
public ZoomRotateTextureView(Context context, AttributeSet attrs) {
super(context, attrs);
mScaleGestureDetector = new ScaleGestureDetector(context, this);
}
public ZoomRotateTextureView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mScaleGestureDetector = new ScaleGestureDetector(context, this);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
mScaleGestureDetector.onTouchEvent(event);
final int action = event.getAction();
switch (action & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN: {
final float x = event.getX();
final float y = event.getY();
mLastTouchX = x;
mLastTouchY = y;
mActivePointerId = event.getPointerId(0);
break;
}
case MotionEvent.ACTION_MOVE: {
final int pointerIndex = event.findPointerIndex(mActivePointerId);
final float x = event.getX(pointerIndex);
final float y = event.getY(pointerIndex);
// Only move if the ScaleGestureDetector isn't processing a gesture.
if (!mScaleGestureDetector.isInProgress()) {
final float dx = x - mLastTouchX;
final float dy = y - mLastTouchY;
mPosX += dx;
mPosY += dy;
setTransform();
}
mLastTouchX = x;
mLastTouchY = y;
break;
}
case MotionEvent.ACTION_UP: {
mActivePointerId = INVALID_POINTER_ID;
break;
}
case MotionEvent.ACTION_CANCEL: {
mActivePointerId = INVALID_POINTER_ID;
break;
}
case MotionEvent.ACTION_POINTER_UP: {
final int pointerIndex = (event.getAction() & MotionEvent.ACTION_POINTER_INDEX_MASK)
>> MotionEvent.ACTION_POINTER_INDEX_SHIFT;
final int pointerId = event.getPointerId(pointerIndex);
if (pointerId == mActivePointerId) {
// This was our active pointer going up. Choose a new
// active pointer and adjust accordingly.
final int newPointerIndex = pointerIndex == 0 ? 1 : 0;
mLastTouchX = event.getX(newPointerIndex);
mLastTouchY = event.getY(newPointerIndex);
mActivePointerId = event.getPointerId(newPointerIndex);
}
break;
}
}
return true;
}
private void setTransform() {
Matrix matrix = new Matrix();
matrix.postTranslate(mPosX, mPosY);
setTransform(matrix);
}
@Override
public boolean onScale(ScaleGestureDetector detector) {
float scaleFactor = detector.getScaleFactor();
setPivotX(detector.getFocusX());
setPivotY(detector.getFocusY());
Matrix matrix = new Matrix(getTransform());
matrix.postScale(scaleFactor, scaleFactor, detector.getFocusX(), detector.getFocusY());
setTransform(matrix);
return true;
}
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
return true;
}
@Override
public void onScaleEnd(ScaleGestureDetector detector) {
}
}
```
这个类继承自TextureView,并实现了ScaleGestureDetector.OnScaleGestureListener接口,在触摸事件中处理触摸事件,实现缩放和拖动操作,通过setTransform()方法设置TextureView的变换矩阵,避免闪屏问题。