Android Canvas clipRect() 矩形裁剪

我们继续学习 Android Canvas (画板) 相关的知识,本章节我们将介绍 Canvas 裁剪 ( clip ) 相关的方法 clipPath()clipRect()clipRegion()

方法 介绍
clipRect() 矩形裁剪
clipPath() 路径裁剪,可以是开放或闭合的曲线,线构成的复杂的集合图形
clipRegion() 废弃 区域组合裁剪,比如可以将两个区域相加,相减,合并等

注意

Android Canvas clipXxx() 裁剪方法针对的不是图形,是在画图前进行的,如果画图后再对 Canvas 进行 Clip 的话将不会影响到已经画好的图形

clipRect()

clipRect() 提供了七个重载方法

boolean clipRect(RectF rect)
boolean clipRect(Rect rect)
boolean clipRect(int left, int top, int right, int bottom)
boolean clipRect(float left, float top, float right, float bottom)

下面三个在 (API 26+) 中被废弃,不建议使用

boolean clipRect(Rect rect, Region.Op op)
boolean clipRect(RectF rect, Region.Op op)
clipRect(float left, float top, float right, float bottom, Region.Op op)

其实废掉的意思就是废弃 Region.Op 参数,既然废弃了,就不多讲了

参数说明

参数 说明
rect Rect 对象,用于定义裁剪区的范围,Rect 和 RectF 功能类似,精度和提供的方法不同而已
left 矩形裁剪区的左边位置
top 矩形裁剪区的上边位置
right 矩形裁剪区的右边位置
bottom 矩形裁剪区的下边位置
op 裁剪区域的组合方式

范例

  1. 创建一个 空的 Android 项目 cn.twle.android.ClipRect

  2. 自定义一个 View 类 MsView.java

    package cn.twle.android.cliprect;
    
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.util.AttributeSet;
    import android.view.View;
    
    public class MsView extends View{
    
        private Bitmap mBitmap = null;
        private int limitLength = 0;
        private int width;
        private int heigth;
        private Paint mPaint;
        private static final int CLIP_HEIGHT = 50;
    
        public MsView(Context context) {
            this(context, null);
        }
    
        public MsView(Context context, AttributeSet attrs) {
            super(context, attrs);
            mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.meimei_160x360);
            limitLength = width = mBitmap.getWidth();
            heigth = mBitmap.getHeight();
        }
    
        public MsView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
    
            mPaint = new Paint();
            mPaint.setAntiAlias(true);
            mPaint.setColor(Color.BLACK);
            mPaint.setTextSize(60);
    
            canvas.translate(300,300);
    
            //设置显示范围
            canvas.clipRect(100, 100, 500, 300);
    
            //白色背景              
            canvas.drawColor(Color.WHITE);
    
            //绘制字符串                   
            canvas.drawText("简单教程,简单编程", 150, 300, mPaint); 
            invalidate();
        }
    }
    
  3. 修改 MainActivity.java 设置 setContentView(new MsView(MainActivity.this))

    package cn.twle.android.cliprect;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    
    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            setContentView(new MsView(MainActivity.this));
        }
    }
    

从范例中可以看到 clipRect() 会受 Canvas 变换的影响,白色区域是不花的区域,所以 clipRect() 裁剪的是画布

而我们的绘制是在这个裁剪后的画布上进行的,超过该区域的不显示

官方 API 文档Canvas

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.