带缩放和滚动功能的Android自定义图像视图
我正在尝试创建一个带有缩放和滚动的图像视图。通过互联网检查了许多解决方案,但没有得到准确的结果。我当前的imageview具有滚动属性。需要添加缩放带缩放和滚动功能的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
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
。对不起,我无法抗拒。