【问题标题】:Pull to Zoom Animation拉动缩放动画
【发布时间】:2014-06-12 00:38:40
【问题描述】:

我们中的许多人一定遇到过像 TinderDripper 这样的应用程序,您可以在其中下拉包含图像的视图并放大图像。然后当您放开它时,图像缩小以返回其原始状态。

让我们以 Tinder 为例:

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

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 中实现它。

这是我认为应该做的:

  • 捕捉下拉手势
  • 通过拉取量增加视图的高度
  • 对图像进行某种缩放动画以使其适合展开的视图

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

【问题讨论】:

    标签: android imageview zooming


    【解决方案1】:

    看看这个项目:

    https://github.com/Gnod/ParallaxListView

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

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

    【讨论】:

    • 这正是我所看到的!我不知道它被称为视差列表视图!只是这个名字帮助我得到了一些很棒的项目!非常感谢亚当! :)
    • 是否可以对 WebView 的放大/缩小应用相同的策略?
    • @Swayam 你能像 Tinder 一样实现这个吗?我的意思是把它和 ViewPager 结合起来?
    • 是的,我是。我不确定我是否还有代码,但是是的,使用 Parallax ListView 是要走的路。
    【解决方案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

    【讨论】:

    • 感谢您的回答!我在动画和触摸事件方面有点新手。您能否给出更详细的答案?我的意思是,zoom() 函数会做什么以及类似的东西。再次感谢!
    • 您可以使用 setBounds() 方法...请参阅我引用的帖子;而不是 width/2 和 height/2 您将使用“setZoomCenter”设置的值(不要忘记转换为 imageView 坐标),而“changeZoomLevel”显然在另一篇文章中设置了所谓的“zoomController”...
    • 链接看起来很有希望!试一试!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多