1. 程式人生 > >Android中繪製圓角矩形圖片及任意形狀圖片

Android中繪製圓角矩形圖片及任意形狀圖片

package com.example.phototest;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.graphics.PorterDuffXfermode;
import android.graphics.PorterDuff;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.view.Menu;
import android.widget.ImageView;

public class MainActivity extends Activity {

	private ImageView myImageView;
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		myImageView=(ImageView)findViewById(R.id.imageView1);
		Bitmap photo = BitmapFactory.decodeResource(getResources(), R.drawable.photo1);
		myImageView.setImageBitmap(createFramedPhoto(500,400,photo,20));
		//myImageView.setImageBitmap(createStarPhoto(500,400,photo));
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		getMenuInflater().inflate(R.menu.activity_main, menu);
		return true;
	}
	private Bitmap createFramedPhoto(int x, int y, Bitmap image, float outerRadiusRat) {
		//根據原始檔新建一個darwable物件
		Drawable imageDrawable = new BitmapDrawable(image);

		// 新建一個新的輸出圖片
		Bitmap output = Bitmap.createBitmap(x, y, Bitmap.Config.ARGB_8888);
		Canvas canvas = new Canvas(output);

		// 新建一個矩形
		RectF outerRect = new RectF(0, 0, x, y);

		// 產生一個紅色的圓角矩形
		Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
		paint.setColor(Color.RED);
		canvas.drawRoundRect(outerRect, outerRadiusRat, outerRadiusRat, paint);


		// 將源圖片繪製到這個圓角矩形上
		//詳解見http://lipeng88213.iteye.com/blog/1189452
		paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
		imageDrawable.setBounds(0, 0, x, y);
		canvas.saveLayer(outerRect, paint, Canvas.ALL_SAVE_FLAG);
		imageDrawable.draw(canvas);
		canvas.restore();

		return output;
	}
}
實現原理:通過在一個Canvas中繪製一個最終的輸出形狀,然後通過類似於遮罩的方式將圖形顯示出來,最終的圖片形狀就是先前繪製的圖形的形狀。具體起作用的函式是這個:
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));