【组件篇】ionic3均分列等宽高图像显示(上)

我在《ionic3开源组件》提到了图片选择组件,但是后来发现其实现功能很简单,而且我不喜欢它写死了宽高大小,这对于不同分别率不太友好。于是尝试实现了一下,先上效果图:

image.png

组件名为image-selector

image-selector.html:

<ion-row align-items-center>
  <ion-col col-3 align-self-center *ngFor="let item of images, let i = index">
    <ion-thumbnail tappable (click)="onViewImages(i)">
      <img src="{{item?.originPath}}" class="auto-image" [style.height]="width"/>
    </ion-thumbnail>
  </ion-col>
  <ion-col col-3 align-self-center>
    <ion-thumbnail *ngIf="images && images.length<max && canAdd" tappable (click)="onAddImage()">
      <img #addImage src="assets/imgs/add.png" class="auto-image"/>
    </ion-thumbnail>
  </ion-col>
</ion-row>

image-selector.scss:

image-selector {
  img.auto-image{
    width: 100%;
  }
}

image-selector.ts:

import { Component, Input, Output, EventEmitter, ElementRef, ViewChild } from '@angular/core';
import { IonicPage, ModalController, NavParams } from 'ionic-angular';

export interface IImageObj {
  id: string;
  originPath: string;
  thumbPath?: string;
  name?: string;
}
/**
 * Generated class for the ImageSelecterComponent component.
 *
 * See https://angular.io/docs/ts/latest/api/core/index/ComponentMetadata-class.html
 * for more info on Angular Components.
 */
@Component({
  selector: 'image-selector',
  templateUrl: 'image-selector.html'
})
export class ImageSelectorComponent {

  @Input() max: number = 9;  //最多可选择多少张图片,默认为4张

  @Input() canAdd: boolean = true;  //是否允许新增
  @Input() canDelete: boolean = true;  //是否允许删除
  @Input() images: IImageObj[] = [];   //图片列表,与fileObjListChange形成双向数据绑定

  @Output() addImage = new EventEmitter<any>();
  @Output() selectChanged = new EventEmitter<any>();

  width: string;
  @ViewChild('addImage') img: ElementRef;
  constructor(public modalCtrl: ModalController) {
  }

  onAddImage() {//新增照片
    this.addImage.emit();
  }

  ngAfterViewChecked(){
    this.width = this.img.nativeElement.width + 'px';
  }

  //照片预览
  onViewImages(index: number) {
    //以下代码自行调整
    let imgCopies = JSON.parse(JSON.stringify(this.images));    //复制对象,以免内部修改了对象
    let modal = this.modalCtrl.create('ImageViewerPage', {selectedIndex: index, images: imgCopies, canEdit: this.canDelete});
    modal.onDidDismiss(data =>{
      if(data){
        this.images = data;
        this.selectChanged.emit(data);
      }
    });
    modal.present();
  }
}

注意

  1. onViewImages方法里面我调用了另一个封装的ImageViewer组件,仿微信用于弹框缩放、滑动显示图片的,你可以自行封装自己的方法。
  2. 等宽高原理是借用了add.png的维度,利用add.png高度设置其它图像的高度。
  3. 重要的方法是ngAfterViewChecked,用于在内部调整图像高度,为什么用该方法,先了解下angular组件的生命周期。

ngAfterViewChecked:每次做完组件视图和子视图的变更检测之后调用

仅抛个砖,自己做点有趣的组件吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,232评论 4 61
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,285评论 25 708
  • 6.24今天的一天真的非常精彩,当运用了种子法则,我的订单在不断的增长中。 感恩今天休息,带娃一起来外婆家陪陪外婆...
    生活就该甜甜蜜蜜阅读 209评论 0 0
  • 当夏天又来了,你已不在。我独自徘徊,没有人,来去的方向早已注定。仿佛无常的命运,仿佛空荡的街景。我无数次的回头,巷...
    青青_8b5b阅读 374评论 2 1
  • 01 谁说,秋是一个收获的季节?她却在这样一个收获的季节,落下了生命的最后帷幕。谁说,秋是一个衰亡的季节?在这样一...
    向小暖阅读 422评论 3 2