You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

咨询:Fresco ZoomableDraweeView pinch缩放状态监听代码放置位置

解决方案:监听捏合缩放的状态变化

要检测捏合缩放的状态,你需要在缩放因子实时变化的回调方法中添加状态判断,而不是仅在双击的zoom方法里处理。以下是具体实现步骤:

1. 利用缩放因子变化的回调方法

AnimatedZoomableController继承自AbstractAnimatedZoomableController,其中有一个专门监听缩放比例变化的方法onScaleChanged——不管是双击缩放还是捏合缩放,只要缩放比例改变就会触发这个方法。

在AnimatedZoomableController中重写这个方法,添加状态判断:

@Override
protected void onScaleChanged(float previousScaleFactor, float newScaleFactor) {
    super.onScaleChanged(previousScaleFactor, newScaleFactor);
    
    // 判断当前是否处于缩放状态:缩放比例大于最小比例(原始状态)即为缩放状态
    boolean isCurrentlyZoomed = newScaleFactor > getMinScaleFactor();
    
    // 调用接口通知状态变化,注意判空避免空指针
    if (checkZoom != null) {
        checkZoom.isZoomed(isCurrentlyZoomed);
    }
}

2. 统一状态通知(可选优化)

你之前在zoom方法中手动调用了checkZoom.isZoomed(),其实可以把这部分代码移除——因为zoomToPoint方法执行后会自动触发onScaleChanged,这样就能统一通过这个回调来处理双击和捏合的状态通知,避免重复代码。

修改后的zoom方法:

public void zoom(PointF viewPoint) {
    PointF imagePoint = mapViewToImage(viewPoint);
    if(getScaleFactor() < getMaxScaleFactor()) {
        zoomToPoint(getMaxScaleFactor(), imagePoint, viewPoint, LIMIT_ALL, 400, null);
    } else {
        zoomToPoint(getMinScaleFactor(), imagePoint, viewPoint, LIMIT_ALL, 400, null);
    }
}

3. 初始化时同步初始状态

为了确保页面加载时就能正确获取图片的初始状态(原始状态),可以在AnimatedZoomableController中添加设置接口的方法,并在初始化时主动通知一次状态:

private CheckZoom checkZoom;

// 添加设置接口的方法
public void setCheckZoom(CheckZoom checkZoom) {
    this.checkZoom = checkZoom;
    // 初始化时通知当前状态
    if (checkZoom != null) {
        checkZoom.isZoomed(getScaleFactor() > getMinScaleFactor());
    }
}

然后在MainActivity中绑定Controller时设置接口:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    
    ZoomableDraweeView draweeView = findViewById(R.id.your_drawee_view_id);
    AnimatedZoomableController zoomableController = new AnimatedZoomableController();
    // 设置状态监听接口(MainActivity已实现CheckZoom)
    zoomableController.setCheckZoom(this);
    draweeView.setZoomableController(zoomableController);
    
    // 加载图片的代码...
}

原理说明

捏合缩放是一个连续的手势操作,会实时修改缩放因子,onScaleChanged方法会在每一次缩放因子变化时被调用,所以在这里判断当前缩放比例是否大于原始比例(getMinScaleFactor()),就能准确实时地通知图片的缩放状态。

内容的提问来源于stack exchange,提问作者NITIN sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:43:59