Android画布Canvas的save()和restore()以及clipRect()方法测试

MainActivity如下:

[java] view plaincopy

  1. package cn.testcanvas;
  2. import android.os.Bundle;
  3. import android.widget.ImageView;
  4. import android.app.Activity;
  5. import android.graphics.Bitmap;
  6. import android.graphics.Bitmap.Config;
  7. import android.graphics.Canvas;
  8. import android.graphics.Color;
  9. import android.graphics.Paint;
  10. import android.graphics.Rect;
  11. /**
  12.  * Demo描述:
  13.  * canvas的save()和restore()以及clipRect()方法测试
  14.  *
  15.  * Demo总结:
  16.  * 1 save()和restore()要配对使用(restore可以比save少,但不能多)
  17.  *   若restore调用次数比save多,会报错
  18.  * 2 canvas剪裁后绘制的东西只能在裁剪区域的范围能才能显示出来
  19.  *
  20.  * 参考资料:
  21.  * http://blog.csdn.net/lonelyroamer/article/details/8264189
  22.  *
  23.  *
  24.  */
  25. public class MainActivity extends Activity {
  26.     private ImageView mImageView;
  27.     private ImageView mClipedImageView;
  28.     @Override
  29.     protected void onCreate(Bundle savedInstanceState) {
  30.         super.onCreate(savedInstanceState);
  31.         setContentView(R.layout.main);
  32.         init();
  33.     }
  34.     private void init(){
  35.         mImageView=(ImageView) findViewById(R.id.imageView);
  36.         mClipedImageView=(ImageView) findViewById(R.id.clipedImageView);
  37.         //分开测试
  38.         testClip();
  39.         //testSaveAndRestore();
  40.     }
  41.     private void testClip(){
  42.         Bitmap bitmap=Bitmap.createBitmap(200, 200, Config.ARGB_8888);
  43.         Canvas canvas=new Canvas(bitmap);
  44.         canvas.drawColor(Color.GREEN);
  45.         Paint paint=new Paint();
  46.         paint.setColor(Color.YELLOW);
  47.         canvas.drawText(“绿色部分为Canvas剪切前的区域”, 20, 50, paint);
  48.         Rect rect=new Rect(10,95,180,140);
  49.         canvas.clipRect(rect);
  50.         canvas.drawColor(Color.YELLOW);
  51.         paint.setColor(Color.BLACK);
  52.         //canvas剪裁后绘制的东西只能在裁剪区域的范围能才能显示出来
  53.         canvas.drawText(“黄色部分为Canvas剪切后的区域”, 10, 110, paint);
  54.         mImageView.setImageBitmap(bitmap);
  55.         //显示截取后的Bitmap:
  56.         Bitmap newBitmap=Bitmap.createBitmap(bitmap,10,95,170,45);
  57.         mClipedImageView.setImageBitmap(newBitmap);
  58.     }
  59.     private void testSaveAndRestore(){
  60.         Bitmap bitmap=Bitmap.createBitmap(200, 200, Config.ARGB_8888);
  61.         Canvas canvas=new Canvas(bitmap);
  62.         Paint paint=new Paint();
  63.         paint.setColor(Color.RED);
  64.         paint.setTextSize(25);
  65.         canvas.rotate(15);
  66.         canvas.drawText(“Hello Android 1”, 20, 30, paint);
  67.         canvas.translate(50, 50);
  68.         //注意:save()方法
  69.         //保存在此save()方法之前的canvas的操作
  70.         //比如:roate(),translate(),clipXXX()
  71.         canvas.save();
  72.         paint.setColor(Color.GREEN);
  73.         paint.setTextSize(15);
  74.         canvas.rotate(60);
  75.         canvas.translate(-20,-20);
  76.         canvas.drawText(“Hello Android 2”, 20, 60, paint);
  77.         //注意:restore()方法
  78.         //将save()方法之后Canvas的roate(),translate(),clipXXX()的操作清空
  79.         canvas.restore();
  80.         paint.setColor(Color.BLACK);
  81.         paint.setTextSize(15);
  82.         canvas.drawText(“Hello Android 3”, 20, 70, paint);
  83.         mImageView.setImageBitmap(bitmap);
  84.     }
  85. }

main.xml如下:

[html] view plaincopy

  1. <RelativeLayout
  2.     xmlns:android=”http://schemas.android.com/apk/res/android”
  3.     xmlns:tools=”http://schemas.android.com/tools”
  4.     android:layout_width=”match_parent”
  5.     android:layout_height=”match_parent”
  6.     >
  7.     <TextView
  8.         android:id=”@+id/textView”
  9.         android:layout_width=”wrap_content”
  10.         android:layout_height=”wrap_content”
  11.         android:text=”测试Canvas”
  12.         android:layout_centerHorizontal=”true”
  13.     />
  14.     <ImageView
  15.         android:id=”@+id/imageView”
  16.         android:layout_width=”wrap_content”
  17.         android:layout_height=”wrap_content”
  18.         android:layout_below=”@id/textView”
  19.         android:layout_centerInParent=”true”
  20.      />
  21.     <ImageView
  22.         android:id=”@+id/clipedImageView”
  23.         android:layout_width=”wrap_content”
  24.         android:layout_height=”wrap_content”
  25.         android:layout_below=”@id/imageView”
  26.         android:layout_centerHorizontal=”true”
  27.         android:layout_marginTop=”15dip”
  28.      />
  29. </RelativeLayout>

标签