android 图片实现位移 伸缩 双指控制伸缩大小 图片四周有边框 还有控制按钮
时间: 2024-03-26 22:38:47 浏览: 13
要实现图片的位移、伸缩和双指控制伸缩大小,可以使用 Android 中的多点触控手势识别器(ScaleGestureDetector)和移动手势识别器(GestureDetector),将它们结合起来实现。
首先,在布局文件中添加一个 ImageView 控件,并设置边框:
```xml
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/my_image"
android:scaleType="matrix"
android:padding="10dp"
android:background="@drawable/border" />
<Button
android:id="@+id/controlButton"
...
/>
</FrameLayout>
```
其中,@drawable/border 可以是一个 XML 文件,定义边框的样式,比如:
```xml
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<stroke android:width="2dp" android:color="@android:color/black"/>
<solid android:color="@android:color/transparent"/>
</shape>
```
然后,在 Activity 中实现手势识别器和 ImageView 的相应操作:
```java
public class MainActivity extends AppCompatActivity {
private ImageView imageView;
private Button controlButton;
private GestureDetector gestureDetector;
private ScaleGestureDetector scaleGestureDetector;
private Matrix matrix = new Matrix();
private float[] matrixValues = new float[9];
private float lastTouchX, lastTouchY;
private boolean isScaling = false;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = findViewById(R.id.imageView);
controlButton = findViewById(R.id.controlButton);
gestureDetector = new GestureDetector(this, new GestureDetector.SimpleOnGestureListener() {
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
if (!isScaling) {
matrix.postTranslate(-distanceX, -distanceY);
imageView.setImageMatrix(matrix);
}
return true;
}
});
scaleGestureDetector = new ScaleGestureDetector(this, new ScaleGestureDetector.SimpleOnScaleGestureListener() {
@Override
public boolean onScale(ScaleGestureDetector detector) {
isScaling = true;
float scaleFactor = detector.getScaleFactor();
matrix.getValues(matrixValues);
float currentScale = matrixValues[Matrix.MSCALE_X];
float newScale = currentScale * scaleFactor;
if (newScale > 0.1f && newScale < 10f) {
matrix.postScale(scaleFactor, scaleFactor, detector.getFocusX(), detector.getFocusY());
imageView.setImageMatrix(matrix);
}
return true;
}
@Override
public void onScaleEnd(ScaleGestureDetector detector) {
isScaling = false;
}
});
imageView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
gestureDetector.onTouchEvent(event);
scaleGestureDetector.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastTouchX = event.getX();
lastTouchY = event.getY();
break;
case MotionEvent.ACTION_UP:
float currentX = event.getX();
float currentY = event.getY();
if (Math.abs(currentX - lastTouchX) < 10 && Math.abs(currentY - lastTouchY) < 10) {
// Handle click event here
}
break;
}
return true;
}
});
}
}
```
在这段代码中,我们使用了 GestureDetecotr 和 ScaleGestureDetector 两个手势识别器,分别处理移动和缩放手势。同时,我们也监听了 ImageView 的 onTouch 事件,以便处理点击事件。
最后,我们可以在 controlButton 的 onClickListener 中添加一些操作,比如还原图片大小、保存图片等。