android消除锯齿原理分析

原文地址:https://blog.csdn.net/Apple_hsp/article/details/50833300


前言

在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来设置

[java]  view plain  copy
  1. 首先在你的构造函数中,需要创建一个Paint。   
  2. Paint mPaint = new Paint();   
  3. 然后,您需要设置两个参数:  
  4. //防止边缘的锯齿  
  5. mPaint.setAntiAlias();  
  6. //用来对位图进行滤波处理  
  7. mPaint.setFileterBitmap(true);  

2.通过Canvas设置

[java]  view plain  copy
  1. 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图像进行交互,在实际开发的时候用这个可以实现水波纹、覆盖、渐变等效果都能实现。

[java]  view plain  copy
  1. private PorterDuffXfermode xfermode=new PorterDuffXfermode(PorterDuff.Mode.MULTIPLY);  
  2. canvas.setDrawFilter(pdf);  
  3. canvas.drawBitmap(mDstB, 00, paint);  
  4. 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就是一个过滤器,这个底层实现就是保证图片正确绘画。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值