質問

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?

役に立ちましたか?

解決

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

他のヒント

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top