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 | 裁剪区域的组合方式 |
范例
-
创建一个 空的 Android 项目
cn.twle.android.ClipRect
-
自定义一个 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(); } }
-
修改
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