ANDROID-在Gallery小部件中滚动、多点触摸、平移图像视图 公共类PageGallery扩展了Gallery在ScalegestureListener、OnEstureListener上的实现{ 私有静态最终字符串标记=“多点触控事件”; 静态最终int NONE=0; 静态最终整数阻力=1; int模式=无; 私有上下文c; 私人最终布局平面图; 专用scalegestruedetector mScaleDetector; 私人手势检测器; 私人浮动mScaleFactor=1.f; 浮点数,浮点数,浮点数,浮点数,浮点数,浮点数,浮点数,浮点数; 矩阵=新矩阵(); 矩阵savedMatrix=新矩阵(); PointF mid=新的PointF(); PointF start=新的PointF(); 帕吉纳图像视图; 公共页面库(上下文、属性集){ 超级(上下文,atSet); mInflater=LayoutInflater.from(上下文); c=上下文; mDetector=新的GestureDetector(c,this); mScaleDetector=新的scalegestruedetector(c,this); } @凌驾 公共布尔onTouchEvent(运动事件){ pagina=(ImageView)super.getSelectedView(); if(mDetector.onTouchEvent(event)){//gesure-detector-per-i-movimenti Log.d(“onTouchEvent”,“--[MOVIMENTO]--”; 开关(event.getAction()&MotionEvent.ACTION\u掩码){ case MotionEvent.ACTION\u DOWN: init_x=event.getX(); init_y=event.getY(); 中点(中点,事件); savedMatrix.set(矩阵); set(event.getX(),event.getY()); 模式=拖动; 打破 case MotionEvent.ACTION\u移动: 如果(模式==拖动){ 矩阵集(savedMatrix); postTranslate(event.getX()-start.x,event.getY()-start.y); } 打破 } pagina=(ImageView)super.getSelectedView(); pagina.setImageMatrix(矩阵); 返回true; } else if(mScaleDetector.onTouchEvent(事件)){//缩放探测器每lo缩放 Log.d(“onTouchEvent”,“-[SCALE]-”; 返回true; } 其他的 返回false; } 公共布尔onScaleBegin(ScaleGetStereDetector检测器){ Log.d(标记“--onScaleBegin--”); 矩阵=pagina.getImageMatrix(); savedMatrix.set(矩阵); set(init_x,init_y); 返回true; } 公共布尔标度(scalegestruedetector检测器){ mScaleFactor*=detector.getScaleFactor(); mScaleFactor=数学最大值(0.1f,数学最小值(mScaleFactor,5.0f)); 如果(nuova_distanza_tocchi>10f){ 矩阵集(savedMatrix); 矩阵后量表(mScaleFactor,mScaleFactor,mid.x,mid.y); Log.d(“缩放”,matrix.toShortString()); } 否则{ 矩阵集(savedMatrix); postTranslate(init_x-start.x,init_y-start.y); Log.d(“平移”,matrix.toShortString()); } pagina.setImageMatrix(矩阵); pagina.invalidate(); Log.d(“MATRIX”,MATRIX.toString()); 返回true; } 标度仪上的公共空隙(标度仪检测器){ Log.d(标记“--onScaleEnd-->”); vecchia_distanza_tocchi=检测器.getPreviousSpan(); nuova_distanza_tocchi=检测器.getCurrentSpan(); } @凌驾 公共布尔onFling(MotionEvent e1、MotionEvent e2、float-velocityX、float-velocityY){ Log.d(标记“--onFling-->”); 浮子最大值=2500f; 浮动下限=1000f; float velX=数学绝对值(velocityX); 如果(velX>velMax){ velX=velMax; }否则如果(velX”); 返回super.onScroll(e1,e2,distanceX,distanceY); } 私有布尔IsCrollingleft(运动事件e1、运动事件e2){ 返回e2.getX()>e1.getX(); } 专用空心中点(点F点、MotionEvent事件){ float x=event.getX(0)+event.getX(1); float y=event.getY(0)+event.getY(1); 点集(x/2,y/2); } }

ANDROID-在Gallery小部件中滚动、多点触摸、平移图像视图 公共类PageGallery扩展了Gallery在ScalegestureListener、OnEstureListener上的实现{ 私有静态最终字符串标记=“多点触控事件”; 静态最终int NONE=0; 静态最终整数阻力=1; int模式=无; 私有上下文c; 私人最终布局平面图; 专用scalegestruedetector mScaleDetector; 私人手势检测器; 私人浮动mScaleFactor=1.f; 浮点数,浮点数,浮点数,浮点数,浮点数,浮点数,浮点数,浮点数; 矩阵=新矩阵(); 矩阵savedMatrix=新矩阵(); PointF mid=新的PointF(); PointF start=新的PointF(); 帕吉纳图像视图; 公共页面库(上下文、属性集){ 超级(上下文,atSet); mInflater=LayoutInflater.from(上下文); c=上下文; mDetector=新的GestureDetector(c,this); mScaleDetector=新的scalegestruedetector(c,this); } @凌驾 公共布尔onTouchEvent(运动事件){ pagina=(ImageView)super.getSelectedView(); if(mDetector.onTouchEvent(event)){//gesure-detector-per-i-movimenti Log.d(“onTouchEvent”,“--[MOVIMENTO]--”; 开关(event.getAction()&MotionEvent.ACTION\u掩码){ case MotionEvent.ACTION\u DOWN: init_x=event.getX(); init_y=event.getY(); 中点(中点,事件); savedMatrix.set(矩阵); set(event.getX(),event.getY()); 模式=拖动; 打破 case MotionEvent.ACTION\u移动: 如果(模式==拖动){ 矩阵集(savedMatrix); postTranslate(event.getX()-start.x,event.getY()-start.y); } 打破 } pagina=(ImageView)super.getSelectedView(); pagina.setImageMatrix(矩阵); 返回true; } else if(mScaleDetector.onTouchEvent(事件)){//缩放探测器每lo缩放 Log.d(“onTouchEvent”,“-[SCALE]-”; 返回true; } 其他的 返回false; } 公共布尔onScaleBegin(ScaleGetStereDetector检测器){ Log.d(标记“--onScaleBegin--”); 矩阵=pagina.getImageMatrix(); savedMatrix.set(矩阵); set(init_x,init_y); 返回true; } 公共布尔标度(scalegestruedetector检测器){ mScaleFactor*=detector.getScaleFactor(); mScaleFactor=数学最大值(0.1f,数学最小值(mScaleFactor,5.0f)); 如果(nuova_distanza_tocchi>10f){ 矩阵集(savedMatrix); 矩阵后量表(mScaleFactor,mScaleFactor,mid.x,mid.y); Log.d(“缩放”,matrix.toShortString()); } 否则{ 矩阵集(savedMatrix); postTranslate(init_x-start.x,init_y-start.y); Log.d(“平移”,matrix.toShortString()); } pagina.setImageMatrix(矩阵); pagina.invalidate(); Log.d(“MATRIX”,MATRIX.toString()); 返回true; } 标度仪上的公共空隙(标度仪检测器){ Log.d(标记“--onScaleEnd-->”); vecchia_distanza_tocchi=检测器.getPreviousSpan(); nuova_distanza_tocchi=检测器.getCurrentSpan(); } @凌驾 公共布尔onFling(MotionEvent e1、MotionEvent e2、float-velocityX、float-velocityY){ Log.d(标记“--onFling-->”); 浮子最大值=2500f; 浮动下限=1000f; float velX=数学绝对值(velocityX); 如果(velX>velMax){ velX=velMax; }否则如果(velX”); 返回super.onScroll(e1,e2,distanceX,distanceY); } 私有布尔IsCrollingleft(运动事件e1、运动事件e2){ 返回e2.getX()>e1.getX(); } 专用空心中点(点F点、MotionEvent事件){ float x=event.getX(0)+event.getX(1); float y=event.getY(0)+event.getY(1); 点集(x/2,y/2); } },scroll,gallery,zooming,imageview,pan,Scroll,Gallery,Zooming,Imageview,Pan,我扩展了一个实现onScaleGestureListener的库,并在主活动中设置了一个onItemClickListener 这段代码工作得很好:我可以在我的图库中收缩以缩放所有图像视图,并且可以平移已缩放的图像视图。但是,当我缩放图像时,如何禁用Gallery滚动,然后再启用? 对不起,我英语不好 Thnks 我认为您必须在要处理“touch”事件的类中使用调用方法dispatchTouchEvent(),而不是在库中 public class PageGallery extends Gal

我扩展了一个实现onScaleGestureListener的库,并在主活动中设置了一个onItemClickListener

这段代码工作得很好:我可以在我的图库中收缩以缩放所有图像视图,并且可以平移已缩放的图像视图。但是,当我缩放图像时,如何禁用Gallery滚动,然后再启用? 对不起,我英语不好
Thnks

我认为您必须在要处理“touch”事件的类中使用调用方法
dispatchTouchEvent()
,而不是在库中

public class PageGallery extends Gallery implements OnScaleGestureListener, OnGestureListener{

private static final String TAG = "Multitouch eventi";
static final int NONE = 0;
static final int DRAG = 1;  
int mode = NONE;

private Context c;
private final LayoutInflater mInflater;

private ScaleGestureDetector mScaleDetector;
private GestureDetector mDetector;
private float mScaleFactor = 1.f;

float nuova_distanza_tocchi, vecchia_distanza_tocchi, init_x, init_y;

Matrix matrix = new Matrix();
Matrix savedMatrix = new Matrix();

PointF mid = new PointF();
PointF start = new PointF();

ImageView pagina;


public PageGallery(Context context, AttributeSet atSet) {
    super(context, atSet);
    mInflater = LayoutInflater.from(context);
    c = context;
    mDetector = new GestureDetector(c,this);
    mScaleDetector = new ScaleGestureDetector(c, this);
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    pagina = (ImageView) super.getSelectedView();

    if (mDetector.onTouchEvent(event)) { // gesure detector per i movimenti
        Log.d("onTouchEvent", "--[ MOVIMENTO ]--");
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
        case MotionEvent.ACTION_DOWN:
            init_x = event.getX();
            init_y = event.getY();
            midPoint(mid, event);
            savedMatrix.set(matrix);
            start.set(event.getX(), event.getY());
            mode = DRAG;
            break;
        case MotionEvent.ACTION_MOVE:
            if (mode == DRAG) {
                matrix.set(savedMatrix);
                matrix.postTranslate(event.getX() - start.x, event.getY() - start.y);
            }
            break;
        }

        pagina = (ImageView) super.getSelectedView();
        pagina.setImageMatrix(matrix);

        return true;
    }
    else if(mScaleDetector.onTouchEvent(event)) { // scale detector per lo zoom
        Log.d("onTouchEvent", "--[ SCALE ]--");
        return true;
    }
    else 
        return false;
}


public boolean onScaleBegin(ScaleGestureDetector detector) {
    Log.d(TAG, "-- onScaleBegin --");
    matrix = pagina.getImageMatrix();
    savedMatrix.set(matrix);
    start.set(init_x, init_y);
    return true;
}

public boolean onScale(ScaleGestureDetector detector) {

    mScaleFactor *= detector.getScaleFactor();
    mScaleFactor = Math.max(0.1f, Math.min(mScaleFactor, 5.0f));

    if (nuova_distanza_tocchi > 10f) {
        matrix.set(savedMatrix);
        matrix.postScale(mScaleFactor, mScaleFactor, mid.x, mid.y);
        Log.d("ZOOMMING",matrix.toShortString());
    }
    else {
        matrix.set(savedMatrix);
        matrix.postTranslate(init_x - start.x, init_y - start.y);
        Log.d("PANNING",matrix.toShortString());
    }

    pagina.setImageMatrix(matrix);

    pagina.invalidate();

    Log.d("MATRIX", matrix.toString());
    return true;
}

public void onScaleEnd(ScaleGestureDetector detector) {
    Log.d(TAG, "-- onScaleEnd --");
    vecchia_distanza_tocchi = detector.getPreviousSpan();
    nuova_distanza_tocchi = detector.getCurrentSpan();
}


@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    Log.d(TAG, "-- onFling --");

    float velMax = 2500f;
    float velMin = 1000f;
    float velX = Math.abs(velocityX);
    if (velX > velMax) {
      velX = velMax;
    } else if (velX < velMin) {
      velX = velMin;
    }
    velX -= 600;
    int k = 500000;
    int speed = (int) Math.floor(1f / velX * k);
    setAnimationDuration(speed);

    int kEvent;
    if (isScrollingLeft(e1, e2)) {
      kEvent = KeyEvent.KEYCODE_DPAD_LEFT;
    } else {
      kEvent = KeyEvent.KEYCODE_DPAD_RIGHT;
    }
    onKeyDown(kEvent, null);

    return true;
}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
    Log.d(TAG, "-- onScroll --");
    return super.onScroll(e1, e2, distanceX, distanceY);
}


private boolean isScrollingLeft(MotionEvent e1, MotionEvent e2){
    return e2.getX() > e1.getX();
}


private void midPoint(PointF point, MotionEvent event) {
    float x = event.getX(0) + event.getX(1);
    float y = event.getY(0) + event.getY(1);
    point.set(x / 2, y / 2);
}
}