带缩放和滚动功能的Android自定义图像视图

带缩放和滚动功能的Android自定义图像视图,android,scroll,imageview,zooming,pinchzoom,Android,Scroll,Imageview,Zooming,Pinchzoom,我正在尝试创建一个带有缩放和滚动的图像视图。通过互联网检查了许多解决方案,但没有得到准确的结果。我当前的imageview具有滚动属性。需要添加缩放 public class MapView extends ImageView { private GestureDetectorCompat gestureDetector; private OverScroller overScroller; private final int screenW; private

我正在尝试创建一个带有缩放和滚动的图像视图。通过互联网检查了许多解决方案,但没有得到准确的结果。我当前的imageview具有滚动属性。需要添加缩放

public class MapView extends ImageView {

    private GestureDetectorCompat gestureDetector;
    private OverScroller overScroller;

    private final int screenW;
    private final int screenH;

    private int positionX = 0;
    private int positionY = 0;

    public MapView(Context context) {
        super(context);
        // We need screen dimensions to make sure we don't over scroll the image
        DisplayMetrics dm = getResources().getDisplayMetrics();
        screenW = dm.widthPixels;
        screenH = dm.heightPixels;

        gestureDetector = new GestureDetectorCompat(context, gestureListener);
        overScroller = new OverScroller(context);
    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        gestureDetector.onTouchEvent(event);
        return true;
    }

    @Override
    public void computeScroll() {
        super.computeScroll();
        // computeScrollOffset() returns true only when the scrolling isn't
        // already finished
        if (overScroller.computeScrollOffset()) {
            positionX = overScroller.getCurrX();
            positionY = overScroller.getCurrY();
            scrollTo(positionX, positionY);
        } else {
            // when scrolling is over, we will want to "spring back" if the
            // image is overscrolled
            overScroller.springBack(positionX, positionY, 0, getMaxHorizontal(), 0, getMaxVertical());
        }
    }

    private int getMaxHorizontal() {
        return (Math.abs(getDrawable().getBounds().width() - screenW));
    }



    private int getMaxVertical() {
        return (Math.abs(getDrawable().getBounds().height() - screenH));
    }



    private SimpleOnGestureListener gestureListener = new SimpleOnGestureListener() {

        @Override
        public boolean onDown(MotionEvent e) {
            overScroller.forceFinished(true);
            ViewCompat.postInvalidateOnAnimation(MapView.this);
            return true;
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                               float velocityY) {
            overScroller.forceFinished(true);
            overScroller.fling(positionX, positionY, (int) -velocityX, (int) -velocityY, 0, getMaxHorizontal(), 0,
                    getMaxVertical());
            ViewCompat.postInvalidateOnAnimation(MapView.this);
            return true;
        }

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2,
                                float distanceX, float distanceY) {
            overScroller.forceFinished(true);
            // normalize scrolling distances to not overscroll the image
            int dx = (int) distanceX;
            int dy = (int) distanceY;
            int newPositionX = positionX + dx;
            int newPositionY = positionY + dy;
            if (newPositionX < 0) {
                dx -= newPositionX;
            } else if (newPositionX > getMaxHorizontal()) {
                dx -= (newPositionX - getMaxHorizontal());
            }
            if (newPositionY < 0) {
                dy -= newPositionY;
            } else if (newPositionY > getMaxVertical()) {
                dy -= (newPositionY - getMaxVertical());
            }
            overScroller.startScroll(positionX, positionY, dx, dy, 0);
            ViewCompat.postInvalidateOnAnimation(MapView.this);
            return true;
        }
    };

}
公共类MapView扩展了ImageView{
私人手势检测器Compat手势检测器;
私人超级市场超级市场;
私人最终int screenW;
私人最终int屏幕H;
私有int位置x=0;
私有int位置y=0;
公共地图视图(上下文){
超级(上下文);
//我们需要屏幕尺寸,以确保不会过度滚动图像
DisplayMetrics dm=getResources().getDisplayMetrics();
screenW=dm.width像素;
screenH=dm.heightPixels;
gestureDetector=新的GestureDetectorCompat(上下文,gestureListener);
overScroller=新的overScroller(上下文);
}
@凌驾
公共布尔onTouchEvent(运动事件){
手势检测器。onTouchEvent(事件);
返回true;
}
@凌驾
public void computeScroll(){
super.computeScroll();
//computeScrollOffset()仅在滚动未被激活时返回true
//已经完成
if(overScroller.computeScrolOffset()){
positionX=overScroller.getCurrX();
positionY=overScroller.getCurrY();
滚动至(位置X、位置Y);
}否则{
//滚动结束后,如果
//图像被过度渲染
回弹(位置X,位置Y,0,getMaxHorizontal(),0,getMaxVertical());
}
}
私有int getMaxHorizontal(){
返回(Math.abs(getDrawable().getBounds().width()-screenW));
}
私有int getMaxVertical(){
返回(Math.abs(getDrawable().getBounds().height()-screenH));
}
私有SimpleOnGestureListener gestureListener=新SimpleOnGestureListener(){
@凌驾
公共布尔onDown(运动事件e){
过卷。强制完成(真);
ViewCompat.postInvalidateOnAnimation(MapView.this);
返回true;
}
@凌驾
公共布尔onFling(运动事件e1、运动事件e2、浮点速度X、,
浮动速度y){
过卷。强制完成(真);
过卷器。fling(位置x,位置y,(int)-velocityX,(int)-velocityY,0,getMaxHorizontal(),0,
getMaxVertical());
ViewCompat.postInvalidateOnAnimation(MapView.this);
返回true;
}
@凌驾
公共布尔onScroll(运动事件e1、运动事件e2、,
浮动距离X,浮动距离Y){
过卷。强制完成(真);
//规范化滚动距离,以避免过度滚动图像
int dx=(int)距离x;
int-dy=(int)距离;
int newPositionX=位置x+dx;
int newPositionY=positionY+dy;
如果(新位置x<0){
dx-=新位置x;
}else if(newPositionX>getMaxHorizontal()){
dx-=(newPositionX-getMaxHorizontal());
}
如果(新位置Y<0){
dy-=newPositionY;
}else if(newPositionY>getMaxVertical()){
dy-=(newPositionY-getMaxVertical());
}
过卷机开始滚动(位置X、位置Y、dx、dy、0);
ViewCompat.postInvalidateOnAnimation(MapView.this);
返回true;
}
};
}

我可以得到一些关于这个的建议吗?

您可能希望查看这个开源库:


它可以满足您的需要,而且可以做得更多,但是很容易缩减您所需要的内容

您可能希望查看此开源库:


它可以满足您的需要,而且功能更强大,但很容易削减您所需的功能

好吧<代码>0x3A28213A,
0x6339392C
0x7363682E
。对不起,我忍不住了。好吧<代码>0x3A28213A,
0x6339392C
0x7363682E
。对不起,我无法抗拒。