Pull to Zoom Animation

試著忘記壹切 提交于 2019-12-03 12:44:45

问题


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:

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?


回答1:


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




回答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



来源:https://stackoverflow.com/questions/23307669/pull-to-zoom-animation

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!