下面是RoundCornerImageView的代碼:
package com.example.roundcornerviewgroup;
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.Path;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.widget.ImageView;
/**
* 主要有兩種方式實作,Xfermode方式和bitmapShader方式
* Xfermode
* @author wbl
*
*/
public class RoundCornerImageView extends ImageView{
private Paint mPaint;
private Paint mPaint2;
private int roundHeight = 20;
private int roundWidth = 20;
public RoundCornerImageView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
}
public RoundCornerImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public RoundCornerImageView(Context context) {
super(context);
}
private void init() {
mPaint = new Paint();
mPaint.setColor(Color.WHITE);
mPaint.setAntiAlias(true);
//16種狀态
mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OUT));
mPaint2 = new Paint();
mPaint2.setXfermode(null);
}
@Override
public void onDraw(Canvas canvas) {
Bitmap bitmap = Bitmap.createBitmap(getWidth(), getHeight(), Config.ARGB_8888);
Canvas canvas2 = new Canvas(bitmap);
super.onDraw(canvas2);
drawLeftUp(canvas2);
drawRightUp(canvas2);
// drawLeftDown(canvas2);
// drawRightDown(canvas2);
canvas.drawBitmap(bitmap, 0, 0, mPaint2);
bitmap.recycle();
}
private void drawLeftUp(Canvas canvas) {
Path path = new Path();
path.moveTo(0, roundHeight);
path.lineTo(0, 0);
path.lineTo(roundWidth, 0);
//arcTo的第二個參數是以多少度為開始點,第三個參數-90度表示逆時針畫弧,正數表示順時針
path.arcTo(new RectF(0,0,roundWidth*2,roundHeight*2),-90,-90);
path.close();
canvas.drawPath(path, mPaint);
}
private void drawLeftDown(Canvas canvas) {
Path path = new Path();
path.moveTo(0, getHeight()-roundHeight);
path.lineTo(0, getHeight());
path.lineTo(roundWidth, getHeight());
path.arcTo(new RectF(0,getHeight()-roundHeight*2,0+roundWidth*2,getHeight()),90,90);
path.close();
canvas.drawPath(path, mPaint);
}
private void drawRightDown(Canvas canvas) {
Path path = new Path();
path.moveTo(getWidth()-roundWidth, getHeight());
path.lineTo(getWidth(), getHeight());
path.lineTo(getWidth(), getHeight()-roundHeight);
path.arcTo(new RectF(getWidth()-roundWidth*2,getHeight()-roundHeight*2,getWidth(),getHeight()), 0, 90);
path.close();
canvas.drawPath(path, mPaint);
}
private void drawRightUp(Canvas canvas) {
Path path = new Path();
path.moveTo(getWidth(), roundHeight);
path.lineTo(getWidth(), 0);
path.lineTo(getWidth()-roundWidth, 0);
path.arcTo(new RectF(getWidth()-roundWidth*2,0,getWidth(),0+roundHeight*2),-90,90);
path.close();
canvas.drawPath(path, mPaint);
}
}
下面是布局代碼:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#50000000"
android:gravity="center_horizontal"
android:padding="10dp"
tools:context=".MainActivity" >
<LinearLayout
android:layout_width="350dp"
android:layout_height="wrap_content"
android:orientation="vertical" >
<com.example.roundcornerviewgroup.RoundCornerImageView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scaleType="centerCrop"
android:src="@drawable/d" />
<TextView
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="#fff"
android:gravity="center"
android:text="center" />
<View
android:layout_width="match_parent"
android:layout_height="0.2dp" />
<TextView
android:layout_width="match_parent"
android:layout_height="50dp"
android:background="@drawable/bottom"
android:gravity="center"
android:text="Bottom" />
</LinearLayout>
</RelativeLayout>
運作效果圖: