该工具类可以使ImageView自由缩放、移动图片。初始状态为fitCenter。
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.ScaleGestureDetector;
import android.view.View;
import android.widget.ImageView;
import androidx.annotation.NonNull;
public class Utils {
private double imageView_height,imageView_width,resource_width,resource_height;//控件大小,资源大小
private double scaleValue,scaleValue_default;//缩放值、默认缩放值
private double scrollX,scrollY,scrollX_default,scrollY_default;//x偏移量,y偏移量,默认x偏移量,默认y偏移量
private double ix,iy;//触发位置
private Bitmap bitmap_resource,bitmap_scale;
/**
* 该工具方法可以使ImageView自由缩放、移动图片。初始状态为fitCenter。
* !!使用本方法时请确定ImageView已有固定大小值,如XXdp、XXsp、wrap_context!!
* 使用match_parent无法获取大小
* 设置后imageView可对设置的图片放大缩小,移动位置、双击恢复初始
* !!想让imageView对点击、双击、长按等有反应可修改、添加gestureDetector内部方法!!
* @param context
* @param imageView 有固定大小值的ImageView
* @param imageResourceId 显示的图片id
*/
@SuppressLint("ClickableViewAccessibility")
public void setImageViewCanScaleAndImageResource(Context context, ImageView imageView, int imageResourceId){
//所有值初始化-因为是静态变量
imageView_height=0;imageView_width=0;resource_width=0;resource_height=0;
scaleValue=0;scaleValue_default=0;
scrollX=0;scrollY=0;scrollX_default=0;scrollY_default=0;
ix=0;iy=0;
//获取控件
imageView_height=imageView.getLayoutParams().height;
imageView_width=imageView.getLayoutParams().width;
Log.d("控件大小","h"+imageView_height+"w"+imageView_width);
imageView.setScaleType(ImageView.ScaleType.MATRIX);
//获取资源位图&&宽高
bitmap_resource= BitmapFactory.decodeResource(context.getResources(),imageResourceId);
resource_width=bitmap_resource.getWidth();
resource_height=bitmap_resource.getHeight();
//初始缩放
if(resource_width/resource_height>imageView_width/imageView_height){
//宽型图-宽度填满
scaleValue=imageView_width/resource_width;
scrollY=(imageView_height-resource_height*scaleValue)/2;
} else {
//高型图-高度填满
scaleValue=imageView_height/resource_height;
scrollX=(imageView_width-resource_width*scaleValue)/2;
}
//储存初始值
scaleValue_default=scaleValue;
scrollX_default=scrollX;
scrollY_default=scrollY;
//缩放
Matrix matrix=new Matrix();
matrix.setScale((float) scaleValue, (float) scaleValue);
bitmap_scale=Bitmap.createBitmap(bitmap_resource,0,0, bitmap_resource.getWidth(), bitmap_resource.getHeight(),matrix,true);
//设置图片位置
matrix=new Matrix();
matrix.setTranslate((float) scrollX, (float) scrollY);
imageView.setImageMatrix(matrix);
//设置图片
imageView.setImageBitmap(bitmap_scale);
ScaleGestureDetector scaleGestureDetector=new ScaleGestureDetector(context,new ScaleGestureDetector.SimpleOnScaleGestureListener(){
public boolean onScale(@NonNull ScaleGestureDetector detector) {
//缩放触发
//获取新缩放值
double newScaleValue=scaleValue*detector.getScaleFactor();
if(newScaleValue<0.5*scaleValue_default){
newScaleValue=0.5*scaleValue_default;
} else if (newScaleValue>5*scaleValue_default) {
newScaleValue=5*scaleValue_default;
}
//获取ix,iy在资源图缩放前假位置
double resource_x=ix-scrollX;
double resource_y=iy-scrollY;
//获取ix,iy在资源图缩放前真位置
double reallyX=resource_x/scaleValue;
double reallyY=resource_y/scaleValue;
//获取缩放后移动
scrollX=ix-reallyX*newScaleValue;
scrollY=iy-reallyY*newScaleValue;
scaleValue=newScaleValue;
//缩放
Matrix matrix=new Matrix();
matrix.setScale((float) scaleValue, (float) scaleValue);
bitmap_scale=Bitmap.createBitmap(bitmap_resource,0,0, (int) resource_width, (int) resource_height,matrix,true);
//设置图片位置
matrix=new Matrix();
matrix.setTranslate((float) scrollX, (float) scrollY);
imageView.setImageMatrix(matrix);
//设置图片
imageView.setImageBitmap(bitmap_scale);
return true;
}
});
GestureDetector gestureDetector=new GestureDetector(context,new GestureDetector.SimpleOnGestureListener(){
public boolean onScroll(@NonNull MotionEvent e1, @NonNull MotionEvent e2, float distanceX, float distanceY) {
//设置图片位置
Matrix matrix=new Matrix();
scrollX=scrollX-distanceX;
scrollY=scrollY-distanceY;
//宽大于控件宽
if((resource_width*scaleValue)>imageView_width){
//防止图片太靠左导致看不见
if(scrollX<(0-resource_width*scaleValue+imageView_width)){
scrollX=0-resource_width*scaleValue+imageView_width;
}
//防止图片太靠右导致看不见
else if(scrollX>0){
scrollX=0;
}
}
//宽小于控件宽
else {
//防止图片太靠左导致看不见
if(scrollX<(0-resource_width*scaleValue)/2){
scrollX=(0-resource_width*scaleValue)/2;
}
//防止图片太靠右导致看不见
else if(scrollX>imageView_width-(resource_width*scaleValue/2)){
scrollX=imageView_width-(resource_width*scaleValue/2);
}
}
//图高大于控件高
if(resource_height*scaleValue>imageView_height){
//防止图片太靠上导致看不见
if(scrollY<0-resource_height*scaleValue+imageView_height){
scrollY=0-resource_height*scaleValue+imageView_height;
}
//防止图片太靠下导致看不见
else if (scrollY>0){
scrollY=0;
}
}
//图高小于控件高
else {
//防止图片太靠上导致看不见
if(scrollY<=(0-resource_height*scaleValue)/2){
scrollY=(0-resource_height*scaleValue)/2;
}
//防止图片太靠下导致看不见
else if (scrollY>=imageView_height-(resource_height*scaleValue)/2){
scrollY=imageView_height-(resource_height*scaleValue)/2;
}
}//防止图片太靠右导致看不见
if(scrollX>=imageView_width-(resource_width*scaleValue/2)){
scrollX=imageView_width-(resource_width*scaleValue/2);
}
//防止图片太靠左导致看不见
if(scrollX<=(0-resource_width*scaleValue)/2){
scrollX=(0-resource_width*scaleValue)/2;
}
//防止图片太靠下导致看不见
if (scrollY>=imageView_height-(resource_height*scaleValue)/2){
scrollY=imageView_height-(resource_height*scaleValue)/2;
}
//防止图片太靠上导致看不见
if(scrollY<=(0-resource_height*scaleValue)/2){
scrollY=(0-resource_height*scaleValue)/2;
}
matrix.setTranslate((float) scrollX, (float) scrollY);
imageView.setImageMatrix(matrix);
//设置图片
imageView.setImageBitmap(bitmap_scale);
return true;
}
public boolean onDoubleTap(@NonNull MotionEvent e) {
scaleValue=scaleValue_default;
scrollX=scrollX_default;
scrollY=scrollY_default;
//缩放
Matrix matrix=new Matrix();
matrix.setScale((float) scaleValue, (float) scaleValue);
bitmap_scale=Bitmap.createBitmap(bitmap_resource,0,0, (int) resource_width, (int) resource_height,matrix,true);
//设置图片位置
matrix=new Matrix();
matrix.setTranslate((float) scrollX, (float) scrollY);
imageView.setImageMatrix(matrix);
//设置图片
imageView.setImageBitmap(bitmap_scale);
return true;
}
});
imageView.setOnTouchListener(new View.OnTouchListener() {
public boolean onTouch(View view, MotionEvent motionEvent) {
ix= motionEvent.getX();
iy=motionEvent.getY();
//缩放
scaleGestureDetector.onTouchEvent(motionEvent);
//滑动
gestureDetector.onTouchEvent(motionEvent);
return true;
}
});
}
}