其功能是将画布进行旋转,达到画布上的图像成旋转的效果。
1. 利用clipRect功能是建立一个裁剪区,
2. 保存canvas状态
3. 将该裁剪区进行旋转
4. 进行画布上的操作(必须在3之后)
5. 恢复canvas状态
注意:在做显示的Canvas中进行裁剪时,你的显示区域将是你的裁剪区域
效果图:
- public class ClipRotateView extends View implements Runnable {
- Paint paint;
- float rote = 0f;
- public ClipRotateView(Context context) {
- super(context);
- paint = new Paint();
- paint.setAntiAlias(true);
- new Thread(this).start();
- }
- @Override
- protected void onDraw(Canvas canvas) {
- super.onDraw(canvas);
- if (canvas == null)
- canvas = new Canvas();
- canvas.drawColor(Color.DKGRAY);
- paint.setColor(Color.RED);
- // 建立裁剪区域,该处决定了可以显示的内容,
- // 当处理图片时,可以只裁剪部分区域,这里是为了把当前画布的的内容都显示出来
- // 所以裁剪全部
- canvas.clipRect(0, 0, getWidth(), getHeight());
- // 操作之前进行画布状态的保存
- canvas.save();
- //旋转画面,必须放在画矩形之前
- // canvas.rotate(rote),则是绕(0,0)旋转
- canvas.rotate(rote, 100, 100);
- //画矩形
- canvas.drawRect(100, 100, 200, 150, paint);
- // 操作完成之后进行恢复
- canvas.restore();
- //画另外两个图形
- paint.setColor(Color.BLUE);
- canvas.drawRect(180,100, 280,150, paint);
- paint.setColor(Color.GREEN);
- Path path = new Path();
- path.moveTo(100, 280);
- path.lineTo(100 + 50, 280);
- path.lineTo(100 + 30, 280 + 50);
- path.lineTo(100 + 20, 280 + 50);
- path.close();
- canvas.drawPath(path, paint);
- }
- // 进行360度的旋转
- @Override
- public void run() {
- while (!Thread.currentThread().isInterrupted()) {
- try {
- if (rote > 360) {
- rote = 0;
- } else {
- rote += 5;
- }
- Thread.sleep(100);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- postInvalidate();
- }
- }
- }