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

來源:互聯網
上載者:User

        圓角矩形圖片在蘋果的產品中很流行,相比於普通的矩形,很多人都喜歡圓角矩形的圖片,因為它避開了直角的生硬,帶來更好的使用者體驗,下面是幾個設計的例子:




下面在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;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.