1. 程式人生 > >Android自定義控制元件-不同形狀的ImageView

Android自定義控制元件-不同形狀的ImageView

這裡寫圖片描述

實現分析:
依然是用到Paint的圖層混合模式,
1、畫一個你想要的形狀 || 圖片
2、修改Paint的圖層混合模式,畫圖片。
3、然後就能得到你想要的形狀的ImageView

paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));設定模式
這2種模式都可以很簡單的實現
SRC_IN:在兩者相交的地方繪製源影象,並且繪製的效果會受到目標影象透明度的影響;
DST_IN :在兩者相交的地方繪製目標影象,並且繪製的效果會受到源影象透明度的影響;

主要程式碼:

package com.example.roundimageview;

import
android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.PorterDuff.Mode; import android.graphics.PorterDuffXfermode; import android.graphics.Rect; import
android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.util.AttributeSet; import android.widget.ImageView; /* * 圓形ImageView的實現 * 1,先畫一個圓 * 2.修改Paint的圖層混合模式 * 3.最後在畫Bitmap */ public class MyImageView extends ImageView { public MyImageView(Context context, AttributeSet attrs) { super
(context, attrs); // TODO Auto-generated constructor stub } @Override protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub //得到Drawable物件 Drawable drawable = getDrawable(); if (drawable == null) { return; } if (getWidth() == 0 || getHeight() == 0) { return; } // 得到圖片 Bitmap b = ((BitmapDrawable) drawable).getBitmap(); if (b == null) { return; } Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true); int w = getWidth(), h = getHeight(); int diameter = w >= h ? h : w; Bitmap roundBitmap = getCroppedBitmap(bitmap, diameter); canvas.drawBitmap(roundBitmap, 0, 0, null); } /* * 獲取圓形圖片 1.需要圖片 2.圖片寬高 */ private Bitmap getCroppedBitmap(Bitmap bmp, int radius) { Bitmap sbmp; if (bmp.getWidth() != radius || bmp.getHeight() != radius) sbmp = Bitmap.createScaledBitmap(bmp, radius, radius, false); else sbmp = bmp; Bitmap output = Bitmap.createBitmap(sbmp.getWidth(), sbmp.getHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(output); final int color = 0xffa19774; final Paint paint = new Paint(); final Rect rect = new Rect(0, 0, sbmp.getWidth(), sbmp.getHeight()); // 設定為true,則影象在動畫進行中會濾掉對Bitmap影象的優化操作 // paint.setFilterBitmap(true); // paint.setDither(true); canvas.drawARGB(0, 0, 0, 0); paint.setAntiAlias(true); paint.setColor(Color.WHITE); // 繪製目標圖層 canvas.drawCircle(sbmp.getWidth() / 2, sbmp.getHeight() / 2, sbmp.getWidth() / 2 - 6f, paint); // 設定混合模式:在兩者相交的地方繪製源影象 paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN)); // 繪製源圖層 canvas.drawBitmap(sbmp, rect, rect, paint); // 繪製邊框 drawCircleBorder(canvas, sbmp.getWidth() / 2 - 6f, color, sbmp.getWidth() / 2, sbmp.getHeight() / 2); return output; } // 外圓 private void drawCircleBorder(Canvas canvas, float radius, int color, float defaultWidth, float defaultHeight) { Paint paint = new Paint(); // 去鋸齒 paint.setAntiAlias(true); // 外圓顏色 paint.setColor(Color.BLACK); // 設定paint的 style 為STROKE:空心 paint.setStyle(Paint.Style.STROKE); // 設定paint的寬度 paint.setStrokeWidth(6.0f); canvas.drawCircle(defaultWidth, defaultHeight, radius, paint); } }

原始碼下載