图库内的图像缩放/平移

kas*_*che 2 android

我想在android gallery小部件中缩放/平移图像.图像覆盖全屏.虽然我可以在库中缩放/平移图像,但我无法滑动到下一张/上一张图像.单个图像的缩放和平移工作正常.

我创建了一个TouchImageView,它扩展了ImageView,可以从Hello Android书籍中进行缩放和平移.然后我在Adapter类的getView()方法中返回了这个TouchImageView,它将图像返回到Gallery.

我在http://groups.google.com/group/android-developers/msg/97421179bfc5a3b2的 Google群组中发现了完全相同的问题,但没有回复.

谢谢.

Eri*_*ric 5

我通过创建一个从Gallery小部件类派生的新类来解决这个问题.我打电话给我的ZoomableGallery.我已经实现了一些手势监听器来处理缩放和双击以便在非多点触控或2.0之前的设备上进行缩放.

public class ZoomableGallery extends Gallery implements OnDoubleTapListener, OnGestureListener, OnScaleGestureListener {}
Run Code Online (Sandbox Code Playgroud)

关键是不要让你的内部小部件消耗触摸事件.创建一个响应触摸事件并放大和缩小的ZoomablePannableImageView似乎是正确的想法.这似乎是一个好主意,因为这个可重用的组件也可以在Gallery之外运行良好.但是我认为它不能很好地运作.最好的方法是创建一个不处理触摸事件或设置任何gesturelisteners的ZoomableImageView,而是提供一个api,用于设置比例因子和X,Y维度中的平移作为常规方法.

然后,一旦你走了这条路线,你就可以让你的Gallery小部件的后代巧妙地处理所有的触摸事件,只转发需要去的小部件的触摸动作.我的意思是,如果我们放大图像,我们几乎观察整个图像,除了左边的4个像素在屏幕之外.如果我们收到触摸事件,则将图像向右滚动8个像素.我们的图库小部件需要向图像小部件发送平移4像素的正确消息.然后它还需要消耗4个像素的水平运动本身.因此,不仅图像视图显示它的完整左边缘,而且它向右滑动一点可能显示图库适配器中的下一个图像视图.

在扩展Gallery的新类中覆盖的关键函数是:

    @Override
public boolean onTouchEvent(MotionEvent event) {}
Run Code Online (Sandbox Code Playgroud)

    @Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
        float distanceY) {}
Run Code Online (Sandbox Code Playgroud)

我不想复制和粘贴我的整个实现,因为它很乱,很难理解,它也可以在压力下显示一些小问题.但我不认为这是因为我采用的策略,只是因为我还没有清理它.

关键是要记住用户所处的模式(在图像内部进行缩放或平移,平移整个图库)

在用户在图像内部进行平移的情况下,这是我的代码在onScroll方法中处理switch语句的样子:

        case INNERDRAG:
        float unhandledPan = mCurrentPannable.panHorizontally(distanceX);

        // Negative unhandled pan means that we are shifting over to the image to the right

        if (unhandledPan != 0.0f) {
            if (unhandledPan < 0.0f)
                mMode = GALPANRIGHT;
            else
                mMode = GALPANLEFT;

            return super.onScroll(e1,e2,0.0f-unhandledPan,distanceY);

        } else {
            return true;
        }       
Run Code Online (Sandbox Code Playgroud)

在此代码中,mCurrentPannable引用图库当前"选中"的视图.Pannable只是一个界面,它将panHorizo​​ntally和panVertically定义为执行两项操作的函数:尝试通过如此多的像素平移内部视图,如果平移量超出它可以平移的边缘,则返回像素数它无法处理.

然后画廊而不是传递相同的参数到super.onScroll它只传递泛没有消耗的东西.

我希望这有帮助.