android消除锯齿原理分析
2016-03-09 15:28
302 查看
前言
在Android中view绘画是很重要的一点,当view重写、surfaceView重写,都会涉及到如何把一个视图画的完美、边角不在毛躁躁,下面会从原来、业务场景、防锯齿、防锯齿实现原理。一、锯齿的原由:
1. 业务场景
1.Android画圆形视图如:用户头像圆形的。
2.还有像柱状图等,这个有开源组件hellocharts-android、MPAndroidChart等开源组件,原理知道后也可以自定义。
3.在用View的RotateAnimation做动画时候,如果View当中包含有大量的图形,也会出现锯齿。
4.自定义view画字体情况,new
paint()的方法来设置字体的参数。
5.后续再补。
2. 起因
1.其实原来有时候很多时候被忽略,其实ps么一个像素都是一个小方形。那么如果画边圆就的要通过防锯齿效果来处理。2.第二点系统、机器绘画性能相关。
二、防锯齿实现
1.Paint来设置
首先在你的构造函数中,需要创建一个Paint。 Paint mPaint = new Paint(); 然后,您需要设置两个参数: //防止边缘的锯齿 mPaint.setAntiAlias(); //用来对位图进行滤波处理 mPaint.setFileterBitmap(true);
2.通过Canvas设置
canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG));
3.RotateAnimation设置
在您的构造函数中,创建一个Paint滤波器。PaintFlagsDrawFilter mSetfil = new PaintFlagsDrawFilter(0, Paint.FILTER_BITMAP_FLAG);第一个参数是你要清除的标志位,第二个参数是你要设置的标志位。此处设置为对位图进行滤波。
当你在画图的时候,如果是View则在onDraw当中,如果是ViewGroup则在dispatchDraw中调用如下函数。
canvas.setDrawFilter( mSetfil );
4.Xfermode的使用
在这里看到这个其实很诧异,不过首先要明白AvoidXfermode指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图)。PixelXorXfermode 当覆盖已有的颜色时,应用一个简单的像素XOR操作。PorterDuffXfermode
这是一个非常强大的转换模式,使用它,可以使用图像合成的16条Porter-Duff规则的任意一条来控制Paint如何与已有的Canvas图像进行交互,在实际开发的时候用这个可以实现水波纹、覆盖、渐变等效果都能实现。
private PorterDuffXfermode xfermode=new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY);
canvas.setDrawFilter(pdf);
canvas.drawBitmap(mDstB, 0, 0, paint);
paint.setXfermode(xfermode);
三、防锯齿实现原理分析
1.setAntiAlias的分析
Helper for setFlags(), setting or clearing the ANTI_ALIAS_FLAG bit * AntiAliasing smooths out the edges of what is being drawn, but is has * no impact on the interior of the shape. See setDither() and * setFilterBitmap() to affect how colors are treated. *
根据api上的需要配合void setFlags (Paint.ANTI_ALIAS_FLAG) 来帮助消除锯齿使其边缘更平滑。setAntiAlias会使绘图速度变慢,并通过多次绘画算法使得边缘更加细腻。
2.setFileterBitmap的分析
此方法就是一个过滤器,如果该项设置为true,则图像在动画进行中会滤掉对Bitmap图像的优化操作,加快渲染图片。/** * Helper for setFlags(), setting or clearing the FILTER_BITMAP_FLAG bit. * Filtering affects the sampling of bitmaps when they are transformed. * Filtering does not affect how the colors in the bitmap are converted into * device pixels. That is dependent on dithering and xfermodes. * * @param filter true to set the FILTER_BITMAP_FLAG bit in the paint's * flags, false to clear it. */
上面话的意思就是要依靠setFlags()来设置清楚标记位。
3.setDrawFilter的分析
public void setDrawFilter(@Nullable DrawFilter filter) { long nativeFilter = 0; if (filter != null) { nativeFilter = filter.mNativeInt; } mDrawFilter = filter; nativeSetDrawFilter(mNativeCanvasWrapper, nativeFilter); }
上面这段代码意思就是设置一个drawFilter对象,drawFilter就是一个过滤器,这个底层实现就是保证图片正确绘画。
相关文章推荐
- Android Studio 错误:找不到符号
- Android 吸入动画效果详解
- android 动态设置控件长度宽度
- Android 补间动画使用记录
- Android实现数据存储技术
- android 动态获取图片宽度
- Fresco引起的在arm64位机器上找不到对应的so库
- android 根据坐标获取RGB
- Android_推送技术研究
- Robotium是什么?
- GIthub上一百个优秀的Android开源项目
- Error retrieving parent for item: No resource found that matches the given name 'android:Theme....
- Android SurfaceView学习
- 【SettingsProvider】修改系统初始化时默认时区
- Android中静态成员变量的生命周期
- GIT@OSC中托管Android studio代码
- GitHub Android Librarys Top 100 简介
- GitHub Android Librarys Top 100 简介
- Android上替代SQLite的选择:Realm
- [volley文件上传]Android中自定义MultipartEntity实现文件上传以及使用Volley库实现文件上传