圓角矩形圖片在蘋果的產品中很流行,相比於普通的矩形,很多人都喜歡圓角矩形的圖片,因為它避開了直角的生硬,帶來更好的使用者體驗,下面是幾個設計的例子:
下面在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;@Overridepublic 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));}@Overridepublic 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/1189452paint.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));
用來設定疊加模式的。通過這個原理,我能就能夠繪製各種各樣形狀的圖片,比如:
代碼:
private Bitmap createStarPhoto(int x, int y, Bitmap image){//根據源檔案建立一個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); Path path = new Path(); //繪製三角形//path.moveTo(0, 0); //path.lineTo(320, 250); //path.lineTo(400, 0); //繪製正無邊形 long tmpX,tmpY;path.moveTo(200, 200);// 此點為多邊形的起點 for(int i=0;i<=5;i++) { tmpX =(long)(200+200*Math.sin((i*72+36)*2*Math.PI/360)); tmpY =(long)(200+200*Math.cos((i*72+36)*2*Math.PI/360)); path.lineTo(tmpX, tmpY); }path.close(); // 使這些點構成封閉的多邊形 canvas.drawPath(path, paint); //canvas.drawCircle(100, 100, 100, paint);// 將源圖片繪製到這個圓角矩形上// 產生一個紅色的圓角矩形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;}