1. 程式人生 > >安卓自定義上面圓角下面直角的RoundCornerImageView

安卓自定義上面圓角下面直角的RoundCornerImageView

下面是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>

執行效果圖: