페인트 API - MaskFilter(마스크)


이 섹션 소개:

Android 튜토리얼 기본 소개 - 8.3.1 세 가지 그리기 도구 클래스에 대한 자세한 설명에는 Paint 메서드에 다음과 같은 메서드가 있습니다.

setMaskFilter(MaskFilter 마스크 필터) : MaskFilter를 설정하면 다양한 MaskFilter를 사용하여 필터링, 입체 등과 같은 필터 효과를 얻을 수 있습니다! 우리는 일반적으로 이 MaskFilter를 직접 사용하지 않지만 두 개의 하위 클래스를 사용합니다:

BlurMaskFilter: 페인트의 가장자리를 처리하기 위해 흐림 스타일과 반경을 지정합니다.

EmbossMaskFilter: 광원의 방향과 주변광 강도를 지정하여 엠보싱 효과를 추가합니다. 예시를 작성해 보도록 하겠습니다~!

공식 API 문서:
EmbossMaskFilter;

1.BlurMaskFilter(흐림 효과)

필터 스테레오는 무엇인가요? 진짜 지식:

코드 예시
:

렌더링 실행

:

1.png구현 코드

:

여기서 사용자 정의 뷰를 생성하고 그 안에서 도면을 완성합니다!

BlurMaskFilterView.java
:

/**
 * Created by Jay on 2015/10/21 0021.
 */
public class BlurMaskFilterView extends View{

    public BlurMaskFilterView(Context context) {
        super(context);
    }

    public BlurMaskFilterView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public BlurMaskFilterView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onDraw(Canvas canvas) {

        BlurMaskFilter bmf = null;
        Paint paint=new Paint();
        paint.setAntiAlias(true);          //抗锯齿
        paint.setColor(Color.RED);//画笔颜色
        paint.setStyle(Paint.Style.FILL);  //画笔风格
        paint.setTextSize(68);             //绘制文字大小,单位px
        paint.setStrokeWidth(5);           //画笔粗细

        bmf = new BlurMaskFilter(10f,BlurMaskFilter.Blur.NORMAL);
        paint.setMaskFilter(bmf);
        canvas.drawText("最喜欢看曹神日狗了~", 100, 100, paint);
        bmf = new BlurMaskFilter(10f,BlurMaskFilter.Blur.OUTER);
        paint.setMaskFilter(bmf);
        canvas.drawText("最喜欢看曹神日狗了~", 100, 200, paint);
        bmf = new BlurMaskFilter(10f,BlurMaskFilter.Blur.INNER);
        paint.setMaskFilter(bmf);
        canvas.drawText("最喜欢看曹神日狗了~", 100, 300, paint);
        bmf = new BlurMaskFilter(10f,BlurMaskFilter.Blur.SOLID);
        paint.setMaskFilter(bmf);
        canvas.drawText("最喜欢看曹神日狗了~", 100, 400, paint);
        
        setLayerType(View.LAYER_TYPE_SOFTWARE, null);     //关闭硬件加速
    }
}
좋아, 위의 코드 예제에서 우리는 이 BlurMaskFilter를 사용한다는 것을 알 수 있습니다. 생성자 메서드에서 인스턴스화합니다.

BlurMaskFilter(10f,BlurMaskFilter.Blur.NORMAL);

우리가 제어할 수 있는 것은 다음 두 매개변수입니다.

첫 번째 매개변수

: 흐림 가장자리의 반경을 지정합니다.

두 번째 매개변수

: 흐림 스타일을 지정합니다. 선택 값은 다음과 같습니다.

BlurMaskFilter.Blur.

NORMAL
    : 내부 및 외부 Blur
  • BlurMaskFilter.Blur.OUTER
  • : 외부 Blur
  • BlurMaskFilter.Blur. INNER
  • : 내부 흐림
  • BlurMaskFilter.Blur.SOLID
  • : 내부 굵게, 외부 흐림
  • 아직 약간 불분명할 수 있습니다. 시도해 볼 사진을 찾아보세요.

여기서 흐림 반경을 수정합니다. 50이 되면 더욱 확실해집니다~2.png

2.EmbossMaskFilter(엠보싱 효과)


제목처럼 주변 광원의 방향과 강도를 지정하여 엠보싱 효과를 추가해 보겠습니다. 효과를 확인하는 예:

코드 샘플
:

렌더링 실행

:

3.png구현 코드

:

/**
 * Created by Jay on 2015/10/22 0022.
 */
public class EmbossMaskFilterView extends View{

    public EmbossMaskFilterView(Context context) {
        super(context);
    }

    public EmbossMaskFilterView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public EmbossMaskFilterView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        float[] direction = new float[]{ 1, 1, 3 };   // 设置光源的方向
        float light = 0.4f;     //设置环境光亮度
        float specular = 8;     // 定义镜面反射系数
        float blur = 3.0f;      //模糊半径
        EmbossMaskFilter emboss=new EmbossMaskFilter(direction,light,specular,blur);

        Paint paint = new Paint();
        paint.setAntiAlias(true);          //抗锯齿
        paint.setColor(Color.BLUE);//画笔颜色
        paint.setStyle(Paint.Style.FILL);  //画笔风格
        paint.setTextSize(70);             //绘制文字大小,单位px
        paint.setStrokeWidth(8);           //画笔粗细
        paint.setMaskFilter(emboss);

        paint.setMaskFilter(emboss);
        canvas.drawText("最喜欢看曹神日狗了~", 50, 100, paint);


        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_bg_meizi1);
        canvas.drawBitmap(bitmap, 150, 200, paint);

        setLayerType(View.LAYER_TYPE_SOFTWARE, null);     //关闭硬件加速
    }
}

렌더링에서 EmbossMaskFilter의 일부 효과를 볼 수 있습니다. 빛을 수정하여 릴리프 효과를 형성합니다~소녀의 사진이 뚜렷하지 않습니다. 텍스트는 질감을 매우 명확하게 보여줍니다! BlurMaskFilter와 마찬가지로 관련 설정은 생성 방법에서 수행됩니다!

EmbossMaskFilter(float[] 방향, 부동 주변, 부동 반사, 부동 BlurRadius)매개변수는 다음과 같습니다.

direction: 부동 소수점 배열, x, y, z 축의 광원 방향을 제어하는 ​​데 사용됩니다

ambient: 주변광 밝기를 0에서 1 사이로 설정합니다.

specular: 정반사 계수

blurRadius: Blur radius

이 값을 수정하고 다른 효과를 시도해 볼 수 있습니다. 예를 들어 I 위를 수정하면 또 다른 효과가 있습니다.

//명확성을 위해 녹색으로 변경됩니다.

4.png


3. 참고

MaskFilter를 사용할 때 targetSdkVersion >에 주의하세요. ; = 14, 마스크필터 이는 Android가 API 14 이상 버전에서 기본적으로 하드웨어 가속을 켜기 때문입니다. GPU의 특성을 이용하면 그리기가 더 매끄러워지지만 메모리를 더 많이 소모하게 됩니다! 좋습니다. 하드웨어 가속을 끄겠습니다. 괜찮습니다. 다양한 수준에서 하드웨어 가속을 켜거나 끌 수 있습니다. 일반적으로 꺼집니다~

  • Application: 구성 파일의 애플리케이션 노드에 추가합니다. android:hardwareAccelerated="true"
  • Activity: 구성 파일의 활동 노드에 추가합니다. android:hardwareAccelerated="false"
  • View: View 객체를 얻은 후 호출되거나 View의 onDraw() 메서드에서 직접 설정됩니다. view.setLayerType(View.LAYER_TYPE_HARDWARE, null);

샘플 코드 다운로드:

MaskFilterDemo.zip


이 섹션 요약:

이 섹션에서는 Paint, set의 API를 보여줍니다. 마스크필터(MaskFilter 마스크 필터), 배웠습니다 MaskFilter의 두 하위 클래스인 BlurMaskFilter(흐림 효과) 및 EmbossMaskFilter(부조 효과)의 기본 사용법 비교적 간단합니다. 더 자세히 알아보면 고급 부분에서 컨트롤을 사용자 정의하는 데 문제가 없을 것입니다. 그게 전부입니다. 감사합니다~5.gif

그런데 SDK의 예제에 이 두 가지 사용법을 보여주는 클래스가 실제로 있다는 사실을 언급하는 것을 깜빡했습니다:

samplesandroid-xxlegacyApiDemossrccomexampleandroidapisgraphics디렉토리: FingerPaint.javaFile~