微信朋友圈图片显示缩放

近期公司非要做一个和微信朋友圈效果,还要求要惟妙惟肖。感觉最麻烦的就是在图片缩放的部分,结果发现微信在朋友圈图片点击放大的地方是渐入的,可是再次点击的时候是闪出的,没有渐变背景效果,所以修复了一下,如今分享给大家。(仅仅是个demo)详细应用到程序中,还须要大家依据自己的需求进行改进。

先说先原理在贴代码。

小伙伴我们既然要是模仿人家效果,首先是要观察。

1.打开微信朋友圈,点击有图片的它是渐变背景同一时候缩放。

2.再次点击放大后的图片,图片会缩小返回到所在列表的位置,让视觉上感觉是从列表里出来,之后又回到列表中。

看完以上两点,有的小伙伴就会想这会不会是一张图片?先不回答,接着往下看。

3.把wifi关掉,再次点击图片(这张图片,你没有点击过,而且已经在列表中显示出来了),你会发现事实上他们不是一张图片(上述问题不存在)。

4.高速刷列表(上拉载入很多其它)(关闭wifi情况下),你会发现列表中的图片等待载入图片是一张灰色的图片,这时候你点击这张灰色图片,是没有反映的,说明微信开发处理是:仅仅有图片载入完毕,才同意你点击。

5.打开wifi,单击一张图片放大(举个列子,是长方形320*160的图片),假设图片是寛320 高 160,假设你放大图片,这个放大的倍数怎么算,事实上非常easy,要么你先看微信朋友圈,看看我的推測有没有错:

推測:当屏幕是竖着,你看看这个图片最后到达边缘是哪个边,是寛?还是高?上述样例中320已经到边缘了,那么高就是最后到达边缘的,对吧。肯定对,那160变成480的高度(3.5寸的屏幕),当然这个缩放是同比的。480/图片的高度160 的出来3就是缩放的倍数。

6.如今拿出来微信找一张类似于寛是320*160的寛图,用两个手指缩放看看,你会发现,当达到我上传的推測后,不会继续放大。

7.微信图片单击后,多张能够左右滑动,单击缩小都会回到自己所在的位置。

8.还有,小图片有被缩减,这个缩减是有规律的:是把imgView.contentMode = UIViewContentModeScaleAspectFill;和第二5条心照不宣啊!,而且每一张图片都能缩放。

9.还有长按功能,这个假设上述8点实现,这个好说,对吧。

我来说说我这个demo实现的原理。先看看效果图片。

点击demo下载

  

(蓝色,能够删掉能够不删掉,是这个demo实现的过程)

1.首先要自己定义个继承UIScrollView 的自己定义ImgScrollView.h,用来缩放单张图片,然后把这个控件在放到UIScrollView中。

2.图片单击的时候出现渐变效果,事实上就是背景透明层的控制,这个不说,然后把Cell中图片位置进行坐标转换成相对当前屏幕的位置。

3.初始化一个UIScrollview,用来存放ImgScrollView,背景是透明色。

4.计算单击图片位置,将容器ScrollView的ContentOffset.x位置相应设置。

5.缩放图片,推断图片的长和寛哪一边先到边缘,一旦有一边达到边缘,停止缩放。

6.给图片加入单击事件,同一时候imgView.contentMode = UIViewContentModeScaleAspectFill。

TapImageView.h有单击事件的图片

#import <UIKit/UIKit.h>

@protocol TapImageViewDelegate <NSObject>

- (void) tappedWithObject:(id) sender;

@end

@interface TapImageView : UIImageView

@property (nonatomic, strong) id identifier;

@property (weak) id<TapImageViewDelegate> t_delegate;

@end

TapImageView.m

#import "TapImageView.h"

@implementation TapImageView

- (void)dealloc
{
    _t_delegate = nil;
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(Tapped:)];
        [self addGestureRecognizer:tap];

        self.clipsToBounds = YES;
        self.contentMode = UIViewContentModeScaleAspectFill;
        self.userInteractionEnabled = YES;
    }
    return self;
}

- (void) Tapped:(UIGestureRecognizer *) gesture
{
    if ([self.t_delegate respondsToSelector:@selector(tappedWithObject:)])
    {
        [self.t_delegate tappedWithObject:self];
    }
}

@end

ImgScrollView.h能够缩放的图片

#import <UIKit/UIKit.h>

@protocol ImgScrollViewDelegate <NSObject>

- (void) tapImageViewTappedWithObject:(id) sender;

@end

@interface ImgScrollView : UIScrollView

@property (weak) id<ImgScrollViewDelegate> i_delegate;

- (void) setContentWithFrame:(CGRect) rect;
- (void) setImage:(UIImage *) image;
- (void) setAnimationRect;
- (void) rechangeInitRdct;

@end

ImgScrollView.m

#import "ImgScrollView.h"

@interface ImgScrollView()<UIScrollViewDelegate>
{
    UIImageView *imgView;

    //记录自己的位置
    CGRect scaleOriginRect;

    //图片的大小
    CGSize imgSize;

    //缩放前大小
    CGRect initRect;
}

@end

@implementation ImgScrollView

- (void)dealloc
{
    _i_delegate = nil;
}

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        self.showsHorizontalScrollIndicator = NO;
        self.showsVerticalScrollIndicator = NO;
        self.bouncesZoom = YES;
        self.backgroundColor = [UIColor clearColor];
        self.delegate = self;
        self.minimumZoomScale = 1.0;

        imgView = [[UIImageView alloc] init];
        imgView.clipsToBounds = YES;
        imgView.contentMode = UIViewContentModeScaleAspectFill;
        [self addSubview:imgView];

    }
    return self;
}

- (void) setContentWithFrame:(CGRect) rect
{
    imgView.frame = rect;
    initRect = rect;
}

- (void) setAnimationRect
{
    imgView.frame = scaleOriginRect;
}

- (void) rechangeInitRdct
{
    self.zoomScale = 1.0;
    imgView.frame = initRect;
}

- (void) setImage:(UIImage *) image
{
    if (image)
    {
        imgView.image = image;
        imgSize = image.size;

        //推断首先缩放的值
        float scaleX = self.frame.size.width/imgSize.width;
        float scaleY = self.frame.size.height/imgSize.height;

        //倍数小的,先到边缘

        if (scaleX > scaleY)
        {
            //Y方向先到边缘
            float imgViewWidth = imgSize.width*scaleY;
            self.maximumZoomScale = self.frame.size.width/imgViewWidth;

            scaleOriginRect = (CGRect){self.frame.size.width/2-imgViewWidth/2,0,imgViewWidth,self.frame.size.height};
        }
        else
        {
            //X先到边缘
            float imgViewHeight = imgSize.height*scaleX;
            self.maximumZoomScale = self.frame.size.height/imgViewHeight;

            scaleOriginRect = (CGRect){0,self.frame.size.height/2-imgViewHeight/2,self.frame.size.width,imgViewHeight};
        }
    }
}

#pragma mark -
#pragma mark - scroll delegate
- (UIView *) viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return imgView;
}

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

    CGSize boundsSize = scrollView.bounds.size;
    CGRect imgFrame = imgView.frame;
    CGSize contentSize = scrollView.contentSize;

    CGPoint centerPoint = CGPointMake(contentSize.width/2, contentSize.height/2);

    // center horizontally
    if (imgFrame.size.width <= boundsSize.width)
    {
        centerPoint.x = boundsSize.width/2;
    }

    // center vertically
    if (imgFrame.size.height <= boundsSize.height)
    {
        centerPoint.y = boundsSize.height/2;
    }

    imgView.center = centerPoint;
}

#pragma mark -
#pragma mark - touch
- (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    if ([self.i_delegate respondsToSelector:@selector(tapImageViewTappedWithObject:)])
    {
        [self.i_delegate tapImageViewTappedWithObject:self];
    }
}

这里不是所有代码,详细demo已经上传。

git代码下载

点击demo下载

时间: 2024-10-10 11:43:11

微信朋友圈图片显示缩放的相关文章

android 在 ListView 的 item 中插入 GridView 仿微信朋友圈图片显示。

转载请声明出处(http://www.cnblogs.com/linguanh/) 先上张效果图: 1,思路简述 这个肯定是要重写 baseAdapter的了,这里我分了两个数据适配器,一个是自定义的 listView的item 风格xml,另一个是该风格xml文件里面的嵌套的GridView数据适配.然后我们需要两个数据辅助类,类似上述,一个是专门来保存在GridView中要显示的每张图片的信息,例如它的url.name.id等等,暂称该辅助类为 UserImgs,大家可以随便增删,另一个是总

Android仿微信朋友圈图片浏览器(支持图片手势缩放,拖动)

※效果 ※使用到的开源库 PhotoView 图片缩放:支持双击缩放,手指捏拉缩放 https://github.com/chrisbanes/PhotoView Universalimageloader 图片下载缓存库 https://github.com/nostra13/Android-Universal-Image-Loader ViewPagerIndicator 分页指示器 https://github.com/JakeWharton/Android-ViewPagerIndicat

仿微信朋友圈图片浏览

仿微信朋友圈图片浏览   Android仿微信朋友圈图片浏览,其中有图片的异步加,双击图片放缩,点击图片退出当前界面,横向滚动图片查看,不是很完善,有兴趣的朋友可以自己改改.  下载地址:http://www.devstore.cn/code/info/829.html  运行截图:    

图片在固定的宽高中不变形展示(访微信朋友圈图片展示)

此主要是结局后台数据给的图片尺寸规格不统一的问题,不过也有缺点,如果图片的尺寸跟你要展示的尺寸差异过大,有可能看不到全图,只能看到中间的部分: 先看实现后的效果图 下面是完整的代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>图片在固定的宽高中不变形展示(访微信朋友圈图片展示)</title> <

Android仿微信朋友圈图片查看器

转载请注明出处:http://blog.csdn.net/allen315410/article/details/40264551 看博文之前,希望大家先打开自己的微信点到朋友圈中去,仔细观察是不是发现朋友圈里的有个"九宫格"的图片区域,点击图片又会跳到图片的详细查看页面,并且支持图片的滑动和缩放?这个功能是不是很常用呢?!那么我今天正好做了这个Demo,下面为大家讲解一下.首先按照惯例先看一下效果图吧,尤其不会录制gif动画(哎~没办法,模拟器不支持多点触控,刚好我的手机又没有Roo

时间算法 转换 (类似微信朋友圈时间显示)

1 时间戳转换 - (NSString *)updateTimeForRow:(NSString *)createTimeString { // 获取当前时时间戳 1466386762.345715 十位整数 6位小数 NSTimeInterval currentTime = [[NSDate date] timeIntervalSince1970]; // 创建时间戳(后台返回的时间 一般是13位数字) NSTimeInterval createTime = [createTimeString

超简单--仿微信朋友圈展开显示更多文字功能

在做的项目需要这个功能.而且是挺常用的一个功能. 需求是有一个评论列表,太多时要隐藏,然后点击展开更多按钮就可以显示全文. 思路就是可以弄俩TextView,一个MaxLine为n,一个不限制,然后再弄个按钮控制两个TextView交替显示. 有了思路马上动手,然后发现这个效果真是很简单就实现了..效果图 好了,废话不多说,上代码.讲解不会很多,因为实在太简单了... <?xml version="1.0" encoding="utf-8"?> <

移动web HTML5使用photoswipe模仿微信朋友圈图片放大浏览

http://www.cnblogs.com/theroad/p/5397229.html 使用js框架是PhotoSwipe. PhotoSwipe是一个图片放大插件,兼容pc和移动端,经历过多个版本的迭代且一直在不断更新,踩过的坑不知凡几,在移动端有着巨大的优势.1.可控制多种风格如:标题.分享.全屏按钮,点击事件.是否加入字幕,背景透明等.2.可支持移动端触摸手势兼容pc端所有的基本手势支持:滑动下一个或上一个,拖动平移.缩放.放大或关闭,点击切换控件,双击放大或缩放.3.分享默认的UI有

CSS——微信朋友圈图片样式实现方法

<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,user-scalable=no,target-densitydpi=device-dpi" /> <style type="t