9

Many of us must have come across apps like Tinder and Dripper where you can pull down on the view containing an image and the image zooms in. And then when you let it go, the image zooms out to go back to its origin state.

Let's take an example from Tinder :

Original State: and Zoomed-in state when pulled:

original state zoomed-in state

In iOS it is done by

- (void)viewDidLoad {
    [super viewDidLoad];

    self.imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"church-welcome.png"]];
    self.imageView.contentMode = UIViewContentModeScaleAspectFill;
    self.cachedImageViewSize = self.imageView.frame;
    [self.tableView addSubview:self.imageView];
    [self.tableView sendSubviewToBack:self.imageView];
    self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 170)];

}

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {

    CGFloat y = -scrollView.contentOffset.y;
    if (y > 0) {
        self.imageView.frame = CGRectMake(0, scrollView.contentOffset.y, self.cachedImageViewSize.size.width+y, self.cachedImageViewSize.size.height+y);
        self.imageView.center = CGPointMake(self.view.center.x, self.imageView.center.y);
    }

}

Since my expertise in Objective C and iOS is very limited, I am not being able to implement it in Android.

Here is what I think should be done :

  • catch the pull-down gesture
  • increase the height of the view by the pull amount
  • do some sort of scale animation on the Image to fit it in the expanded view

Does anyone have any idea if there is any library that could be used for this purpose?

adneal
  • 30,484
  • 10
  • 122
  • 151
Swayam
  • 16,294
  • 14
  • 64
  • 102

2 Answers2

4

Check out this project:

https://github.com/Gnod/ParallaxListView

If you combine it with the ViewPagerIndicator library, you pretty much get Tinder's profile page feature set

https://github.com/JakeWharton/Android-ViewPagerIndicator

Adam Kis
  • 1,404
  • 14
  • 17
  • This is exactly what I saw looking for! I wasn't aware that it's called a Parallax List view! Just the name helped me get some awesome projects on it! Thanks a lot Adam! :) – Swayam Jun 09 '14 at 05:45
  • Is it possible to apply the same strategy for zoon in/out for WebView? – Sergii Dec 30 '14 at 10:13
  • 2
    @Swayam were you able to implement this like Tinder does? I mean combine it with ViewPager? – Atul O Holic Jul 10 '15 at 10:23
  • Yes, I was. I am not sure if I have the code with me anymore, but yeah, using Parallax ListView was the way to go. – Swayam Jul 10 '15 at 10:25
2

I think the easiest way is to override the onTouchEvent method of View.

Something like this:

boolean inZoom = false;
float prevY = 0;

@Override
public boolean onTouchEvent(MotionEvent event) {
    float eventY = event.getY();
    float eventX = event.getX();
    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
        if(touchedTheImage(eventX, eventY)){
            setZoomCenter(eventX, eventY);
            prevY = eventY;
            inZoom = true;
            return true;
        }
        break;
    case MotionEvent.ACTION_MOVE:
        if(inZoom){
            changeZoomLevel(prevY, eventY);
            return true;
        }
        break;
    case MotionEvent.ACTION_UP:
        if(inZoom){
            resetZoomLevel();
            inZoom = false;
            return true;
        }
        break;
    }
  return false;
}

EDIT: for the animation part consider this post: https://stackoverflow.com/a/6650473/3568892

Community
  • 1
  • 1
bgoeschi
  • 145
  • 6
  • Thanks for the answer! I am kinda novice in animations and touch events. Could you kindly give a more elaborate answer? I mean, what would the zoom() functions do and stuff like that. Thanks again! – Swayam Apr 26 '14 at 07:18
  • You could play around with the setBounds() method... See the post I referenced; instead of width/2 and height/2 you would use the values set with "setZoomCenter" (don't forget to convert to imageView coordinates) and "changeZoomLevel" obviously sets what is called "zoomController" in the other post... – bgoeschi Apr 26 '14 at 07:31
  • The link looks really promising! Giving it a try! Thanks! – Swayam Apr 26 '14 at 07:42