Android自定義控制元件-不同形狀的ImageView
阿新 • • 發佈:2018-11-30
實現分析:
依然是用到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);
}
}