分享好友 移动开发首页 频道列表

实现美图秀秀必备的轻量级 Android 滤镜库

Android开发  2016-08-30 10:460

本类库可以对ImageView,View Background,Drawable和Bitmap添加风格与设置亮度、对比度。本类库现提供十种风格,具体见下方图示。可以开启动画效果,并设置差值器Interpolator,监听器Listener。对ImageView/View/Drawable可以获取变换风格后的Bitmap。

如果只需要操作ImageView,则可以使用StyleImageView类,该类支持通过布局文件设置属性。如果已经使用了自定义ImageView,或需要操作View的Background,或是任意Drawable与Bitmap,则可以使用Styler类。

注:本类库使用ColorFilter实现效果,如果你已经使用了ColorFilter,有可能产生冲突。

Try Sample

欢迎访问 chengdazhi.com/styleimageview 下载样例程序apk或者扫描下方二维码:

实现美图秀秀必备的轻量级 Android 滤镜库

在样例项目中,style_image_view_test module展示了如何通过xml与java操作StyleImageView。 styler_test module展示了如何使用Styler操作一个ImageView。Styler对于View和Drawable的操作类似。有关如何使用Styler操作Bitmap请查看下文使用说明。

Feature

StyleImageView支持如下10种风格,但对比度(Saturation)风格的图片没有给出,因为需要一个输入值。注意你可以在这些风格之上添加亮度和对比度。

风格模式 海滩 房子与船
Original 无风格
Grey Scale 灰度
Invert 反转
RGB to BGR RB通道反转
Sepia 老照片
Black & White 纯黑白
Bright 明亮
Vintage Pinhole 针孔
Kodachrome 柯达
Technicolor 染印

推荐一些组合:

  • Invert 反转 + (150 亮度) + (2.0F 对比度)
  • Sepia 老照片 + (-100 亮度) + (2.0F 对比度)
  • Kodachrome 柯达 + (-75 亮度) + (1.6F 对比度)

可以从示例程序中找到你想要的组合!

使用方式

重要属性

  • Mode 风格模式:你想要实现的风格,包含如下选项:

    1. Saturation 对比度模式
    2. Grey Scale 灰度模式,即常见的黑白照片
    3. Invert 色彩反转
    4. RGB To BGR 将Red与Blue两个颜色通道反转,可理解为另一种色彩翻转
    5. Sepia 老照片
    6. Black And White 硬像,纯黑白,没有灰色
    7. Bright 明亮
    8. Vintage Pinhole 针孔
    9. Kodachrome 柯达
    10. Technicolor 染印
    11. None 无风格,为Mode属性默认值
  • Brightness 亮度:int型,范围[-255,255],取0时没有效果,默认值为0。

  • Contrast 对比度:float型,范围[0, +∞),取1.0时没有效果,默认值1.0。
  • Saturation 饱和度:float型,范围[0, +∞),取1.0时没有效果,默认值1.0。
  • EnableAnimation:是否开启动画,开启时必须给出动画时长(AnimationDuration),可选择给出差值器(Interpolator)。
  • AnimationDuration:动画时长,当关闭动画时会自动重置时长为0。默认值0。

注意:Saturation(饱和度)是单独的一种模式,不可作用于其他模式之上。调用setSaturation()会自动将模式更改。如果在xml中设置了Saturation,而又设置了Mode且不是saturation,就会报错。

库中许多方法提供了文档注释,必要时请参考源码。

StyleImageView使用方式

xml属性

  • style: 枚举类型,默认值为none。
  • brightness:int 整形,默认值为0。
  • contrast:float 浮点型,默认值为1.0。
  • saturation:float 浮点型,默认值为1.0。
  • enable_animation:boolean 布尔型,默认值为false。
  • animation_duration:int 整形(在java中转换为long类型),默认值为0。

注意:如果设置了animation_duration,enable_animation必须设为true,不然会报错。

Java代码

//简单示例StyleImageViewstyleImageView=(StyleImageView)this.findViewById(R.id.image); styleImageView.setMode(Styler.Mode.SEPIA) .setBrightness(50) .setContrast(0.8) .enableAnimation(500L,newlinearInterpolator())//第一个参数是动画时长,第二个差值器可选.setAnimationLisnter(listener)//设置动画监听器,类型为Styler.AnimationListener.updateStyle();//调用updateStyle()更新UI//updateStyle()之前调用的set方法不区分顺序。styleImageView.getMode(); styleImageView.getBrightess(); styleImageView.getContrast(); styleImageView.getSaturation(); styleImageView.isAnimationEnabled(); styleImageView.getAnimationDuration();//获取当前Bitmap,可以指定长宽,否则使用drawable或view的尺寸。styleImageView.getBitmap([intwidth,intheight]);//设置风格,如果参数不是Styler.Mode.SATURATION,但之前设置了saturation,则saturation会被重置为1.0styleImageView.setMode(intStyle.Mode.*); styleImageView.setBrightness(intbrightness); styleImageView.setContrast(floatcontrast);//调用本方法会自动将风格设置为SATURATIONstyleImageView.setSaturation(floatsaturation);//必须传入时长,可选传入差值器。//当设置新的时长时也需要调用本方法。styleImageView.enableAnimation(longduration[,Interpolatorinterpolator]);//关闭动画。会自动重置动画时长和差值器。styleImageView.disableAnimation(); styleImageView.updateStyle();//更新UI//清除所有效果,重置Mode为NONE,重置saturation为1.0,不会重置其他属性。styleImageView.clearStyle();//给动画设置监听器。如果动画处于关闭状态,监听器方法不会执行。//监听器会在动画开始、更新与结束时收到回调。//如果之前设置了监听器,调用本方法会清除原先的监听器。styleImageView.setAnimationListener(Styler.AnimationListenerlistener);//清除AnimationListener并将其返回styleImageView.removeAnimationListener();

Styler使用方式

Styler可以操作ImageView、View、Drawable和Bitmap。对于前三者Styler最终都是在操作Drawable,一旦Styler被构造,就不能再改变操作的对象了。Styler对Bitmap只提供两个静态方法来设置风格。

简单样例

ImageViewimageView=findViewById(R.id.image);Stylerstyler=newStyler.Builder(imageView,Styler.Mode.TECHNICOLOR) .enableAnimation(1000L) .build(); styler.updateUI();//将图片更新为Technicolor//重新设置风格、亮度并更新UI。styler.setMode(Styler.Mode.BLACK_AND_WHITE).setBrightness(100).updateUI();

初始化

Styler没有公有的构造方法,你需要使用Styler.Builder类来构建Styler对象。

简单样例

ImageViewimageView=(ImageView)this.findViewById(R.id.image);Stylerstyler=newStyler.Builder(imageView,Styler.Mode.SEPIA) .enableAnimation(500L) .setContrast(1.5F) .build();

Styler.Builder方法:

//Styler.Builder构造方法,你可以传入ImageViews/Views/Drawables//如需知道Styler具体工作机制请参考源代码//注意在Builder中不能再次设置构造方法中的两个参数Styler.Builderbuilder=newStyler.Builder(View|ImageView|Drawable, mode);//setters//开启动画,必须传入动画时长,可选传入差值器builder.enableAnimation(longanimationDuration[,Interpolatorinterpolator]);//关闭动画,自动重置时长为0,差值器为nullbuilder.disableAnimation(); builder.setBrightness(intbrightness); builder.setContrast(floatcontrast);//调用本方法时会自动将模式设为SATURATIONbuilder.setSaturation(floatsaturation);//设置动画监听器。如果动画没有开启,则不会触发监听器的回调。//监听器会在动画开始、更新与结束时收到回调。//如果之前设置了监听器,调用本方法会清除原先的监听器。builder.setAnimationListener(Styler.AnimationListenerlistener);//构造Styler对象。builder.build();

Styler methods

Styler方法包含上文列举的StyleImageView的所有方法,以及下面几个操作Bitmap与获取Drawable的方法。

//返回styler当前正在操作的drawable对象styler.getDrawable();//Styler静态方法,对Bitmap快速添加风格//brightness, contrast, saturation为可选参数,具体参考上文的默认值//如果mode不是Saturation,而saturation不是1.0,因为saturation为单独的模式,有冲突,会报错Styler.addStyleToBitmap(Contextcontext,Bitmapbitmap,intmode[,intbrightness,floatcontrast,floatsaturation]);

Styler.AnimationListener

//三个回调方法:onAnimation Start();//动画开始时触发//动画更新时触发,timeFraction指时间上动画进行程度,而progress指动画实际进度。//当没有通过enableAnimation()方法设置Interpolator或是设置了LinearInterpolator时,timeFraction和progress是一样的。//progress是Interpolator根据timeFraction计算出的结果。onAnimationUpdate(floattimeFraction,floatprogress); onAnimationEnd();//动画结束时触发

查看更多关于【Android开发】的文章

展开全文
相关推荐
反对 0
举报 0
评论 0
图文资讯
热门推荐
优选好物
更多热点专题
更多推荐文章
AsyncTask 工作原理(上)
AsyncTask 是一种轻量级是异步任务类,它可以在线程池中执行后台任何,将执行的进度和最终结果传递给主线程,并在主线程中更新UI。AsyncTask 是一个抽象类,其构造函数//Params:传入doInBackground 中的参数类型//Progress: 后台执行进度的类型,传入onProgre

0评论2016-11-10163

vysor 原理以及 Android 同屏方案
vysor是一个免root实现电脑控制手机的chrome插件,目前也有几款类似的通过电脑控制手机的软件,不过都需要root权限,并且流畅度并不高。vysor没有多余的功能,流畅度也很高,刚接触到这款插件时我惊讶于它的流畅度以及免root,就一直对它的实现原理很感兴趣。

0评论2016-10-13222

Picasso 解析 (1)- 一张图片是如何加载出来的
前言Picasso是JakeWharton大神在github上的一个开源图片加载框架,使用起来极其方便,甚至只需要一行代码就可以搞定图片加载:Picasso.with(context).load(http://i.imgur.com/DvpvklR.png).into(imageView);具体如何使用该框架我就不在这里赘述了,大家可以

0评论2016-10-04251

Android 图片缓存之初识 Glide(三)
前言:前面总结学习了图片的使用以及Lru算法,今天来学习一下比较优秀的图片缓存开源框架。技术本身就要不断的更迭,从最初的自己使用SoftReference实现自己的图片缓存,到后来做电商项目自己的实现方案不能满足项目的需求改用Afinal,由于Afinal不再维护而选

0评论2016-08-3091

Android编程实现擦除Bitmap中某一块的方法
这篇文章主要介绍了Android编程实现擦除Bitmap中某一块的方法,涉及Android操作Bitmap颜色像素值调整的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下

0评论2015-11-2588

android中Bitmap用法(显示,保存,缩放,旋转)实例分析
这篇文章主要介绍了android中Bitmap用法,以实例形式较为详细的分析了android中Bitmap操作图片的显示、保存、缩放、旋转等相关技巧,需要的朋友可以参考下

0评论2015-11-08152

Android生成带圆角的Bitmap图片
这篇文章主要介绍了Android生成带圆角的Bitmap图片,涉及Android通过Canvas实现绘制带圆角的图片相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下

0评论2015-09-13127

Afianl框架里面的FinalBitmap加载网络图片
这篇文章主要介绍了Afianl框架里面的FinalBitmap加载网络图片的相关资料,需要的朋友可以参考下

0评论2015-09-11124

Android Bitmap详细介绍
Android中Bitmap的常见操作整理一览,需要的朋友可以参考下

0评论2015-09-07112

Android界面 NotificationManager使用Bitmap做图标
Android界面 NotificationManager使用Bitmap做图标,如何实现呢,本文将介绍解决方法,需要的朋友可以参考下

0评论2015-09-05120

基于android示例程序(bitmapfun) 高效加载图片让人无语地方
尝试了使用git上的一个开源项目afinal(bitmapfun的封装版)来加载图片,但是在测试的时候发现了一个问题,新的图片加载器(bitmapfun)比之前用的ImageDownloader要慢很多,特别是在网络状况不好的时候,那简直是太让人无语了

0评论2015-08-2475

更多推荐