9宫格实现微信朋友圈图片点击放大缩小弹簧效果

用Vue.js做了一个九宫格图片展示模块(可点击进行缩放) 使用Vue.js实现点击图片进行缩放的效果,主要包括利用v-for进行图片渲染,模块的class切换 阅读详情

//之前写Demo要实现点击scrollView中图片的放大缩小的效果,用了scrollView自带的viewForZoomingInScrollView方法,效果不明显,后来改用点击图片,切换控制器,但是就有明显的push和pop痕迹(以上2种都需要给图片添加tap手势),还是不理想,最后在网上看到个类似微信朋友圈的demo,可以点击图片,放大缩小,并可以添加手势。

//用到的3方为"SDPhotoBrowser"

//最好是在tableViewcell中使用,但是我这有别的需求。

1.需要创建个继承自UIView的9宫格view

.h

/*************/

#import <UIKit/UIKit.h>

#import "SDPhotoBrowser.h"


///九宫格图片间隔

#define kJGG_GAP 5

/**

 *

 *  @param index      点击index

 *  @param dataSource 数据源

 */

typedef void (^TapBlcok)(NSInteger index,NSArray *dataSource,NSIndexPath *indexpath);


@interface JGGView : UIView<SDPhotoBrowserDelegate>

/**

 *  九宫格显示的数据源,dataSource中可以放UIImage对象和NSString(http://sjfjfd.cjf.jpg),还有NSURL也可以

 */

@property (nonatomic, retain)NSArray * dataSource;

/**

 *  TapBlcok

 */

@property (nonatomic, copy)TapBlcok  tapBlock;

/**

 *  TapBlcok

 */

@property (nonatomic, copy)NSIndexPath  *indexpath;

/**

 *  Description 九宫格

 *

 *  @param frame      frame

 *  @param dataSource 数据源

 *  @param tapBlock tapBlock点击的block

 *  @return JGGView对象

 */

- (instancetype)initWithFrame:(CGRect)frame dataSource:(NSArray *)dataSource completeBlock:(TapBlcok )tapBlock;



/**

 *  Description 九宫格

 *

 *  @param dataSource 数据源

 *  @param tapBlock tapBlock点击的block

 *  @return JGGView对象

 */

-(void)JGGView:(JGGView *)jggView DataSource:(NSArray *)dataSource completeBlock:(TapBlcok)tapBlock;


/**

 *  配置图片的宽(正方形,宽高一样)

 *

 *  @return

 */

+(CGFloat)imageWidth;

/**

 *  配置图片的高(正方形,宽高一样)

 *

 *  @return

 */

+(CGFloat)imageHeight;

@end

/*****************/
.m


#import "JGGView.h"

#import "UIImageView+WebCache.h"

#import "Masonry.h"



@implementation JGGView


- (instancetype)initWithFrame:(CGRect)frame dataSource:(NSArray *)dataSource completeBlock:(TapBlcok )tapBlock

{

    self = [super initWithFrame:frame];

    if (self) {

        for (NSUInteger i=0; i<dataSource.count; i++) {

            UIImageView *iv = [[UIImageView alloc]initWithFrame:CGRectMake(0+([JGGView imageWidth]+kJGG_GAP)*(i%3),floorf(i/3.0)*([JGGView imageHeight]+kJGG_GAP),[JGGView imageWidth], [JGGView imageHeight])];

            if ([dataSource[i] isKindOfClass:[UIImage class]]) {

                iv.image = dataSource[i];

            }else if ([dataSource[i] isKindOfClass:[NSString class]]){

                [iv sd_setImageWithURL:[NSURL URLWithString:dataSource[i]] placeholderImage:[UIImage imageNamed:@"placeholder"]];

            }else if ([dataSource[i] isKindOfClass:[NSURL class]]){

                [iv sd_setImageWithURL:dataSource[i] placeholderImage:[UIImage imageNamed:@"placeholder"]];

            }

            self.dataSource = dataSource;

            self.tapBlock = tapBlock;// 一定要给self.tapBlock赋值

            iv.userInteractionEnabled = YES;//默认关闭NO,打开就可以接受点击事件

            iv.tag = i;

            [self addSubview:iv];

            UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapImageAction:)];

            [iv addGestureRecognizer:singleTap];

        }

    }

    return self;

}

-(void)JGGView:(JGGView *)jggView DataSource:(NSArray *)dataSource completeBlock:(TapBlcok)tapBlock

{

        for (NSUInteger i=0; i<dataSource.count; i++) {

            UIImageView *iv = [UIImageView new];

            if ([dataSource[i] isKindOfClass:[UIImage class]]) {

                iv.image = dataSource[i];

            }else if ([dataSource[i] isKindOfClass:[NSString class]]){

                [iv sd_setImageWithURL:[NSURL URLWithString:dataSource[i]] placeholderImage:[UIImage imageNamed:@"placeholder"]];

            }else if ([dataSource[i] isKindOfClass:[NSURL class]]){

                [iv sd_setImageWithURL:dataSource[i] placeholderImage:[UIImage imageNamed:@"placeholder"]];

            }

            jggView.dataSource = dataSource;

            jggView.tapBlock = tapBlock;

            iv.userInteractionEnabled = YES;//默认关闭NO,打开就可以接受点击事件

            iv.tag = i;

            [jggView addSubview:iv];

            //九宫格的布局

            CGFloat  Direction_X = (([JGGView imageWidth]+kJGG_GAP)*(i%4));

            CGFloat  Direction_Y  = (floorf(i/4.0)*([JGGView imageHeight]+kJGG_GAP));

            

            [iv mas_makeConstraints:^(MASConstraintMaker *make) {

                make.left.mas_equalTo(jggView).offset(Direction_X);

                make.top.mas_equalTo(jggView).offset(Direction_Y);

                make.size.mas_equalTo(CGSizeMake([JGGView imageWidth], [JGGView imageHeight]));

            }];

            

            UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc]initWithTarget:jggView action:@selector(tapImageAction:)];

            [iv addGestureRecognizer:singleTap];

        }

    

}

#pragma mark

#pragma mark 配置图片的宽高

+(CGFloat)imageWidth{

    return ([UIScreen mainScreen].bounds.size.width-(2*kGAP+kAvatar_Size)*2)/3;

}

+(CGFloat)imageHeight{

    return ([UIScreen mainScreen].bounds.size.width-(2*kGAP+kAvatar_Size)*2)/3;

}

-(void)tapImageAction:(UITapGestureRecognizer *)tap{

    UIImageView *tapView = (UIImageView *)tap.view;

    

    SDPhotoBrowser *photoBrowser = [SDPhotoBrowser new];

    photoBrowser.delegate = self;

    photoBrowser.currentImageIndex = tapView.tag;

    photoBrowser.imageCount = _dataSource.count;

    photoBrowser.sourceImagesContainerView = self;

    [photoBrowser show];

    

    

    if (self.tapBlock) {

        self.tapBlock(tapView.tag,self.dataSource,self.indexpath);

    }

}

#pragma mark - SDPhotoBrowserDelegate


- (NSURL *)photoBrowser:(SDPhotoBrowser *)browser highQualityImageURLForIndex:(NSInteger)index

{s

    NSString *urlString = self.dataSource[index];

    return [NSURL URLWithString:urlString];

}

- (UIImage *)photoBrowser:(SDPhotoBrowser *)browser placeholderImageForIndex:(NSInteger)index

{

    UIImageView *imageView = self.subviews[index];

    return imageView.image;

}

@end

/********************************/
布局没必要完全按照9宫格,可以根据项目要求定
/**************/
2.在需要添加图片的地方创建9宫格view,并将其添加到父视图上

self.jggView = [JGGView new];

    

[myScrollView addSubview:self.jggView];//myScrollView就是我9宫格的父视图,展示图片的地方

接着对9宫格进行布局

CGFloat jjg_height = 0.0;

    CGFloat jjg_width = 0.0;

    if (imageArr.count>0&&imageArr.count<=4) {/*这里的4,可以根据自己项目要求进行更改,还有另外3种判断,需要的可以找我要demo*,项目中的宏,稍后附上/

        jjg_height = [JGGView imageHeight];

        jjg_width  = (imageArr.count)*([JGGView imageWidth]+kJGG_GAP)-kJGG_GAP;

    }

    ///解决图片复用问题

    [self.jggView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];

    ///布局九宫格

    [self.jggView JGGView:self.jggView DataSource:imageArr completeBlock:^(NSInteger index, NSArray *dataSource,NSIndexPath *indexpath) {

        NSLog(@"%ld",(long)index);

       

    }];

    [self.jggView mas_updateConstraints:^(MASConstraintMaker *make) {

        make.left.mas_equalTo(0);

        make.top.mas_equalTo(myScrollView.mas_top).offset(kJGG_GAP);

        make.size.mas_equalTo(CGSizeMake(jjg_width, jjg_height));

    }];


/******************************************************************/

 其实早到这里就可以实现我上述的功能了,还有更复杂的,等有别的要求在再更新

/**实现中用到的宏*/

//9宫格用到的宏

#define kGAP 10

#define kThemeColor [UIColor colorWithRed:0 green:(190 / 255.0) blue:(12 / 255.0) alpha:1]

#define kAvatar_Size 40


#define kTabBarHeight       49

#define kNavbarHeight       64


#define kAlmostZero         0.0000001

/**********************************************  over  ****************************************/



①css实现九宫格动画——前端筑基&&每天一道前端案例实现 justify-content 属性(水平)对齐弹性容器的项目,当项目不占用主轴上所有可用空间时。filter 属性定义了元素(通常是< img>)的可视效果(例如:模糊与饱度)。之所以称之为flex,因为其能够拓展收缩flex容器内的元素,最大限度地填充可用空间。定义了多根轴线的置,若项目仅仅只有一条轴线,则设置不起作用。滤镜通常使用百分比(例如:75%或者是0.75).该方法会给DOM元素添加类或者是消除类,点击。toggle() 方法切换元素的可见状态。,transition不会有任何效果 阅读详情

相关推荐

9宫格转场动画实现

https://s27.aconvert.com/convert/p3r68-cdx67/0hhta-ufe70.gif 现在在展示页面经常是这种转场动画效果,直接上代码 界面A 在转上界面B 的时候 先看下跳转界面的代码 package com.example.hubenkui.myapplication; import android.content.Intent; impor...

ahubenkui的博客 912

Android 共享元素 揭露动画

在github上看到,大神做出了一个华丽的转场效果,使用了Silde,依次将子控件滑出界面(在上一篇里面,已经学习了怎么使用),然后将列表上item的某一个元素共享,使之成为下个页面的焦点,再执行一RevealAnimator。 本博将试图从用户体验交互效果上来说明,良好的过渡动画交互的重要性。

Android studio(安卓应用开发):点击下方九张图片中任意一张,放大显示在上方

图片效果: 代码1: package com.example.a0925; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.view.View; import android.widget.Button; import android.widget.ImageView; public class MainActivity extends AppCompatActivi

qq_52526226的博客 2138

关于方块在九宫格的移动效果

JS效果

magicfly9527的专栏 3830

鸿蒙实现仿微信朋友圈发布九宫格选择图片效果

鸿蒙实现仿微信朋友圈九宫格选择图片发布效果

Abner_Crazy的博客 2177

朋友圈九宫格android,CUTTT - 四六九宫格藏图,玩出朋友圈新高度 - Android 应用 - 图像 - 【最美应用】...

照片分享的乐趣,也正是生活分享的乐趣,我们想要把自己的故事记录下来,想让一些人有机会了解我们的生活,亦或是告诉我们的朋友我现在过得怎么样了,你那边还好吗?所以分享照片本身就应该是一件很快乐的事情,而今天介绍的这款 APP -「CUTTT」还可以让我们获得加倍的这种快乐,来看看吧~宫格切图相信大家对这个早已不再陌生了,将一张图片切割成 9 份,每一份成为一张单独的照片,然后排列组合分享出去,在满是小...

weixin_36059241的博客 441

android 九宫格封装,Android 实现九宫格点击图片放大全屏浏览等

live_icon.jpg1370473-587d9058f76372fb.gif说说我的实现思路:逐渐掌握了Android开发套路,是时候自己去封装一些东西了。网上看了一些例子,感觉不是我想要的那种,我希望是直接导入就用,没有Activity,没有xml布局文件,全代码创建那种,使用者用起来直接用到一个类或者两个类就OK的那种。故此花了一点时间封装了这么一个九宫格:需要有这么一个控件,这个控件是...

weixin_33955394的博客 512

android 九宫格点击,android 拍照相册略缩图九宫格显示,点击预览缩放

public class MainActivity extends AppCompatActivity {private Stringfilename;private Stringname;Buttonbtn_photo;private static final int REQUEST_CODE =100;private NoScrollGridViewitemLayout;private Arr...

weixin_42559413的博客 365

鸿蒙应用开发 | 6大布局之 表格布局(TableLayout)!

大家好,我是你们的朋友 朋哥,今天开始朋哥开始研究鸿蒙了,会写一些文章分享给大家,希望多多提意见。 上一篇原创文章解读了鸿蒙开发布局的堆叠布局(StackLayout) ,就是将布局一层一层的叠加起来,可以设置相对的置,使用场景也比较特殊,使用的比较少,也是相对比较简单的一种布局。 如果有开始学习的开发者可以不断的练习,只有多多练习了才能记住学会。 简介: 表格布局,就是像表格一样,如果有需要做一个界面效果是一种表格效果,或者九宫格,就需要用这种布局。 给大家...

1691

android从九宫格全屏预览,仿微信朋友圈展示图片九宫格图片展示控件,支持点击图片全屏预览大图...

AssNineGridView 仿微信朋友圈展示图片九宫格图片展示控件,支持点击图片全屏预览大图(可自定义)。写在前面这是一个九宫格控件,本来是很久之前就写好了,现在才开源出来,也是看了很多优秀的框架才整理出来的,希望能够帮助到大家。 该项目是参考了优秀框架:https://github.com/jeasonlzy/NineGridView 修改而成, 调整了个部分源码,使九宫格展示更为合理,...

weixin_42356803的博客 799

android 元素共享动画,Android 共享元素动画

介绍该动画主要是用来两个界面的转场过渡,原理是两个activity共享同一个元素控件。步骤1.在两个界面activity的共享控件中添加同一个属性android:transitionName="myimageview"自定义的字符串“myimageview”需要保持一致。比如跳转前:activity_a.xmlandroid:id="@+id/img"android:layout_width="3...

weixin_36463088的博客 658

Android开发 自定义ViewGroup 实现微信九格图功能(图片不同排布不同) 一种图片点击变暗效果

一、图片点击变暗效果       1、继承Imageview       2、重写OnDraw方法;判断室友点击(isPressed)如果为true则canvas。drawColor(0xARGB),经常测试如果不写透明度 就没效果; @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas);

u010589742的博客 1193

安卓实现微信朋友圈查看图片功能

废话不多说,直接看代码吧,因为本篇时基于##安卓自定义加载九宫格图片(完全动态,超简单)上修改的,所以大家可以先看看上一篇文章,你会发现从显示图片到查看图片简直很简单。/*** 主界面** @author 小口口、*///获取布局//查看大图@Override//监听长按事件//图片下标+1//单个图片的长按事件。...

小口口的博客 1859

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

看博文之前,希望大家先打开自己的微信点到朋友圈中去,仔细观察是不是发现朋友圈里的有个“九宫格”的图片区域,点击图片又会跳到图片的详细查看页面,并且支持图片的滑动缩放?这个功能是不是很常用呢?!那么我今天正好做了这个Demo,下面为大家讲解一下。首先按照惯例先看一下效果图吧,尤其不会录制gif动画(哎~没办法,模拟器不支持多点触控,刚好我的手机又没有Root,不能录屏,悲催啊,大家见谅,想要看真实效果的话,烦请移到博文最下方,点击下载源码,运行后再看效果哈~~),这里先就拿几张静态的图片顶替一下好了。见谅!

Vincent的专栏 4万+

模仿微信图片放大页功能以及进入退出效果

模仿微信图片放大页功能以及进入退出效果 类似微信图片放大页的进出动画图片预览支持图片手势缩放、拖拽等操作,基于ImageViewer微修改,修复了一处崩溃,一处体验 效果: 自定义属性 属性名 描述 ivr_show_index 是否显示图片置 ivr_do_enter 是否开启进场动画 ivr_do_exit 是否开启退场动画 ivr_duration...

yuanyang5917的专栏 601

【Android视图效果】共享元素实现仿微信查看大图效果

在之前的文章中,我们通过动画实现了这个,具体可以查看【Android 动画动画详解之仿微信查看大图效果(四),这里,我们用过度动画实现。 什么是共享元素? 它是Android 5.0新加入的一种过度动画,主要用于2个activity之间,可以共享某些控件,实现无缝转场的动画。 如何使用? 1.为共享元素指定统一的 transition name 2.启动 Activity 时带上共享元素参数 ...

欢子的博客 1907

Android仿微信朋友圈九宫格图片展示自定义控件,支持缩放动画~

一直对微信朋友圈九宫格图片显示控件比较好奇,找到一篇介绍相关骚操作的博客 Android:NineGridLayout — 仿微信朋友圈QQ空间的九宫格图片展示自定义控件 博客虽好但是不够完美,缺少点击图片预览页面缩放动画,作为一个不断追求完美主义的人,我想把这个控件结合到项目中而不是单纯作为一个控件。 下面是我的实现效果图: (九张图) (单张图) 1 整个demo需要用...

梁超杰 1万+

Android---仿QQ空间动态九宫格图片预览(一)

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立完备以及实战技术的提升都是不利的。真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

2301_76278775的博客 1227
上一篇: UIButton加视图/文字
下一篇: xcode8升级,后台总打印一些乱七八糟的东西
DemoFootMan
博客等级 码龄10年 0粉丝 38原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值