写一个textureview多点触摸控制,可以移动放大缩小图片和旋转的例子
时间: 2024-01-22 15:18:00 浏览: 25
好的,以下是一个简单的例子,使用TextureView实现多点触摸控制,可以移动、放大、缩小和旋转图片。
首先,在XML布局文件中添加一个TextureView:
```xml
<TextureView
android:id="@+id/texture_view"
android:layout_width="match_parent"
android:layout_height="match_parent" />
```
然后,在Activity中设置TextureView的监听器,并实现触摸事件的处理:
```java
public class MainActivity extends AppCompatActivity implements TextureView.SurfaceTextureListener, View.OnTouchListener {
private TextureView mTextureView;
private Bitmap mBitmap;
private Matrix mMatrix = new Matrix();
private float mLastX, mLastY;
private PointF mMidPoint = new PointF();
private float mLastRotation = 0;
private float mLastDistance = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextureView = findViewById(R.id.texture_view);
mTextureView.setSurfaceTextureListener(this);
mTextureView.setOnTouchListener(this);
}
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) {
// 初始化Bitmap
mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);
// 调整Bitmap尺寸,使其适应TextureView大小
mBitmap = Bitmap.createScaledBitmap(mBitmap, width, height, true);
// 绘制Bitmap
Canvas canvas = mTextureView.lockCanvas();
canvas.drawBitmap(mBitmap, mMatrix, null);
mTextureView.unlockCanvasAndPost(canvas);
}
@Override
public boolean onTouch(View view, MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:
// 记录触摸点坐标
mLastX = event.getX();
mLastY = event.getY();
break;
case MotionEvent.ACTION_POINTER_DOWN:
// 计算两个触摸点的中心坐标和距离
calculateMidPoint(event);
mLastDistance = calculateDistance(event);
mLastRotation = calculateRotation(event);
break;
case MotionEvent.ACTION_MOVE:
if (event.getPointerCount() == 1) {
// 单点移动
float dx = event.getX() - mLastX;
float dy = event.getY() - mLastY;
mMatrix.postTranslate(dx, dy);
} else if (event.getPointerCount() == 2) {
// 多点操作,包括放大、缩小和旋转
float distance = calculateDistance(event);
float scale = distance / mLastDistance;
mMatrix.postScale(scale, scale, mMidPoint.x, mMidPoint.y);
float rotation = calculateRotation(event);
float deltaRotation = rotation - mLastRotation;
mMatrix.postRotate(deltaRotation, mMidPoint.x, mMidPoint.y);
mLastDistance = distance;
mLastRotation = rotation;
}
// 更新触摸点坐标
mLastX = event.getX();
mLastY = event.getY();
// 绘制Bitmap
Canvas canvas = mTextureView.lockCanvas();
canvas.drawBitmap(mBitmap, mMatrix, null);
mTextureView.unlockCanvasAndPost(canvas);
break;
}
return true;
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surfaceTexture, int width, int height) {
// 调整Bitmap尺寸,使其适应TextureView大小
mBitmap = Bitmap.createScaledBitmap(mBitmap, width, height, true);
// 绘制Bitmap
Canvas canvas = mTextureView.lockCanvas();
canvas.drawBitmap(mBitmap, mMatrix, null);
mTextureView.unlockCanvasAndPost(canvas);
}
@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surfaceTexture) {
// 释放Bitmap内存
mBitmap.recycle();
return true;
}
@Override
public void onSurfaceTextureUpdated(SurfaceTexture surfaceTexture) {
}
private void calculateMidPoint(MotionEvent event) {
float x = (event.getX(0) + event.getX(1)) / 2;
float y = (event.getY(0) + event.getY(1)) / 2;
mMidPoint.set(x, y);
}
private float calculateDistance(MotionEvent event) {
float dx = event.getX(0) - event.getX(1);
float dy = event.getY(0) - event.getY(1);
return (float) Math.sqrt(dx * dx + dy * dy);
}
private float calculateRotation(MotionEvent event) {
float dx = event.getX(0) - event.getX(1);
float dy = event.getY(0) - event.getY(1);
return (float) Math.toDegrees(Math.atan2(dy, dx));
}
}
```
在该例子中,我们通过onSurfaceTextureAvailable方法获取TextureView的SurfaceTexture,然后初始化Bitmap并绘制到TextureView上。在onTouch方法中,我们根据手势类型分别处理单点移动和多点操作。对于多点操作,我们使用calculateMidPoint、calculateDistance和calculateRotation等方法计算触摸点的中心坐标、距离和旋转角度,并根据这些值来缩放、旋转Bitmap。最后,我们通过Canvas将Bitmap绘制到TextureView上。
需要注意的是,在onSurfaceTextureSizeChanged方法中,我们需要重新调整Bitmap的尺寸,以适应TextureView的新大小。在onSurfaceTextureDestroyed方法中,我们需要释放Bitmap的内存。