拉动缩放动画

时间:2014-04-26 06:49:12

标签: android imageview zoom

我们中的许多人必须遇到Tinder Dripper 等应用,您可以在其中下拉包含图片的视图并放大图片。然后当你放手,图像缩小以回到原点状态。

让我们以Tinder为例:

原始状态:拉动后的放大状态:

original state zoomed-in state

iOS 中,由

完成
- (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);
    }

}

由于我在Objective C和iOS方面的专业知识非常有限,我无法在Android中实现它。

以下是我认为应该做的事情:

  • 抓住下拉手势
  • 通过拉动量增加视图的高度
  • 在图像上执行某种缩放动画以使其适合展开的视图

有没有人知道是否有可用于此目的的库?

2 个答案:

答案 0 :(得分:4)

查看这个项目:

https://github.com/Gnod/ParallaxListView

如果您将它与ViewPagerIndicator库结合使用,您几乎可以获得Tinder的个人资料页面功能集

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

答案 1 :(得分:2)

我认为最简单的方法是覆盖View的onTouchEvent方法。

这样的事情:

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;
}

修改 对于动画部分,请考虑以下帖子: https://stackoverflow.com/a/6650473/3568892